On 2020/7/23 21:22, Benjamin Marzinski wrote: > On Thu, Jul 23, 2020 at 09:28:51AM +0800, Zhiqiang Liu wrote: >> >> >> On 2020/7/23 4:53, Benjamin Marzinski wrote: >>> On Wed, Jul 22, 2020 at 04:41:28PM +0800, Zhiqiang Liu wrote: >>>> 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. >>>> >>> >>> Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> >>> >>> However, this will need to get reworked on top of Martin's patches (or >>> incorporated into his next verion patchset). >>> >> >> Thanks for your suggestion. >> Which branch should I choose to modify my patch? > > Martin's latest set of commits is available here: > https://github.com/mwilck/multipath-tools/tree/ups/submit-2007 > >> >> Thanks for your patience. I will send the V2 patch based on the branch: ups/submit-2007. >>> -Ben >>> >>>> 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