In disassemble_map func, one pp will be allocated and stored in pathvec (only in client mode) and pgp->paths. However, if store_path fails, pp will not be freed, then memory leak problem occurs. Here, we will call free_path to free pp when store_path fails. Signed-off-by: Zhiqiang Liu <liuzhiqiang26@xxxxxxxxxx> Signed-off-by: lixiaokeng <lixiaokeng@xxxxxxxxxx> --- libmultipath/dmparser.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c index 6225838b..3dc77242 100644 --- a/libmultipath/dmparser.c +++ b/libmultipath/dmparser.c @@ -142,6 +142,7 @@ int disassemble_map(vector pathvec, char *params, struct multipath *mpp, int def_minio = 0; struct path * pp; struct pathgroup * pgp; + int pp_need_free_flag = 0; p = params; @@ -293,6 +294,7 @@ int disassemble_map(vector pathvec, char *params, struct multipath *mpp, char devname[FILE_NAME_SIZE]; pp = NULL; + pp_need_free_flag = 0; p += get_word(p, &word); if (!word) @@ -323,9 +325,15 @@ int disassemble_map(vector pathvec, char *params, struct multipath *mpp, strncpy(pp->wwid, mpp->wwid, WWID_SIZE - 1); } + + if (is_daemon) + pp_need_free_flag = 1; + /* Only call this in multipath client mode */ - if (!is_daemon && store_path(pathvec, pp)) + if (!is_daemon && store_path(pathvec, pp)) { + free_path(pp); goto out1; + } } else { if (!strlen(pp->wwid) && strlen(mpp->wwid)) @@ -334,8 +342,11 @@ int disassemble_map(vector pathvec, char *params, struct multipath *mpp, } FREE(word); - if (store_path(pgp->paths, pp)) + if (store_path(pgp->paths, pp)) { + if (pp_need_free_flag) + free_path(pp); goto out; + } /* * Update wwid for multipaths which are not setup -- 2.24.0.windows.2 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel