Blame SOURCES/e2fsprogs-1.42.9-14-e2fsprogs-introduce-ext2fs_close_free-helper.patch

98901c
From 868d26ab9b54545a67150ba59a5aa9d47cb4e2d8 Mon Sep 17 00:00:00 2001
98901c
From: Lukas Czerner <lczerner@redhat.com>
98901c
Date: Thu, 20 Feb 2014 16:02:29 +0100
98901c
Subject: [PATCH 01/16] e2fsprogs: introduce ext2fs_close_free() helper
98901c
98901c
commit 47fee2ef6a23ae06f680336ffde57caa64604a4c
98901c
98901c
Currently there are many uses of ext2fs_close() which might be wrong.
98901c
First of all ext2fs_close() does not set the ext2_filsys pointer to NULL
98901c
so the caller is responsible for clearing it, however there are some
98901c
cases there we do not do it.
98901c
98901c
Second of all very small number of users of ext2fs_close() actually
98901c
check the return value. If there is a problem in ext2fs_close() it will
98901c
not even free the ext2_filsys structure, but majority of users expect it
98901c
to do so.
98901c
98901c
To fix both problems this commit introduces a new helper
98901c
ext2fs_close_free() which will not only check for the return value and
98901c
free the ext2_filsys structure if the call to ext2fs_close2() failed,
98901c
but it will also set the ext2_filsys pointer to NULL.
98901c
98901c
Replace every use of ext2fs_close() in e2fsprogs tools with
98901c
ext2fs_close_free() - there is no real reason to keep using
98901c
ext2fs_close().
98901c
98901c
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
98901c
---
98901c
 debugfs/debugfs.c        |  6 ++----
98901c
 e2fsck/scantest.c        |  2 +-
98901c
 e2fsck/unix.c            | 20 ++++++++------------
98901c
 e2fsck/util.c            |  2 +-
98901c
 lib/ext2fs/closefs.c     | 12 ++++++++++++
98901c
 lib/ext2fs/ext2fs.h      |  1 +
98901c
 lib/ext2fs/mkjournal.c   |  2 +-
98901c
 lib/ext2fs/tst_bitmaps.c | 12 ++++--------
98901c
 misc/dumpe2fs.c          |  6 +++---
98901c
 misc/e2freefrag.c        |  2 +-
98901c
 misc/e2image.c           |  4 ++--
98901c
 misc/e4defrag.c          |  2 +-
98901c
 misc/mke2fs.c            |  8 ++++----
98901c
 misc/tune2fs.c           |  6 +++---
98901c
 resize/main.c            |  2 +-
98901c
 resize/resize2fs.c       |  2 +-
98901c
 16 files changed, 46 insertions(+), 43 deletions(-)
98901c
98901c
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
98901c
index cf7670bc..2082309b 100644
98901c
--- a/debugfs/debugfs.c
98901c
+++ b/debugfs/debugfs.c
98901c
@@ -131,10 +131,9 @@ static void open_filesystem(char *device, int open_flags, blk64_t superblock,
98901c
 	return;
98901c
 
98901c
 errout:
98901c
-	retval = ext2fs_close(current_fs);
98901c
+	retval = ext2fs_close_free(&current_fs);
98901c
 	if (retval)
98901c
 		com_err(device, retval, "while trying to close filesystem");
98901c
-	current_fs = NULL;
98901c
 }
98901c
 
98901c
 void do_open_filesys(int argc, char **argv)
98901c
@@ -237,10 +236,9 @@ static void close_filesystem(NOARGS)
98901c
 		if (retval)
98901c
 			com_err("ext2fs_write_block_bitmap", retval, 0);
98901c
 	}
98901c
-	retval = ext2fs_close(current_fs);
98901c
+	retval = ext2fs_close_free(&current_fs);
98901c
 	if (retval)
98901c
 		com_err("ext2fs_close", retval, 0);
98901c
-	current_fs = NULL;
98901c
 	return;
98901c
 }
98901c
 
98901c
diff --git a/e2fsck/scantest.c b/e2fsck/scantest.c
98901c
index 16380b31..61311410 100644
98901c
--- a/e2fsck/scantest.c
98901c
+++ b/e2fsck/scantest.c
98901c
@@ -133,7 +133,7 @@ int main (int argc, char *argv[])
98901c
 	}
98901c
 
98901c
 
98901c
-	ext2fs_close(fs);
98901c
+	ext2fs_close_free(&fs);
98901c
 
