diff mbox

[02/37] misc: coverity fixes

Message ID 20140501231236.31890.46904.stgit@birch.djwong.org
State Accepted, archived
Headers show

Commit Message

Darrick Wong May 1, 2014, 11:12 p.m. UTC
Fix various small resource leaks and error code handling issues that
Coverity pointed out.

Fixes-Coverity-Bugs: 11919{39-45}, 1174118, 1049160, 1049144
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 debugfs/xattrs.c    |   38 ++++++++++++++++++++------------------
 lib/ext2fs/extent.c |    7 ++++---
 lib/ext2fs/punch.c  |    2 +-
 misc/create_inode.c |   34 ++++++++++++++++++++--------------
 4 files changed, 45 insertions(+), 36 deletions(-)



--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Lukas Czerner May 2, 2014, 11:17 a.m. UTC | #1
On Thu, 1 May 2014, Darrick J. Wong wrote:

> Date: Thu, 01 May 2014 16:12:36 -0700
> From: Darrick J. Wong <darrick.wong@oracle.com>
> To: tytso@mit.edu, darrick.wong@oracle.com
> Cc: linux-ext4@vger.kernel.org
> Subject: [PATCH 02/37] misc: coverity fixes
> 
> Fix various small resource leaks and error code handling issues that
> Coverity pointed out.
> 
> Fixes-Coverity-Bugs: 11919{39-45}, 1174118, 1049160, 1049144
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
>  debugfs/xattrs.c    |   38 ++++++++++++++++++++------------------
>  lib/ext2fs/extent.c |    7 ++++---
>  lib/ext2fs/punch.c  |    2 +-
>  misc/create_inode.c |   34 ++++++++++++++++++++--------------
>  4 files changed, 45 insertions(+), 36 deletions(-)
> 
> 
> diff --git a/debugfs/xattrs.c b/debugfs/xattrs.c
> index 0a29521..7109719 100644
> --- a/debugfs/xattrs.c
> +++ b/debugfs/xattrs.c
> @@ -122,26 +122,26 @@ void do_get_xattr(int argc, char **argv)
>  		default:
>  			printf("%s: Usage: %s <file> <attr> [-f outfile]\n",
>  			       argv[0], argv[0]);
> -			return;
> +			goto out2;
>  		}
>  	}
>  
>  	if (optind != argc - 2) {
>  		printf("%s: Usage: %s <file> <attr> [-f outfile]\n", argv[0],
>  		       argv[0]);
> -		return;
> +		goto out2;
>  	}
>  
>  	if (check_fs_open(argv[0]))
> -		return;
> +		goto out2;
>  
>  	ino = string_to_inode(argv[optind]);
>  	if (!ino)
> -		return;
> +		goto out2;
>  
>  	err = ext2fs_xattrs_open(current_fs, ino, &h);
>  	if (err)
> -		return;
> +		goto out2;
>  
>  	err = ext2fs_xattrs_read(h);
>  	if (err)
> @@ -153,18 +153,19 @@ void do_get_xattr(int argc, char **argv)
>  
>  	if (fp) {
>  		fwrite(buf, buflen, 1, fp);
> -		fclose(fp);
>  	} else {
>  		dump_xattr_string(stdout, buf, buflen);
>  		printf("\n");
>  	}
>  
> -	if (buf)
> -		ext2fs_free_mem(&buf);
> +	ext2fs_free_mem(&buf);
>  out:
>  	ext2fs_xattrs_close(&h);
>  	if (err)
>  		com_err(argv[0], err, "while getting extended attribute");
> +out2:
> +	if (fp)
> +		fclose(fp);
>  }
>  
>  void do_set_xattr(int argc, char **argv)
> @@ -190,30 +191,30 @@ void do_set_xattr(int argc, char **argv)
>  		default:
>  			printf("%s: Usage: %s <file> <attr> [-f infile | "
>  			       "value]\n", argv[0], argv[0]);
> -			return;
> +			goto out2;
>  		}
>  	}
>  
>  	if (optind != argc - 2 && optind != argc - 3) {
>  		printf("%s: Usage: %s <file> <attr> [-f infile | value>]\n",
>  		       argv[0], argv[0]);
> -		return;
> +		goto out2;
>  	}
>  
>  	if (check_fs_open(argv[0]))
> -		return;
> +		goto out2;
>  	if (check_fs_read_write(argv[0]))
> -		return;
> +		goto out2;
>  	if (check_fs_bitmaps(argv[0]))
> -		return;
> +		goto out2;
>  
>  	ino = string_to_inode(argv[optind]);
>  	if (!ino)
> -		return;
> +		goto out2;
>  
>  	err = ext2fs_xattrs_open(current_fs, ino, &h);
>  	if (err)
> -		return;
> +		goto out2;
>  
>  	err = ext2fs_xattrs_read(h);
>  	if (err)
> @@ -238,13 +239,14 @@ void do_set_xattr(int argc, char **argv)
>  		goto out;
>  
>  out:
> +	ext2fs_xattrs_close(&h);
> +	if (err)
> +		com_err(argv[0], err, "while setting extended attribute");
> +out2:
>  	if (fp) {
>  		fclose(fp);
>  		ext2fs_free_mem(&buf);
>  	}
> -	ext2fs_xattrs_close(&h);
> -	if (err)
> -		com_err(argv[0], err, "while setting extended attribute");
>  }
>  
>  void do_rm_xattr(int argc, char **argv)
> diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c
> index 80ce88f..30673b5 100644
> --- a/lib/ext2fs/extent.c
> +++ b/lib/ext2fs/extent.c
> @@ -1482,7 +1482,7 @@ errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
>  			if (retval) {
>  				r2 = ext2fs_extent_goto(handle, orig_lblk);
>  				if (r2 == 0)
> -					ext2fs_extent_replace(handle, 0,
> +					(void)ext2fs_extent_replace(handle, 0,
>  							      &orig_extent);
>  				goto done;
>  			}
> @@ -1498,11 +1498,12 @@ errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
>  				r2 = ext2fs_extent_goto(handle,
>  							newextent.e_lblk);
>  				if (r2 == 0)
> -					ext2fs_extent_delete(handle, 0);
> +					(void)ext2fs_extent_delete(handle, 0);
>  			}
>  			r2 = ext2fs_extent_goto(handle, orig_lblk);
>  			if (r2 == 0)
> -				ext2fs_extent_replace(handle, 0, &orig_extent);
> +				(void)ext2fs_extent_replace(handle, 0,
> +							    &orig_extent);
>  			goto done;
>  		}
>  	}
> diff --git a/lib/ext2fs/punch.c b/lib/ext2fs/punch.c
> index 60cd2a3..c9250cd 100644
> --- a/lib/ext2fs/punch.c
> +++ b/lib/ext2fs/punch.c
> @@ -403,7 +403,7 @@ static errcode_t ext2fs_punch_extent(ext2_filsys fs, ext2_ino_t ino,
>  			retval = 0;
>  
>  			/* Jump forward to the next extent. */
> -			ext2fs_extent_goto(handle, next_lblk);
> +			(void)ext2fs_extent_goto(handle, next_lblk);

Why do we not want to check the return value of this ? There might
be an error right ?

>  			op = EXT2_EXTENT_CURRENT;
>  		}
>  		if (retval)
> diff --git a/misc/create_inode.c b/misc/create_inode.c
> index 964c66a..4bb5e5b 100644
> --- a/misc/create_inode.c
> +++ b/misc/create_inode.c
> @@ -465,7 +465,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  	char		ln_target[PATH_MAX];
>  	unsigned int	save_inode;
>  	ext2_ino_t	ino;
> -	errcode_t	retval;
> +	errcode_t	retval = 0;
>  	int		read_cnt;
>  	int		hdlink;
>  
> @@ -486,7 +486,11 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  		if ((!strcmp(dent->d_name, ".")) ||
>  		    (!strcmp(dent->d_name, "..")))
>  			continue;
> -		lstat(dent->d_name, &st);
> +		if (lstat(dent->d_name, &st)) {
> +			com_err(__func__, errno, _("while lstat \"%s\""),
> +				dent->d_name);
> +			goto out;
> +		}
>  		name = dent->d_name;
>  
>  		/* Check for hardlinks */
> @@ -501,7 +505,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  				if (retval) {
>  					com_err(__func__, retval,
>  						"while linking %s", name);
> -					return retval;
> +					goto out;
>  				}
>  				continue;
>  			} else
> @@ -517,7 +521,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  				com_err(__func__, retval,
>  					_("while creating special file "
>  					  "\"%s\""), name);
> -				return retval;
> +				goto out;
>  			}
>  			break;
>  		case S_IFSOCK:
> @@ -527,7 +531,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  			continue;
>  		case S_IFLNK:
>  			read_cnt = readlink(name, ln_target,
> -					    sizeof(ln_target));
> +					    sizeof(ln_target) - 1);
>  			if (read_cnt == -1) {
>  				com_err(__func__, errno,
>  					_("while trying to readlink \"%s\""),
> @@ -541,7 +545,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  				com_err(__func__, retval,
>  					_("while writing symlink\"%s\""),
>  					name);
> -				return retval;
> +				goto out;
>  			}
>  			break;
>  		case S_IFREG:
> @@ -550,7 +554,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  			if (retval) {
>  				com_err(__func__, retval,
>  					_("while writing file \"%s\""), name);
> -				return retval;
> +				goto out;
>  			}
>  			break;
>  		case S_IFDIR:
> @@ -559,25 +563,25 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  			if (retval) {
>  				com_err(__func__, retval,
>  					_("while making dir \"%s\""), name);
> -				return retval;
> +				goto out;
>  			}
>  			retval = ext2fs_namei(fs, root, parent_ino,
>  					      name, &ino);
>  			if (retval) {
>  				com_err(name, retval, 0);
> -					return retval;
> +					goto out;
>  			}
>  			/* Populate the dir recursively*/
>  			retval = __populate_fs(fs, ino, name, root, hdlinks);
>  			if (retval) {
>  				com_err(__func__, retval,
>  					_("while adding dir \"%s\""), name);
> -				return retval;
> +				goto out;
>  			}
>  			if (chdir("..")) {
>  				com_err(__func__, errno,
>  					_("during cd .."));
> -				return errno;

you probably wan to store errno in retval because that's what we
return from the function.

> +				goto out;
>  			}
>  			break;
>  		default:
> @@ -588,14 +592,14 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  		retval =  ext2fs_namei(fs, root, parent_ino, name, &ino);
>  		if (retval) {
>  			com_err(name, retval, 0);
> -			return retval;
> +			goto out;
>  		}
>  
>  		retval = set_inode_extra(fs, parent_ino, ino, &st);
>  		if (retval) {
>  			com_err(__func__, retval,
>  				_("while setting inode for \"%s\""), name);
> -			return retval;
> +			goto out;
>  		}
>  
>  		/* Save the hardlink ino */
> @@ -612,7 +616,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  				if (p == NULL) {
>  					com_err(name, errno,
>  						_("Not enough memory"));
> -					return errno;
> +					goto out;

same here.

Thanks!
-Lukas

>  				}
>  				hdlinks->hdl = p;
>  				hdlinks->size += HDLINK_CNT;
> @@ -623,6 +627,8 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
>  			hdlinks->count++;
>  		}
>  	}
> +
> +out:
>  	closedir(dh);
>  	return retval;
>  }
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Darrick Wong May 5, 2014, 8:04 p.m. UTC | #2
On Fri, May 02, 2014 at 01:17:49PM +0200, Lukáš Czerner wrote:
> On Thu, 1 May 2014, Darrick J. Wong wrote:
> 
> > Date: Thu, 01 May 2014 16:12:36 -0700
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> > To: tytso@mit.edu, darrick.wong@oracle.com
> > Cc: linux-ext4@vger.kernel.org
> > Subject: [PATCH 02/37] misc: coverity fixes
> > 
> > Fix various small resource leaks and error code handling issues that
> > Coverity pointed out.

