[Cluster-devel] [PATCH] gfs2_edit: Fix parsing the savemeta -z option

Andrew Price anprice at redhat.com
Mon May 19 14:47:58 UTC 2014


Specifying -z0 instead of -z 0 could confuse gfs2_edit to the point
where it would call ftruncate on the filesystem instead of the output
file. Fix up the -z parsing function to recognise when the space is
omitted and avoid calling ftruncate on the wrong file.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/edit/hexedit.c | 26 ++++++++++++++++----------
 tests/edit.at       |  7 +++++++
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index 53a816d..0982f7b 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -2608,19 +2608,25 @@ static void usage(void)
  */
 static void getgziplevel(char *argv[], int *i)
 {
+	char *opt, *arg;
 	char *endptr;
-	(*i)++;
-	if (!strcasecmp(argv[*i], "-z")) {
-		(*i)++;
-		errno = 0;
-		gziplevel = strtol(argv[*i], &endptr, 10);
-		if (errno || endptr == argv[*i] || gziplevel < 0 || gziplevel > 9) {
-			fprintf(stderr, "Compression level out of range: %s\n", argv[*i]);
-			exit(-1);
-		}
+
+	arg = argv[1 + *i];
+	if (strncmp(arg, "-z", 2)) {
+		return;
+	} else if (arg[2] != '\0') {
+		opt = &arg[2];
 	} else {
-		(*i)--;
+		(*i)++;
+		opt = argv[1 + *i];
+	}
+	errno = 0;
+	gziplevel = strtol(opt, &endptr, 10);
+	if (errno || endptr == opt || gziplevel < 0 || gziplevel > 9) {
+		fprintf(stderr, "Compression level out of range: %s\n", opt);
+		exit(-1);
 	}
+	(*i)++;
 }
 
 /* ------------------------------------------------------------------------ */
diff --git a/tests/edit.at b/tests/edit.at
index 3428d64..e2a702c 100644
--- a/tests/edit.at
+++ b/tests/edit.at
@@ -11,5 +11,12 @@ Reading resource groups...Done. File system size: 4.1023GB
 GFS_TGT_REGEN
 AT_CHECK([gfs2_edit restoremeta test.meta $GFS_TGT], 0, [ignore], [ignore])
 AT_CHECK([fsck.gfs2 -n $GFS_TGT], 0, [ignore], [ignore])
+AT_CLEANUP
 
+AT_SETUP([Savemeta/restoremeta, no compression])
+GFS_TGT_REGEN
+AT_CHECK([$GFS_MKFS -p lock_nolock $GFS_TGT $(($(gfs_max_blocks 4096)/2))], 0, [ignore], [ignore])
+AT_CHECK([gfs2_edit savemeta -z0 $GFS_TGT test.meta], 0, [ignore], [ignore])
+AT_CHECK([gfs2_edit restoremeta test.meta $GFS_TGT], 0, [ignore], [ignore])
+AT_CHECK([fsck.gfs2 -n $GFS_TGT], 0, [ignore], [ignore])
 AT_CLEANUP
-- 
1.9.0




More information about the Cluster-devel mailing list