98901c
 	print_resource_track(&global_rtrack);
98901c
 
98901c
diff --git a/e2fsck/unix.c b/e2fsck/unix.c
98901c
index d94d5dcd..5fcc9d99 100644
98901c
--- a/e2fsck/unix.c
98901c
+++ b/e2fsck/unix.c
98901c
@@ -456,8 +456,7 @@ static void check_if_skip(e2fsck_t ctx)
98901c
 	}
98901c
 	log_out(ctx, "\n");
98901c
 skip:
98901c
-	ext2fs_close(fs);
98901c
-	ctx->fs = NULL;
98901c
+	ext2fs_close_free(&fs);
98901c
 	e2fsck_free_context(ctx);
98901c
 	exit(FSCK_OK);
98901c
 }
98901c
@@ -1303,12 +1302,12 @@ restart:
98901c
 			orig_superblock = ctx->superblock;
98901c
 			get_backup_sb(ctx, fs, ctx->filesystem_name, io_ptr);
98901c
 			if (fs)
98901c
-				ext2fs_close(fs);
98901c
+				ext2fs_close_free(&fs);
98901c
 			orig_retval = retval;
98901c
 			retval = try_open_fs(ctx, flags, io_ptr, &fs);
98901c
 			if ((orig_retval == 0) && retval != 0) {
98901c
 				if (fs)
98901c
-					ext2fs_close(fs);
98901c
+					ext2fs_close_free(&fs);
98901c
 				log_out(ctx, _("%s: %s while using the "
98901c
 					       "backup blocks"),
98901c
 					ctx->program_name,
98901c
@@ -1402,7 +1401,7 @@ failure:
98901c
 		 * reopen the filesystem after we get the device size.
98901c
 		 */
98901c
 		if (pctx.errcode == EBUSY) {
98901c
-			ext2fs_close(fs);
98901c
+			ext2fs_close_free(&fs);
98901c
 			need_restart++;
98901c
 			pctx.errcode =
98901c
 				ext2fs_get_device_size2(ctx->filesystem_name,
98901c
@@ -1459,8 +1458,7 @@ failure:
98901c
 		/*
98901c
 		 * Restart in order to reopen fs but this time start mmp.
98901c
 		 */
98901c
-		ext2fs_close(fs);
98901c
-		ctx->fs = NULL;
98901c
+		ext2fs_close_free(&fs);
98901c
 		flags &= ~EXT2_FLAG_SKIP_MMP;
98901c
 		goto restart;
98901c
 	}
98901c
@@ -1510,8 +1508,7 @@ failure:
98901c
 					ctx->device_name);
98901c
 				fatal_error(ctx, 0);
98901c
 			}
98901c
-			ext2fs_close(ctx->fs);
98901c
-			ctx->fs = 0;
98901c
+			ext2fs_close_free(&ctx->fs);
98901c
 			ctx->flags |= E2F_FLAG_RESTARTED;
98901c
 			goto restart;
98901c
 		}
98901c
@@ -1690,7 +1687,7 @@ no_journal:
98901c
 				_("while resetting context"));
98901c
 			fatal_error(ctx, 0);
98901c
 		}
98901c
-		ext2fs_close(fs);
98901c
+		ext2fs_close_free(&fs);
98901c
 		goto restart;
98901c
 	}
98901c
 	if (run_result & E2F_FLAG_CANCEL) {
98901c
@@ -1772,8 +1769,7 @@ no_journal:
98901c
 	io_channel_flush(ctx->fs->io);
98901c
 	print_resource_track(ctx, NULL, &ctx->global_rtrack, ctx->fs->io);
98901c
 
98901c
-	ext2fs_close(fs);
98901c
-	ctx->fs = NULL;
98901c
+	ext2fs_close_free(&fs);
98901c
 	free(ctx->journal_name);
98901c
 
98901c
 	e2fsck_free_context(ctx);
98901c
diff --git a/e2fsck/util.c b/e2fsck/util.c
98901c
index 9f920b2c..14c9ad48 100644
98901c
--- a/e2fsck/util.c
98901c
+++ b/e2fsck/util.c
98901c
@@ -319,7 +319,7 @@ void preenhalt(e2fsck_t ctx)
98901c
 	if (fs != NULL) {
98901c
 		fs->super->s_state |= EXT2_ERROR_FS;
98901c
 		ext2fs_mark_super_dirty(fs);
98901c
-		ext2fs_close(fs);
98901c
+		ext2fs_close_free(&fs);
98901c
 	}
98901c
 	exit(FSCK_UNCORRECTED);
98901c
 }