<snip>

> > diff --git a/lib/ext2fs/punch.c b/lib/ext2fs/punch.c
> > index 60cd2a3..c9250cd 100644
> > --- a/lib/ext2fs/punch.c
> > +++ b/lib/ext2fs/punch.c
> > @@ -403,7 +403,7 @@ static errcode_t ext2fs_punch_extent(ext2_filsys fs, ext2_ino_t ino,
> >  			retval = 0;
> >  
> >  			/* Jump forward to the next extent. */
> > -			ext2fs_extent_goto(handle, next_lblk);
> > +			(void)ext2fs_extent_goto(handle, next_lblk);
> 
> Why do we not want to check the return value of this ? There might
> be an error right ?

We can ignore errors that happen during the goto because the subsequent
ext2fs_extent_get() about ten lines down (to load another extent) will tell us
if there are no more extents or if some error happened.

(I suppose I can add a comment explaining this.)

> >  			op = EXT2_EXTENT_CURRENT;
> >  		}
> >  		if (retval)
> > diff --git a/misc/create_inode.c b/misc/create_inode.c
> > index 964c66a..4bb5e5b 100644
> > --- a/misc/create_inode.c
> > +++ b/misc/create_inode.c
> > @@ -465,7 +465,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  	char		ln_target[PATH_MAX];
> >  	unsigned int	save_inode;
> >  	ext2_ino_t	ino;
> > -	errcode_t	retval;
> > +	errcode_t	retval = 0;
> >  	int		read_cnt;
> >  	int		hdlink;
> >  
> > @@ -486,7 +486,11 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  		if ((!strcmp(dent->d_name, ".")) ||
> >  		    (!strcmp(dent->d_name, "..")))
> >  			continue;
> > -		lstat(dent->d_name, &st);
> > +		if (lstat(dent->d_name, &st)) {
> > +			com_err(__func__, errno, _("while lstat \"%s\""),
> > +				dent->d_name);
> > +			goto out;
> > +		}
> >  		name = dent->d_name;
> >  
> >  		/* Check for hardlinks */
> > @@ -501,7 +505,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  				if (retval) {
> >  					com_err(__func__, retval,
> >  						"while linking %s", name);
> > -					return retval;
> > +					goto out;
> >  				}
> >  				continue;
> >  			} else
> > @@ -517,7 +521,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  				com_err(__func__, retval,
> >  					_("while creating special file "
> >  					  "\"%s\""), name);
> > -				return retval;
> > +				goto out;
> >  			}
> >  			break;
> >  		case S_IFSOCK:
> > @@ -527,7 +531,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  			continue;
> >  		case S_IFLNK:
> >  			read_cnt = readlink(name, ln_target,
> > -					    sizeof(ln_target));
> > +					    sizeof(ln_target) - 1);
> >  			if (read_cnt == -1) {
> >  				com_err(__func__, errno,
> >  					_("while trying to readlink \"%s\""),
> > @@ -541,7 +545,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  				com_err(__func__, retval,
> >  					_("while writing symlink\"%s\""),
> >  					name);
> > -				return retval;
> > +				goto out;
> >  			}
> >  			break;
> >  		case S_IFREG:
> > @@ -550,7 +554,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  			if (retval) {
> >  				com_err(__func__, retval,
> >  					_("while writing file \"%s\""), name);
> > -				return retval;
> > +				goto out;
> >  			}
> >  			break;
> >  		case S_IFDIR:
> > @@ -559,25 +563,25 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  			if (retval) {
> >  				com_err(__func__, retval,
> >  					_("while making dir \"%s\""), name);
> > -				return retval;
> > +				goto out;
> >  			}
> >  			retval = ext2fs_namei(fs, root, parent_ino,
> >  					      name, &ino);
> >  			if (retval) {
> >  				com_err(name, retval, 0);
> > -					return retval;
> > +					goto out;
> >  			}
> >  			/* Populate the dir recursively*/
> >  			retval = __populate_fs(fs, ino, name, root, hdlinks);
> >  			if (retval) {
> >  				com_err(__func__, retval,
> >  					_("while adding dir \"%s\""), name);
> > -				return retval;
> > +				goto out;
> >  			}
> >  			if (chdir("..")) {
> >  				com_err(__func__, errno,
> >  					_("during cd .."));
> > -				return errno;
> 
> you probably wan to store errno in retval because that's what we
> return from the function.

Oops, yes.

> > +				goto out;
> >  			}
> >  			break;
> >  		default:
> > @@ -588,14 +592,14 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  		retval =  ext2fs_namei(fs, root, parent_ino, name, &ino);
> >  		if (retval) {
> >  			com_err(name, retval, 0);
> > -			return retval;
> > +			goto out;
> >  		}
> >  
> >  		retval = set_inode_extra(fs, parent_ino, ino, &st);
> >  		if (retval) {
> >  			com_err(__func__, retval,
> >  				_("while setting inode for \"%s\""), name);
> > -			return retval;
> > +			goto out;
> >  		}
> >  
> >  		/* Save the hardlink ino */
> > @@ -612,7 +616,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  				if (p == NULL) {
> >  					com_err(name, errno,
> >  						_("Not enough memory"));
> > -					return errno;
> > +					goto out;
> 
> same here.

Yes.  Thank you for spotting these.

--D
> 
> Thanks!
> -Lukas
> 
> >  				}
> >  				hdlinks->hdl = p;
> >  				hdlinks->size += HDLINK_CNT;
> > @@ -623,6 +627,8 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> >  			hdlinks->count++;
> >  		}
> >  	}
> > +
> > +out:
> >  	closedir(dh);
> >  	return retval;
> >  }
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Theodore Ts'o May 11, 2014, 10:40 p.m. UTC | #3
Applied, with Lukáš's nits addressed.  One comment:

