<div dir="ltr">Merged.<div>Thanks.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jul 26, 2016 at 12:09 PM, <span dir="ltr"><<a href="mailto:zhang.kai16@zte.com.cn" target="_blank">zhang.kai16@zte.com.cn</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: "zhang.kai" <<a href="mailto:zhang.kai16@zte.com.cn">zhang.kai16@zte.com.cn</a>><br>
<br>
In the path group functions, memory leak would happen if the exceptional situation were met.<br>
<br>
Signed-off-by: zhang.kai <<a href="mailto:zhang.kai16@zte.com.cn">zhang.kai16@zte.com.cn</a>><br>
---<br>
libmultipath/pgpolicies.c | 79 +++++++++++++++++++++++++++++------------------<br>
1 file changed, 49 insertions(+), 30 deletions(-)<br>
<br>
diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c<br>
index f440441..3064aab 100644<br>
--- a/libmultipath/pgpolicies.c<br>
+++ b/libmultipath/pgpolicies.c<br>
@@ -123,11 +123,11 @@ group_by_node_name (struct multipath * mp) {<br>
goto out1;<br>
<br>
if (store_pathgroup(mp->pg, pgp))<br>
- goto out1;<br>
+ goto out2;<br>
<br>
/* feed the first path */<br>
if (store_path(pgp->paths, pp))<br>
- goto out1;<br>
+ goto out2;<br>
<br>
bitmap[i] = 1;<br>
<br>
@@ -141,7 +141,7 @@ group_by_node_name (struct multipath * mp) {<br>
if (!strncmp(pp->tgt_node_name, pp2->tgt_node_name,<br>
NODE_NAME_SIZE)) {<br>
if (store_path(pgp->paths, pp2))<br>
- goto out1;<br>
+ goto out2;<br>
<br>
bitmap[j] = 1;<br>
}<br>
@@ -152,6 +152,8 @@ group_by_node_name (struct multipath * mp) {<br>
free_pathvec(mp->paths, KEEP_PATHS);<br>
mp->paths = NULL;<br>
return 0;<br>
+out2:<br>
+ free_pathgroup(pgp, KEEP_PATHS);<br>
out1:<br>
FREE(bitmap);<br>
out:<br>
@@ -197,11 +199,11 @@ group_by_serial (struct multipath * mp) {<br>
goto out1;<br>
<br>
if (store_pathgroup(mp->pg, pgp))<br>
- goto out1;<br>
+ goto out2;<br>
<br>
/* feed the first path */<br>
if (store_path(pgp->paths, pp))<br>
- goto out1;<br>
+ goto out2;<br>
<br>
bitmap[i] = 1;<br>
<br>
@@ -214,7 +216,7 @@ group_by_serial (struct multipath * mp) {<br>
<br>
if (0 == strcmp(pp->serial, pp2->serial)) {<br>
if (store_path(pgp->paths, pp2))<br>
- goto out1;<br>
+ goto out2;<br>
<br>
bitmap[j] = 1;<br>
}<br>
@@ -225,6 +227,8 @@ group_by_serial (struct multipath * mp) {<br>
free_pathvec(mp->paths, KEEP_PATHS);<br>
mp->paths = NULL;<br>
return 0;<br>
+out2:<br>
+ free_pathgroup(pgp, KEEP_PATHS);<br>
out1:<br>
FREE(bitmap);<br>
out:<br>
@@ -254,15 +258,17 @@ one_path_per_group (struct multipath * mp)<br>
goto out;<br>
<br>
if (store_pathgroup(mp->pg, pgp))<br>
- goto out;<br>
+ goto out1;<br>
<br>
if (store_path(pgp->paths, pp))<br>
- goto out;<br>
+ goto out1;<br>
}<br>
sort_pathgroups(mp);<br>
free_pathvec(mp->paths, KEEP_PATHS);<br>
mp->paths = NULL;<br>
return 0;<br>
+out1:<br>
+ free_pathgroup(pgp, KEEP_PATHS);<br>
out:<br>
free_pgvec(mp->pg, KEEP_PATHS);<br>
mp->pg = NULL;<br>
@@ -290,14 +296,17 @@ one_group (struct multipath * mp) /* aka multibus */<br>
goto out;<br>
<br>
vector_free(pgp->paths);<br>
- pgp->paths = mp->paths;<br>
- mp->paths = NULL;<br>
<br>
if (store_pathgroup(mp->pg, pgp))<br>
- goto out;<br>
+ goto out1;<br>
+<br>
+ pgp->paths = mp->paths;<br>
+ mp->paths = NULL;<br>
}<br>
<br>
return 0;<br>
+out1:<br>
+ free_pathgroup(pgp, KEEP_PATHS);<br>
out:<br>
free_pgvec(mp->pg, KEEP_PATHS);<br>
mp->pg = NULL;<br>
@@ -311,6 +320,7 @@ group_by_prio (struct multipath * mp)<br>
unsigned int prio;<br>
struct path * pp;<br>
struct pathgroup * pgp;<br>
+ vector pathvec = NULL;<br>
<br>
if (!mp->pg)<br>
mp->pg = vector_alloc();<br>
@@ -318,8 +328,18 @@ group_by_prio (struct multipath * mp)<br>
if (!mp->pg)<br>
return 1;<br>
<br>
- while (VECTOR_SIZE(mp->paths) > 0) {<br>
- pp = VECTOR_SLOT(mp->paths, 0);<br>
+ pathvec = vector_alloc();<br>
+ if (!pathvec)<br>
+ goto out;<br>
+<br>
+ vector_foreach_slot(mp->paths, pp, i) {<br>
+ if (!vector_alloc_slot(pathvec))<br>
+ goto out1;<br>
+ vector_set_slot(pathvec, pp);<br>
+ }<br>
+<br>
+ while (VECTOR_SIZE(pathvec) > 0) {<br>
+ pp = VECTOR_SLOT(pathvec, 0);<br>
prio = pp->priority;<br>
<br>
/*<br>
@@ -339,46 +359,45 @@ group_by_prio (struct multipath * mp)<br>
pgp = alloc_pathgroup();<br>
<br>
if (!pgp)<br>
- goto out;<br>
+ goto out1;<br>
<br>
- if (store_path(pgp->paths, VECTOR_SLOT(mp->paths, 0))) {<br>
- free_pathgroup(pgp, KEEP_PATHS);<br>
- goto out;<br>
- }<br>
+ if (store_path(pgp->paths, VECTOR_SLOT(pathvec, 0)))<br>
+ goto out2;<br>
<br>
- vector_del_slot(mp->paths, 0);<br>
+ vector_del_slot(pathvec, 0);<br>
<br>
/*<br>
* Store the new path group into the vector.<br>
*/<br>
if (i < VECTOR_SIZE(mp->pg)) {<br>
- if (!vector_insert_slot(mp->pg, i, pgp)) {<br>
- free_pathgroup(pgp, KEEP_PATHS);<br>
- goto out;<br>
- }<br>
+ if (!vector_insert_slot(mp->pg, i, pgp))<br>
+ goto out2;<br>
} else {<br>
- if (store_pathgroup(mp->pg, pgp)) {<br>
- free_pathgroup(pgp, KEEP_PATHS);<br>
- goto out;<br>
- }<br>
+ if (store_pathgroup(mp->pg, pgp))<br>
+ goto out2;<br>
}<br>
<br>
/*<br>
* add the other paths with the same prio<br>
*/<br>
- vector_foreach_slot(mp->paths, pp, i) {<br>
+ vector_foreach_slot(pathvec, pp, i) {<br>
if (pp->priority == prio) {<br>
if (store_path(pgp->paths, pp))<br>
- goto out;<br>
+ goto out2;<br>
<br>
- vector_del_slot(mp->paths, i);<br>
+ vector_del_slot(pathvec, i);<br>
i--;<br>
}<br>
}<br>
}<br>
+ free_pathvec(pathvec, KEEP_PATHS);<br>
free_pathvec(mp->paths, KEEP_PATHS);<br>
mp->paths = NULL;<br>
return 0;<br>
+out2:<br>
+ free_pathgroup(pgp, KEEP_PATHS);<br>
+out1:<br>
+ free_pathvec(pathvec, KEEP_PATHS);<br>
out:<br>
free_pgvec(mp->pg, KEEP_PATHS);<br>
mp->pg = NULL;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.8.1.windows.1<br>
<br>
--<br>
dm-devel mailing list<br>
<a href="mailto:dm-devel@redhat.com">dm-devel@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/dm-devel" rel="noreferrer" target="_blank">https://www.redhat.com/mailman/listinfo/dm-devel</a><br>
</font></span></blockquote></div><br></div>