98901c
diff --git a/lib/ext2fs/closefs.c b/lib/ext2fs/closefs.c
98901c
index 000ebd87..4db9e194 100644
98901c
--- a/lib/ext2fs/closefs.c
98901c
+++ b/lib/ext2fs/closefs.c
98901c
@@ -437,6 +437,18 @@ errout:
98901c
 	return retval;
98901c
 }
98901c
 
98901c
+errcode_t ext2fs_close_free(ext2_filsys *fs_ptr)
98901c
+{
98901c
+	errcode_t ret;
98901c
+	ext2_filsys fs = *fs_ptr;
98901c
+
98901c
+	ret = ext2fs_close2(fs, 0);
98901c
+	if (ret)
98901c
+		ext2fs_free(fs);
98901c
+	*fs_ptr = NULL;
98901c
+	return ret;
98901c
+}
98901c
+
98901c
 errcode_t ext2fs_close(ext2_filsys fs)
98901c
 {
98901c
 	return ext2fs_close2(fs, 0);
98901c
diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h
98901c
index 380608b2..643b66c0 100644
98901c
--- a/lib/ext2fs/ext2fs.h
98901c
+++ b/lib/ext2fs/ext2fs.h
98901c
@@ -925,6 +925,7 @@ extern errcode_t ext2fs_check_desc(ext2_filsys fs);
98901c
 /* closefs.c */
98901c
 extern errcode_t ext2fs_close(ext2_filsys fs);
98901c
 extern errcode_t ext2fs_close2(ext2_filsys fs, int flags);
98901c
+extern errcode_t ext2fs_close_free(ext2_filsys *fs);
98901c
 extern errcode_t ext2fs_flush(ext2_filsys fs);
98901c
 extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags);
98901c
 extern int ext2fs_bg_has_super(ext2_filsys fs, dgrp_t group_block);
98901c
diff --git a/lib/ext2fs/mkjournal.c b/lib/ext2fs/mkjournal.c
98901c
index d09c4589..52dc99be 100644
98901c
--- a/lib/ext2fs/mkjournal.c
98901c
+++ b/lib/ext2fs/mkjournal.c
98901c
@@ -630,7 +630,7 @@ main(int argc, char **argv)
98901c
 	if (retval) {
98901c
 		printf("Warning, had trouble writing out superblocks.\n");
98901c
 	}
98901c
-	ext2fs_close(fs);
98901c
+	ext2fs_close_free(&fs);
98901c
 	exit(0);
98901c
 
98901c
 }
98901c
diff --git a/lib/ext2fs/tst_bitmaps.c b/lib/ext2fs/tst_bitmaps.c
98901c
index 57bfd6c8..3a6d1bdc 100644
98901c
--- a/lib/ext2fs/tst_bitmaps.c
98901c
+++ b/lib/ext2fs/tst_bitmaps.c
98901c
@@ -187,8 +187,7 @@ static void setup_filesystem(const char *name,
98901c
 	return;
98901c
 
98901c
 errout:
98901c
-	ext2fs_close(test_fs);
98901c
-	test_fs = 0;
98901c
+	ext2fs_close_free(&test_fs);
98901c
 }
98901c
 
98901c
 void setup_cmd(int argc, char **argv)
98901c
@@ -199,10 +198,8 @@ void setup_cmd(int argc, char **argv)
98901c
 	unsigned int	type = EXT2FS_BMAP64_BITARRAY;
98901c
 	int		flags = EXT2_FLAG_64BITS;
98901c
 
98901c
-	if (test_fs) {
98901c
-		ext2fs_close(test_fs);
98901c
-		test_fs = 0;
98901c
-	}
98901c
+	if (test_fs)
98901c
+		ext2fs_close_free(&test_fs);
98901c
 
98901c
 	reset_getopt();
98901c
 	while ((c = getopt(argc, argv, "b:i:lt:")) != EOF) {
98901c
@@ -242,8 +239,7 @@ void close_cmd(int argc, char **argv)
98901c
 	if (check_fs_open(argv[0]))
98901c
 		return;
98901c
 
98901c
-	ext2fs_close(test_fs);
98901c
-	test_fs = 0;
98901c
+	ext2fs_close_free(&test_fs);
98901c
 }
98901c
 
98901c
 