> > > @@ -612,7 +616,7 @@ static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
> > >  				if (p == NULL) {
> > >  					com_err(name, errno,
> > >  						_("Not enough memory"));
> > > -					return errno;
> > > +					goto out;
> > 
> > same here.
> 
> Yes.  Thank you for spotting these.

The original code was buggy here, since realloc() doesn't set errno.
I've added:

					retval = EXT2_ET_NO_MEMORY;

before the "goto out" line.

					- Ted
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/debugfs/xattrs.c b/debugfs/xattrs.c
index 0a29521..7109719 100644
--- a/debugfs/xattrs.c
+++ b/debugfs/xattrs.c
@@ -122,26 +122,26 @@  void do_get_xattr(int argc, char **argv)
 		default:
 			printf("%s: Usage: %s <file> <attr> [-f outfile]\n",
 			       argv[0], argv[0]);
-			return;
+			goto out2;
 		}
 	}
 
 	if (optind != argc - 2) {
 		printf("%s: Usage: %s <file> <attr> [-f outfile]\n", argv[0],
 		       argv[0]);
-		return;
+		goto out2;
 	}
 
 	if (check_fs_open(argv[0]))
-		return;
+		goto out2;
 
 	ino = string_to_inode(argv[optind]);
 	if (!ino)
-		return;
+		goto out2;
 
 	err = ext2fs_xattrs_open(current_fs, ino, &h);
 	if (err)
