Brian King <brk...@linux.vnet.ibm.com> writes:

> Fix a memory leak in update-all-ucodes.
>
> Print a status summary to the user if, when chosing to update all devices
> to the latest microcode level using the ncurses interface, all devices are 
> update
> which says "All devices up to date"
>

Hi Brian,

Thanks for the patch.  Other than some minor issues, it looks good to
me.  Please fix before pushing.

> ---
>
>  iprconfig.c |   24 +++++++++++++++++-------
>  iprconfig.h |    2 ++
>  2 files changed, 19 insertions(+), 7 deletions(-)
>
> diff -puN iprconfig.c~iprutils_update_all_ucodes_fixes iprconfig.c
> --- iprutils.patch/iprconfig.c~iprutils_update_all_ucodes_fixes       
> 2015-09-16 15:51:55.413526784 -0500
> +++ iprutils.patch-bjking1/iprconfig.c        2015-09-16 16:23:16.847135630 
> -0500
> @@ -11549,6 +11549,7 @@ int download_all_ucode(i_container *i_co
>       int header_lines;
>       char line[BUFSIZ];
>       char *body;
> +     int rc = 93;

Please use 'RC_93_All_Up_To_Date' here.
>
>       processing();
>       i_con = free_i_con(i_con);
> @@ -11564,11 +11565,15 @@ int download_all_ucode(i_container *i_co
>                               continue;
>
>                       lfw = get_latest_fw_image(dev);
> -                     if (!lfw || lfw->version <= get_fw_version(dev))
> +                     if (!lfw || lfw->version <= get_fw_version(dev)) {
> +                             free(lfw);
>                               continue;
> +                     }
>
> -                     if (ioa->is_secondary)
> +                     if (ioa->is_secondary) {
> +                             free(lfw);
>                               continue;
> +                     }

Nice catch.  Sorry I missed it. :)

>
>                       sprintf(line, "%-6s %-10X %-10s %s\n",
>                               basename(dev->gen_name), lfw->version,
> @@ -11585,22 +11590,27 @@ int download_all_ucode(i_container *i_co
>               }
>       }
>
> -     n_confirm_download_all_ucode.body = body;
> -     s_out = screen_driver(&n_confirm_download_all_ucode, header_lines, 
> i_con);
> +     if (update_list) {
> +             n_confirm_download_all_ucode.body = body;
> +             s_out = screen_driver(&n_confirm_download_all_ucode, 
> header_lines, i_con);
> +     }


>
> -     if (s_out && s_out->rc != CANCEL_FLAG) {
> +     if (update_list && (!s_out || s_out->rc != CANCEL_FLAG)) {

Adding update_list to this condition is redundant with the while below.

Also, It think the only way for s_out to be NULL but update_list to
exist, is malloc failing in screen_driver, which would cause us to
segfault before reaching this code (we gotta fix that).  Either way, if
s_out is NULL but update_list isn't, we've hit a bug and we should fail
execution instead of attempting the update.

I recommend keeping the original check here.

>               while (update_list) {
>                       elem = update_list;
>                       update_list = elem->next;
>                       update_ucode(elem->dev, elem->lfw);
> +                     free(elem->lfw);
>                       free(elem);
>               }
>       }
>
> -     if (s_out)
> +     if (s_out) {
> +             rc = s_out->rc;
>               free(s_out);
> +     }

By making the call to screen_driver conditional and with this change,
s_out can be used without being initialized, since screen_driver will no
longer be called if update_list == NULL.  This causes a Segfault in my
system if there isn't any devices to update.  Initializing s_out to NULL
will fix this.

Thanks!

-- 
Gabriel Krisman Bertazi


------------------------------------------------------------------------------
_______________________________________________
Iprdd-devel mailing list
Iprdd-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iprdd-devel

Reply via email to