[lvm-devel] master - cov: fix mem leaking buffer

Zdenek Kabelac zkabelac at sourceware.org
Thu Nov 14 17:07:31 UTC 2019


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d67ce9e140b5691a3f75a69d6e735eec30603670
Commit:        d67ce9e140b5691a3f75a69d6e735eec30603670
Parent:        0bad3977df40a70c68778ff0514d0ca712fee402
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Thu Nov 14 17:27:14 2019 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Thu Nov 14 18:06:42 2019 +0100

cov: fix mem leaking buffer

Free allocated buffer on function's exit.
Also check for fwrite() results.
---
 tools/pvck.c |   36 ++++++++++++++++++++++--------------
 1 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/tools/pvck.c b/tools/pvck.c
index 1c1bbc2..c197a97 100644
--- a/tools/pvck.c
+++ b/tools/pvck.c
@@ -662,20 +662,25 @@ static int _dump_meta_area(struct device *dev, const char *tofile,
 	if (!dev_read_bytes(dev, mda_offset, mda_size, meta_buf)) {
 		log_print("CHECK: failed to read metadata area at offset %llu size %llu",
 			  (unsigned long long)mda_offset, (unsigned long long)mda_size);
+		free(meta_buf);
 		return 0;
 	}
 
 	if (!(fp = fopen(tofile, "wx"))) {
-		log_error("Failed to create file %s", tofile);
+		log_error("Failed to create file %s.", tofile);
+		free(meta_buf);
 		return 0;
 	}
 
-	fwrite(meta_buf, mda_size - 512, 1, fp);
+	if (fwrite(meta_buf, mda_size - 512, 1, fp) < (mda_size - 512))
+		log_warn("WARNING: Failed to write " FMTu64 " bytes to file %s.", mda_size - 512, tofile);
 
+	free(meta_buf);
 	if (fflush(fp))
 		stack;
 	if (fclose(fp))
 		stack;
+
 	return 1;
 }
 
@@ -724,7 +729,7 @@ static int _dump_current_text(struct device *dev,
 	 * mda_offset + meta_offset.
 	 */
 	if (meta_offset + meta_size > mda_size) {
-	 	/* text metadata wraps to start of text metadata area */
+		/* text metadata wraps to start of text metadata area */
 		uint32_t wrap = (uint32_t) ((meta_offset + meta_size) - mda_size);
 		off_t offset_a = mda_offset + meta_offset;
 		uint32_t size_a = meta_size - wrap;
@@ -735,6 +740,7 @@ static int _dump_current_text(struct device *dev,
 			log_print("CHECK: failed to read metadata text at mda_header_%d.raw_locn[%d].offset %llu size %llu part_a %llu %llu", mn, ri,
 				  (unsigned long long)meta_offset, (unsigned long long)meta_size,
 				  (unsigned long long)offset_a, (unsigned long long)size_a);
+			free(meta_buf);
 			return 0;
 		}
 
@@ -742,12 +748,14 @@ static int _dump_current_text(struct device *dev,
 			log_print("CHECK: failed to read metadata text at mda_header_%d.raw_locn[%d].offset %llu size %llu part_b %llu %llu", mn, ri,
 				  (unsigned long long)meta_offset, (unsigned long long)meta_size,
 				  (unsigned long long)offset_b, (unsigned long long)size_b);
+			free(meta_buf);
 			return 0;
 		}
 	} else {
 		if (!dev_read_bytes(dev, mda_offset + meta_offset, meta_size, meta_buf)) {
 			log_print("CHECK: failed to read metadata text at mda_header_%d.raw_locn[%d].offset %llu size %llu", mn, ri,
 				  (unsigned long long)meta_offset, (unsigned long long)meta_size);
+			free(meta_buf);
 			return 0;
 		}
 	}
@@ -805,9 +813,9 @@ static int _dump_current_text(struct device *dev,
 	}
 
  out:
-	if (bad)
-		return 0;
-	return 1;
+	free(meta_buf);
+
+	return (!bad) ? 1 : 0;
 }
 
 static int _dump_label_and_pv_header(struct cmd_context *cmd, int print_fields,
@@ -851,6 +859,7 @@ static int _dump_label_and_pv_header(struct cmd_context *cmd, int print_fields,
 	if (!dev_read_bytes(dev, lh_offset, 512, buf)) {
 		log_print("CHECK: failed to read label_header at %llu",
 			  (unsigned long long)lh_offset);
+		free(buf);
 		return 0;
 	}
 
@@ -1045,9 +1054,9 @@ static int _dump_label_and_pv_header(struct cmd_context *cmd, int print_fields,
 			  (unsigned long long)xlate64(dlocn->size));
 	}
 
-	if (bad)
-		return 0;
-	return 1;
+	free(buf);
+
+	return (!bad) ? 1 : 0;
 }
 
 /*
@@ -1100,6 +1109,7 @@ static int _dump_mda_header(struct cmd_context *cmd,
 
 	if (!dev_read_bytes(dev, mda_offset, 512, buf)) {
 		log_print("CHECK: failed to read mda_header at %llu", (unsigned long long)mda_offset);
+		free(buf);
 		return 0;
 	}
 
@@ -1190,11 +1200,9 @@ static int _dump_mda_header(struct cmd_context *cmd,
 
 	/* Should we also check text metadata if it exists in rlocn1? */
  out:
-	if (buf)
-		free(buf);
-	if (bad)
-		return 0;
-	return 1;
+	free(buf);
+
+	return (!bad) ? 1 : 0;
 }
 
 static int _dump_headers(struct cmd_context *cmd,





More information about the lvm-devel mailing list