98901c
diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c
98901c
index d4bde8e5..cc18ad83 100644
98901c
--- a/misc/dumpe2fs.c
98901c
+++ b/misc/dumpe2fs.c
98901c
@@ -614,7 +614,7 @@ int main (int argc, char ** argv)
98901c
 		if (fs->super->s_feature_incompat &
98901c
 		      EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
98901c
 			print_journal_information(fs);
98901c
-			ext2fs_close(fs);
98901c
+			ext2fs_close_free(&fs);
98901c
 			exit(0);
98901c
 		}
98901c
 		if ((fs->super->s_feature_compat &
98901c
@@ -623,7 +623,7 @@ int main (int argc, char ** argv)
98901c
 			print_inline_journal_information(fs);
98901c
 		list_bad_blocks(fs, 0);
98901c
 		if (header_only) {
98901c
-			ext2fs_close (fs);
98901c
+			ext2fs_close_free(&fs);
98901c
 			exit (0);
98901c
 		}
98901c
 		retval = ext2fs_read_bitmaps (fs);
98901c
@@ -634,7 +634,7 @@ int main (int argc, char ** argv)
98901c
 			       error_message(retval));
98901c
 		}
98901c
 	}
98901c
-	ext2fs_close (fs);
98901c
+	ext2fs_close_free(&fs);
98901c
 	remove_error_table(&et_ext2_error_table);
98901c
 	exit (0);
98901c
 }
98901c
diff --git a/misc/e2freefrag.c b/misc/e2freefrag.c
98901c
index 612ca445..bb72c70d 100644
98901c
--- a/misc/e2freefrag.c
98901c
+++ b/misc/e2freefrag.c
98901c
@@ -215,7 +215,7 @@ static errcode_t get_chunk_info(ext2_filsys fs, struct chunk_info *info,
98901c
 
98901c
 static void close_device(char *device_name, ext2_filsys fs)
98901c
 {
98901c
-	int retval = ext2fs_close(fs);
98901c
+	int retval = ext2fs_close_free(&fs);
98901c
 
98901c
 	if (retval)
98901c
 		com_err(device_name, retval, "while closing the filesystem.\n");
98901c
diff --git a/misc/e2image.c b/misc/e2image.c
98901c
index 0537b0d8..98dafa3d 100644
98901c
--- a/misc/e2image.c
98901c
+++ b/misc/e2image.c
98901c
@@ -1415,7 +1415,7 @@ static void install_image(char *device, char *image_fn, int type)
98901c
 	}
98901c
 
98901c
 	close(fd);
98901c
-	ext2fs_close (fs);
98901c
+	ext2fs_close_free(&fs);
98901c
 }
98901c
 
98901c
 static struct ext2_qcow2_hdr *check_qcow2_image(int *fd, char *name)
98901c
@@ -1648,7 +1648,7 @@ skip_device:
98901c
 	else
98901c
 		write_image_file(fs, fd);
98901c
 
98901c
-	ext2fs_close (fs);
98901c
+	ext2fs_close_free(&fs);
98901c
 	if (check)
98901c
 		printf(_("%d blocks already contained the data to be copied.\n"),
98901c
 		       skipped_blocks);
98901c
diff --git a/misc/e4defrag.c b/misc/e4defrag.c
98901c
index 1ba3c53a..2c2034cf 100644
98901c
--- a/misc/e4defrag.c
98901c
+++ b/misc/e4defrag.c
98901c
@@ -1863,7 +1863,7 @@ int main(int argc, char *argv[])
98901c
 			feature_incompat = fs->super->s_feature_incompat;
98901c
 			log_groups_per_flex = fs->super->s_log_groups_per_flex;
98901c
 
98901c
-			ext2fs_close(fs);
98901c
+			ext2fs_close_free(&fs);
98901c
 		}
98901c
 
