File multipath-tools-more-memory-leaks of Package multipath-tools

commit 9683f8fb5a1e6ee12444f1b9fdd751bf2b6daefb
Author: Hannes Reinecke <hare@suse.de>
Date:   Wed Jan 28 09:24:10 2009 +0100

    Plug memory leaks
    
    Running the internal memory checker revealed quite some memory
    leaks.
    
    Signed-off-by: Hannes Reinecke <hare@suse.de>

diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
index 7db43c6..f369517 100644
--- a/libmultipath/blacklist.c
+++ b/libmultipath/blacklist.c
@@ -51,10 +51,10 @@ alloc_ble_device (vector blist)
 {
 	struct blentry_device * ble = MALLOC(sizeof(struct blentry_device));
 
-	if (!ble || !blist)
+	if (!ble)
 		return 1;
 
-	if (!vector_alloc_slot(blist)) {
+	if (!blist || !vector_alloc_slot(blist)) {
 		FREE(ble);
 		return 1;
 	}
@@ -70,7 +70,7 @@ set_ble_device (vector blist, char * vendor, char * product, int origin)
 	if (!blist)
 		return 1;
 
-	ble = VECTOR_SLOT(blist, VECTOR_SIZE(blist) - 1);
+	ble = VECTOR_LAST_SLOT(blist);
 
 	if (!ble)
 		return 1;
@@ -345,10 +345,14 @@ free_blacklist_device (vector blist)
 
 	vector_foreach_slot (blist, ble, i) {
 		if (ble) {
-			regfree(&ble->vendor_reg);
-			regfree(&ble->product_reg);
-			FREE(ble->vendor);
-			FREE(ble->product);
+			if (ble->vendor) {
+				regfree(&ble->vendor_reg);
+				FREE(ble->vendor);
+			}
+			if (ble->product) {
+				regfree(&ble->product_reg);
+				FREE(ble->product);
+			}
 			FREE(ble);
 		}
 	}
diff --git a/libmultipath/config.c b/libmultipath/config.c
index 58485c6..66cefd8 100644
--- a/libmultipath/config.c
+++ b/libmultipath/config.c
@@ -168,6 +168,9 @@ free_hwe (struct hwentry * hwe)
 	if (hwe->prio_name)
 		FREE(hwe->prio_name);
 
+	if (hwe->prio_arg)
+		FREE(hwe->prio_arg);
+
 	if (hwe->bl_product)
 		FREE(hwe->bl_product);
 
@@ -275,7 +278,7 @@ set_param_str(char * str)
 #define merge_str(s) \
 	if (hwe2->s) { \
 		if (hwe1->s) \
-			free(hwe1->s); \
+			FREE(hwe1->s); \
 		if (!(hwe1->s = set_param_str(hwe2->s))) \
 			return 1; \
 	}
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
index 713db6a..c848ea8 100644
--- a/libmultipath/devmapper.c
+++ b/libmultipath/devmapper.c
@@ -213,7 +213,7 @@ dm_addmap (int task, const char *name, const char *target,
 
 	freeout:
 	if (prefixed_uuid)
-		free(prefixed_uuid);
+		FREE(prefixed_uuid);
 
 	addout:
 	dm_task_destroy (dmt);
@@ -1010,8 +1010,11 @@ dm_get_info (char * mapname, struct dm_info ** dmi)
 
 	r = 0;
 out:
-	if (r)
+	if (r) {
 		memset(*dmi, 0, sizeof(struct dm_info));
+		FREE(*dmi);
+		*dmi = NULL;
+	}
 
 	if (dmt)
 		dm_task_destroy(dmt);
diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c
index 33b5cde..91fcda0 100644
--- a/libmultipath/dmparser.c
+++ b/libmultipath/dmparser.c
@@ -197,7 +197,8 @@ disassemble_map (vector pathvec, char * params, struct multipath * mpp)
 
 		if (!mpp->pg)
 			return 1;
-	}
+	} else
+		mpp->pg = NULL;
 
 	/*
 	 * first pg to try
@@ -291,7 +292,7 @@ disassemble_map (vector pathvec, char * params, struct multipath * mpp)
 
 				/* Only call this in multipath client mode */
 				if (!mpp->waiter && store_path(pathvec, pp))
-					goto out;
+					goto out1;
 			}
 			FREE(word);
 
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
index 62eb712..ca0f9a9 100644
--- a/libmultipath/parser.c
+++ b/libmultipath/parser.c
@@ -318,8 +318,10 @@ read_value_block(void)
 					dup = (char *) MALLOC(strlen(str) + 1);
 					memcpy(dup, str, strlen(str));
 
-					if (!vector_alloc_slot(elements))
+					if (!vector_alloc_slot(elements)) {
+						free_strvec(vec);
 						goto out1;
+					}
 
 					vector_set_slot(elements, dup);
 				}
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index d2bfc2d..82df680 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -79,8 +79,10 @@ alloc_pathgroup (void)
 
 	pgp->paths = vector_alloc();
 
-	if (!pgp->paths)
+	if (!pgp->paths) {
 		FREE(pgp);
+		pgp = NULL;
+	}
 
 	return pgp;
 }
@@ -166,8 +168,10 @@ free_multipath (struct multipath * mpp, int free_paths)
 		mpp->alias = NULL;
 	}
 
-	if (mpp->dmi)
+	if (mpp->dmi) {
 		FREE(mpp->dmi);
+		mpp->dmi = NULL;
+	}
 
 	/*
 	 * better own vecs->lock here
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index 4135fc1..9b45204 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -283,6 +283,7 @@ extern int
 update_multipath_strings (struct multipath *mpp, vector pathvec)
 {
 	condlog(4, "%s: %s", mpp->alias, __FUNCTION__);
+
 	free_multipath_attributes(mpp);
 	free_pgvec(mpp->pg, KEEP_PATHS);
 	mpp->pg = NULL;
@@ -395,8 +396,10 @@ add_map_without_path (struct vectors * vecs,
 
 	mpp->alias = alias;
 
-	if (setup_multipath(vecs, mpp))
+	if (setup_multipath(vecs, mpp)) {
+		mpp->alias = NULL;
 		return NULL; /* mpp freed in setup_multipath */
+	}
 
 	if (adopt_paths(vecs->pathvec, mpp))
 		goto out;
diff --git a/multipathd/cli.c b/multipathd/cli.c
index acc8cab..1d781b7 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -230,8 +230,10 @@ get_cmdvec (char * cmd, vector *v)
 	cmdvec = vector_alloc();
 	*v = cmdvec;
 
-	if (!cmdvec)
+	if (!cmdvec) {
+		free_strvec(strvec);
 		return E_NOMEM;
+	}
 
 	vector_foreach_slot(strvec, buff, i) {
 		if (*buff == '"')
@@ -266,6 +268,7 @@ get_cmdvec (char * cmd, vector *v)
 		r = E_NOPARM;
 		goto out;
 	}
+	free_strvec(strvec);
 	return 0;
 
 out:
@@ -374,6 +377,7 @@ parse_cmd (char * cmd, char ** reply, int * len, void * data)
 	if (!h) {
 		*reply = genhelp_handler();
 		*len = strlen(*reply) + 1;
+		free_keys(cmdvec);
 		return 0;
 	}
 
diff --git a/multipathd/main.c b/multipathd/main.c
index 5456a6c..ec37c2d 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -249,6 +249,7 @@ ev_add_map (char * dev, int major, int minor, struct vectors * vecs)
 
 	if (map_present && dm_type(alias, TGT_MPATH) <= 0) {
 		condlog(4, "%s: not a multipath map", alias);
+		FREE(alias);
 		return 0;
 	}
 
@@ -261,6 +262,7 @@ ev_add_map (char * dev, int major, int minor, struct vectors * vecs)
 		 * of uev_add_path
 		 */
 		condlog(0, "%s: devmap already registered", dev);
+		FREE(alias);
 		return 0;
 	}
 
openSUSE Build Service is sponsored by