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

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