98901c
 		switch (arg_type) {
98901c
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
98901c
index 8952a5fe..2787a127 100644
98901c
--- a/misc/mke2fs.c
98901c
+++ b/misc/mke2fs.c
98901c
@@ -1662,7 +1662,7 @@ profile_error:
98901c
 		printf(_("Using journal device's blocksize: %d\n"), blocksize);
98901c
 		fs_param.s_log_block_size =
98901c
 			int_log2(blocksize >> EXT2_MIN_BLOCK_LOG_SIZE);
98901c
-		ext2fs_close(jfs);
98901c
+		ext2fs_close_free(&jfs;;
98901c
 	}
98901c
 
98901c
 	if (optind < argc) {
98901c
@@ -2585,7 +2585,7 @@ int main (int argc, char *argv[])
98901c
 	if (fs->super->s_feature_incompat &
98901c
 	    EXT3_FEATURE_INCOMPAT_JOURNAL_DEV) {
98901c
 		create_journal_dev(fs);
98901c
-		exit(ext2fs_close(fs) ? 1 : 0);
98901c
+		exit(ext2fs_close_free(&fs) ? 1 : 0);
98901c
 	}
98901c
 
98901c
 	if (bad_blocks_filename)
98901c
@@ -2702,7 +2702,7 @@ int main (int argc, char *argv[])
98901c
 		}
98901c
 		if (!quiet)
98901c
 			printf("%s", _("done\n"));
98901c
-		ext2fs_close(jfs);
98901c
+		ext2fs_close_free(&jfs;;
98901c
 		free(journal_device);
98901c
 	} else if ((journal_size) ||
98901c
 		   (fs_param.s_feature_compat &
98901c
@@ -2761,7 +2761,7 @@ no_journal:
98901c
 		       "filesystem accounting information: "));
98901c
 	checkinterval = fs->super->s_checkinterval;
98901c
 	max_mnt_count = fs->super->s_max_mnt_count;
98901c
-	retval = ext2fs_close(fs);
98901c
+	retval = ext2fs_close_free(&fs);
98901c
 	if (retval) {
98901c
 		fprintf(stderr, "%s",
98901c
 			_("\nWarning, had trouble writing out superblocks.\n"));
98901c
diff --git a/misc/tune2fs.c b/misc/tune2fs.c
98901c
index d2aa125d..1bedca20 100644
98901c
--- a/misc/tune2fs.c
98901c
+++ b/misc/tune2fs.c
98901c
@@ -682,7 +682,7 @@ static int add_journal(ext2_filsys fs)
98901c
 		fflush(stdout);
98901c
 
98901c
 		retval = ext2fs_add_journal_device(fs, jfs);
98901c
-		ext2fs_close(jfs);
98901c
+		ext2fs_close_free(&jfs;;
98901c
 		if (retval) {
98901c
 			com_err(program_name, retval,
98901c
 				_("while adding filesystem to journal on %s"),
98901c
@@ -1987,7 +1987,7 @@ retry_open:
98901c
 			goto closefs;
98901c
 		}
98901c
 		if (io_ptr != io_ptr_orig) {
98901c
-			ext2fs_close(fs);
98901c
+			ext2fs_close_free(&fs);
98901c
 			goto retry_open;
98901c
 		}
98901c
 	}
98901c
@@ -2267,5 +2267,5 @@ closefs:
98901c
 		exit(1);
98901c
 	}
98901c
 
98901c
-	return (ext2fs_close(fs) ? 1 : 0);
98901c
+	return (ext2fs_close_free(&fs) ? 1 : 0);
98901c
 }
98901c
diff --git a/resize/main.c b/resize/main.c
98901c
index 80903b22..3951b091 100644
98901c
--- a/resize/main.c
98901c
+++ b/resize/main.c
98901c
@@ -484,7 +484,7 @@ int main (int argc, char ** argv)
98901c
 			_("Please run 'e2fsck -fy %s' to fix the filesystem\n"
98901c
 			  "after the aborted resize operation.\n"),
98901c
 			device_name);
98901c
-		ext2fs_close(fs);
98901c
+		ext2fs_close_free(&fs);
98901c
 		exit(1);
98901c
 	}
98901c
 	printf(_("The filesystem on %s is now %llu blocks long.\n\n"),
98901c
diff --git a/resize/resize2fs.c b/resize/resize2fs.c
98901c
index d6fc5337..a73390de 100644
98901c
--- a/resize/resize2fs.c
98901c
+++ b/resize/resize2fs.c
98901c
@@ -195,7 +195,7 @@ errcode_t resize_fs(ext2_filsys fs, blk64_t *new_size, int flags,
98901c
 	rfs->new_fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
98901c
 
98901c
 	print_resource_track(rfs, &overall_track, fs->io);
98901c
-	retval = ext2fs_close(rfs->new_fs);
98901c
+	retval = ext2fs_close_free(&rfs->new_fs);
98901c
 	if (retval)
98901c
 		goto errout;
98901c
 
98901c
-- 
98901c
2.20.1
98901c