<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>