-		return;
+		goto out2;
 
 	err = ext2fs_xattrs_read(h);
 	if (err)
@@ -153,18 +153,19 @@  void do_get_xattr(int argc, char **argv)
 
 	if (fp) {
 		fwrite(buf, buflen, 1, fp);
-		fclose(fp);
 	} else {
 		dump_xattr_string(stdout, buf, buflen);
 		printf("\n");
 	}
 
-	if (buf)
-		ext2fs_free_mem(&buf);
+	ext2fs_free_mem(&buf);
 out:
 	ext2fs_xattrs_close(&h);
 	if (err)
 		com_err(argv[0], err, "while getting extended attribute");
+out2:
+	if (fp)
+		fclose(fp);
 }
 
 void do_set_xattr(int argc, char **argv)
@@ -190,30 +191,30 @@  void do_set_xattr(int argc, char **argv)
 		default:
 			printf("%s: Usage: %s <file> <attr> [-f infile | "
 			       "value]\n", argv[0], argv[0]);
-			return;
+			goto out2;
 		}
 	}
 
 	if (optind != argc - 2 && optind != argc - 3) {
 		printf("%s: Usage: %s <file> <attr> [-f infile | value>]\n",
 		       argv[0], argv[0]);
-		return;
+		goto out2;
 	}
 
 	if (check_fs_open(argv[0]))
