Module Name:    src
Committed By:   christos
Date:           Wed Mar  9 19:53:32 UTC 2016

Modified Files:
        src/sbin/raidctl: rf_configure.c

Log Message:
PR/50921: David Binderman: Fix memory leak


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sbin/raidctl/rf_configure.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/raidctl/rf_configure.c
diff -u src/sbin/raidctl/rf_configure.c:1.25 src/sbin/raidctl/rf_configure.c:1.26
--- src/sbin/raidctl/rf_configure.c:1.25	Wed Jan 27 13:34:02 2010
+++ src/sbin/raidctl/rf_configure.c	Wed Mar  9 14:53:32 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_configure.c,v 1.25 2010/01/27 18:34:02 christos Exp $	*/
+/*	$NetBSD: rf_configure.c,v 1.26 2016/03/09 19:53:32 christos Exp $	*/
 
 /*
  * Copyright (c) 1995 Carnegie-Mellon University.
@@ -49,7 +49,7 @@
 #include <sys/cdefs.h>
 
 #ifndef lint
-__RCSID("$NetBSD: rf_configure.c,v 1.25 2010/01/27 18:34:02 christos Exp $");
+__RCSID("$NetBSD: rf_configure.c,v 1.26 2016/03/09 19:53:32 christos Exp $");
 #endif
 
 
@@ -495,21 +495,19 @@ rf_ReadSpareTable(RF_SparetWait_t *req, 
 	    spareDisk, spareBlkOffset;
 	char buf[1024], targString[100], errString[100];
 	RF_SpareTableEntry_t **table;
-	FILE *fp;
+	FILE *fp = NULL;
 
 	/* allocate and initialize the table */
-	table = malloc(req->TablesPerSpareRegion * 
-		       sizeof(RF_SpareTableEntry_t *));
+	table = calloc(req->TablesPerSpareRegion, sizeof(*table));
 	if (table == NULL) {
-		warnx("rf_ReadSpareTable: Unable to allocate table");
-		return (NULL);
+		warn("%s: Unable to allocate table", __func__);
+		return NULL;
 	}
 	for (i = 0; i < req->TablesPerSpareRegion; i++) {
-		table[i] = malloc(req->BlocksPerTable * 
-				  sizeof(RF_SpareTableEntry_t));
+		table[i] = calloc(req->BlocksPerTable, sizeof(**table));
 		if (table[i] == NULL) {
-			warnx("rf_ReadSpareTable: Unable to allocate table");
-			return (NULL);  /* XXX should cleanup too! */
+			warn("%s: Unable to allocate table", __func__);
+			goto out;
 		}
 		for (j = 0; j < req->BlocksPerTable; j++)
 			table[i][j].spareDisk =
@@ -518,22 +516,22 @@ rf_ReadSpareTable(RF_SparetWait_t *req, 
 
 	/* 2.  open sparemap file, sanity check */
 	if ((fp = fopen(fname, "r")) == NULL) {
-		warn("rf_ReadSpareTable: Can't open sparemap file %s", fname);
-		return (NULL);
+		warn("%s: Can't open sparemap file %s", __func__, fname);
+		goto out;
 	}
 	if (rf_get_next_nonblank_line(buf, 1024, fp,
-	    "Invalid sparemap file:  can't find header line\n")) {
-		fclose(fp);
-		return (NULL);
-	}
-	if (buf[strlen(buf) - 1] == '\n')
-		buf[strlen(buf) - 1] = '\0';
+	    "Invalid sparemap file:  can't find header line\n"))
+		goto out;
+
+	size_t len = strlen(buf);
+	if (len != 0 && buf[len - 1] == '\n')
+		buf[len - 1] = '\0';
 
 	snprintf(targString, sizeof(targString), "fdisk %d\n", req->fcol);
 	snprintf(errString, sizeof(errString),
 	    "Invalid sparemap file:  can't find \"fdisk %d\" line\n",
 	    req->fcol);
-	while (1) {
+	for (;;) {
 		rf_get_next_nonblank_line(buf, 1024, fp, errString);
 		if (!strncmp(buf, targString, strlen(targString)))
 			break;
@@ -547,8 +545,7 @@ rf_ReadSpareTable(RF_SparetWait_t *req, 
 		if (numFound != 4) {
 			warnx("Sparemap file prematurely exhausted after %d "
 			    "of %d lines", i, linecount);
-			fclose(fp);
-			return (NULL);
+			goto out;
 		}
 
 		table[tableNum][tupleNum].spareDisk = spareDisk;
@@ -558,4 +555,11 @@ rf_ReadSpareTable(RF_SparetWait_t *req, 
 
 	fclose(fp);
 	return ((void *) table);
+out:
+	if (fp)
+		fclose(fp);
+	for (i = 0; i < req->TablesPerSpareRegion; i++)
+		free(table[i]);
+	free(table);
+	return NULL;
 }

Reply via email to