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

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