-		return;
+		goto out2;
 	if (check_fs_read_write(argv[0]))
-		return;
+		goto out2;
 	if (check_fs_bitmaps(argv[0]))
-		return;
+		goto out2;
 
 	ino = string_to_inode(argv[optind]);
 	if (!ino)
-		return;
+		goto out2;
 
 	err = ext2fs_xattrs_open(current_fs, ino, &h);
 	if (err)
-		return;
+		goto out2;
 
 	err = ext2fs_xattrs_read(h);
 	if (err)
@@ -238,13 +239,14 @@  void do_set_xattr(int argc, char **argv)
 		goto out;
 
 out:
+	ext2fs_xattrs_close(&h);
+	if (err)
+		com_err(argv[0], err, "while setting extended attribute");
+out2:
 	if (fp) {
 		fclose(fp);
 		ext2fs_free_mem(&buf);
 	}
-	ext2fs_xattrs_close(&h);
-	if (err)
-		com_err(argv[0], err, "while setting extended attribute");
 }
 
 void do_rm_xattr(int argc, char **argv)
diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c
index 80ce88f..30673b5 100644
--- a/lib/ext2fs/extent.c
+++ b/lib/ext2fs/extent.c
@@ -1482,7 +1482,7 @@  errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
 			if (retval) {
 				r2 = ext2fs_extent_goto(handle, orig_lblk);
 				if (r2 == 0)
-					ext2fs_extent_replace(handle, 0,
+					(void)ext2fs_extent_replace(handle, 0,
 							      &orig_extent);
 				goto done;
 			}
@@ -1498,11 +1498,12 @@  errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
 				r2 = ext2fs_extent_goto(handle,
 							newextent.e_lblk);
 				if (r2 == 0)
-					ext2fs_extent_delete(handle, 0);
+					(void)ext2fs_extent_delete(handle, 0);
 			}
 			r2 = ext2fs_extent_goto(handle, orig_lblk);
 			if (r2 == 0)
