[Libguestfs] [PATCH v4 2/3] do_btrfs_subvolume_list: fix a bad return value
Chen, Hanxiao
chenhanxiao at cn.fujitsu.com
Thu Jun 18 09:02:05 UTC 2015
Hi,
> -----Original Message-----
> From: libguestfs-bounces at redhat.com [mailto:libguestfs-bounces at redhat.com] On
> Behalf Of Pino Toscano
> Sent: Thursday, June 18, 2015 4:32 PM
> To: libguestfs at redhat.com
> Subject: Re: [Libguestfs] [PATCH v4 2/3] do_btrfs_subvolume_list: fix a bad return
> value
>
[snip]
> > >
> >
> > If we succeeded at malloc(3) but failed at calloc(3),
> > we will goto error.
> >
> > At this time we've got a space with uninitialized data because of malloc(3),
> > but no space for guestfs_int_btrfsqgroup_list_val.
> > When processing in label error, we could not know:
> > ret->guestfs_int_btrfssubvolume_list_val[i].btrfssubvolume_path
> > is a valid address.
> >
> > 1) One solution is use calloc to replace the first malloc.
> > Then:
> > if (ret-> guestfs_int_btrfssubvolume_list_val)
> > for (...)
> >
> > It costs more codes.
> >
> > 2) use the current solution
> >
> > I think the process in this patch should be a choice.
> > How do you think?
>
> If calloc (nr_subvolumes, sizeof (struct guestfs_int_btrfssubvolume))
> fails, then ret->guestfs_int_btrfssubvolume_list_val is already a null
> pointer, which means you can just check for it as you do in (1) above,
> with no need to switch from malloc to calloc.
>
> The other alternative is to use more labels for error conditions in a
> symmetric way, like:
>
> ptr1 = malloc (...);
> if (ptr1 == NULL)
> goto error1;
>
> ptr1->subptr1 = malloc (...);
> if (ptr1->subptr1 == NULL)
> goto error2;
>
> ptr1->subptr2 = malloc (...);
> if (ptr1->subptr2 == NULL)
> goto error3;
>
> ...
>
> error3:
> free (ptr1->subptr1);
> error2:
> free (ptr1);
> error1:
> ...
>
Thanks for your detail clarification and kindly patience.
Although my patch could work, I'll send a new version as your comments.
Regards,
- Chen
More information about the Libguestfs
mailing list