-				ext2fs_extent_replace(handle, 0, &orig_extent);
+				(void)ext2fs_extent_replace(handle, 0,
+							    &orig_extent);
 			goto done;
 		}
 	}
diff --git a/lib/ext2fs/punch.c b/lib/ext2fs/punch.c
index 60cd2a3..c9250cd 100644
--- a/lib/ext2fs/punch.c
+++ b/lib/ext2fs/punch.c
@@ -403,7 +403,7 @@  static errcode_t ext2fs_punch_extent(ext2_filsys fs, ext2_ino_t ino,
 			retval = 0;
 
 			/* Jump forward to the next extent. */
-			ext2fs_extent_goto(handle, next_lblk);
+			(void)ext2fs_extent_goto(handle, next_lblk);
 			op = EXT2_EXTENT_CURRENT;
 		}
 		if (retval)
diff --git a/misc/create_inode.c b/misc/create_inode.c
index 964c66a..4bb5e5b 100644
--- a/misc/create_inode.c
+++ b/misc/create_inode.c
@@ -465,7 +465,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 	char		ln_target[PATH_MAX];
 	unsigned int	save_inode;
 	ext2_ino_t	ino;
-	errcode_t	retval;
+	errcode_t	retval = 0;
 	int		read_cnt;
 	int		hdlink;
 
@@ -486,7 +486,11 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 		if ((!strcmp(dent->d_name, ".")) ||
 		    (!strcmp(dent->d_name, "..")))
 			continue;
-		lstat(dent->d_name, &st);
+		if (lstat(dent->d_name, &st)) {
+			com_err(__func__, errno, _("while lstat \"%s\""),
+				dent->d_name);
+			goto out;
+		}
 		name = dent->d_name;
 
 		/* Check for hardlinks */
@@ -501,7 +505,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 				if (retval) {
 					com_err(__func__, retval,
 						"while linking %s", name);
-					return retval;
+					goto out;
 				}
 				continue;
 			} else
@@ -517,7 +521,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 				com_err(__func__, retval,
 					_("while creating special file "
 					  "\"%s\""), name);
-				return retval;
+				goto out;
 			}
 			break;
 		case S_IFSOCK:
@@ -527,7 +531,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 			continue;
 		case S_IFLNK:
 			read_cnt = readlink(name, ln_target,
-					    sizeof(ln_target));
+					    sizeof(ln_target) - 1);
 			if (read_cnt == -1) {
 				com_err(__func__, errno,
 					_("while trying to readlink \"%s\""),
@@ -541,7 +545,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 				com_err(__func__, retval,
 					_("while writing symlink\"%s\""),
 					name);
-				return retval;
+				goto out;
 			}
 			break;
 		case S_IFREG:
@@ -550,7 +554,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 			if (retval) {
 				com_err(__func__, retval,
 					_("while writing file \"%s\""), name);
-				return retval;
+				goto out;
 			}
 			break;
 		case S_IFDIR:
@@ -559,25 +563,25 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 			if (retval) {
 				com_err(__func__, retval,
 					_("while making dir \"%s\""), name);
-				return retval;
+				goto out;
 			}
 			retval = ext2fs_namei(fs, root, parent_ino,
 					      name, &ino);
 			if (retval) {
 				com_err(name, retval, 0);
-					return retval;
+					goto out;
 			}
 			/* Populate the dir recursively*/
 			retval = __populate_fs(fs, ino, name, root, hdlinks);
 			if (retval) {
 				com_err(__func__, retval,
 					_("while adding dir \"%s\""), name);
-				return retval;
+				goto out;
 			}
 			if (chdir("..")) {
 				com_err(__func__, errno,
 					_("during cd .."));
-				return errno;
+				goto out;
 			}
 			break;
 		default:
@@ -588,14 +592,14 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 		retval =  ext2fs_namei(fs, root, parent_ino, name, &ino);
 		if (retval) {
 			com_err(name, retval, 0);
-			return retval;
+			goto out;
 		}
 
 		retval = set_inode_extra(fs, parent_ino, ino, &st);
 		if (retval) {
 			com_err(__func__, retval,
 				_("while setting inode for \"%s\""), name);
-			return retval;
+			goto out;
 		}
 
 		/* Save the hardlink ino */
@@ -612,7 +616,7 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 				if (p == NULL) {
 					com_err(name, errno,
 						_("Not enough memory"));
-					return errno;
+					goto out;
 				}
 				hdlinks->hdl = p;
 				hdlinks->size += HDLINK_CNT;
@@ -623,6 +627,8 @@  static errcode_t __populate_fs(ext2_filsys fs, ext2_ino_t parent_ino,
 			hdlinks->count++;
 		}
 	}
+
+out:
 	closedir(dh);
 	return retval;
 }