[Libguestfs] [PATCH v4 1/3] do_btrfs_qgroup_show: fix a bad return value

Chen, Hanxiao chenhanxiao at cn.fujitsu.com
Thu Jun 18 01:52:10 UTC 2015



> -----Original Message-----
> From: libguestfs-bounces at redhat.com [mailto:libguestfs-bounces at redhat.com] On
> Behalf Of Pino Toscano
> Sent: Wednesday, June 17, 2015 10:28 PM
> To: libguestfs at redhat.com
> Subject: Re: [Libguestfs] [PATCH v4 1/3] do_btrfs_qgroup_show: fix a bad return
> value
> 
> On Wednesday 17 June 2015 16:19:31 Chen Hanxiao wrote:
> > We should not use tmp lines buffer as return value,
> > for lines buffer will be freed.
> 
> s/tmp/temporary/
> 

Fine.

> > Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> > ---
> > v4: take advantage of sscanf's '%m'.
> > v3: fix test case failure
> >
> >  daemon/btrfs.c | 40 ++++++++++++++++++----------------------
> >  1 file changed, 18 insertions(+), 22 deletions(-)
> >
> > diff --git a/daemon/btrfs.c b/daemon/btrfs.c
> > index 7b14bac..8d03caa 100644
> > --- a/daemon/btrfs.c
> > +++ b/daemon/btrfs.c
> > @@ -1249,7 +1249,7 @@ do_btrfs_qgroup_show (const char *path)
> >    CLEANUP_FREE char *err = NULL;
> >    CLEANUP_FREE char *out = NULL;
> >    int r;
> > -  char **lines;
> > +  CLEANUP_FREE_STRING_LIST char **lines = NULL;
> >
> >    path_buf = sysroot_path (path);
> >    if (path_buf == NULL) {
> > @@ -1275,17 +1275,19 @@ do_btrfs_qgroup_show (const char *path)
> >    if (!lines)
> >      return NULL;
> >
> > -  /* line 0 and 1 are:
> > +  /* Output of `btrfs qgroup show' is like:
> > +   *
> > +   *  qgroupid         rfer         excl
> > +   *  --------         ----         ----
> > +   *  0/5        9249849344   9249849344
> >     *
> > -   * qgroupid rfer          excl
> > -   * -------- ----          ----
> >     */
> >    size_t nr_qgroups = count_strings (lines) - 2;
> >    guestfs_int_btrfsqgroup_list *ret = NULL;
> >    ret = malloc (sizeof *ret);
> >    if (!ret) {
> >      reply_with_perror ("malloc");
> > -    goto error;
> > +    return NULL;
> >    }
> >
> >    ret->guestfs_int_btrfsqgroup_list_len = nr_qgroups;
> > @@ -1293,38 +1295,32 @@ do_btrfs_qgroup_show (const char *path)
> >      calloc (nr_qgroups, sizeof (struct guestfs_int_btrfsqgroup));
> >    if (ret->guestfs_int_btrfsqgroup_list_val == NULL) {
> >      reply_with_perror ("malloc");
> > -    goto error;
> > +    free (ret);
> > +    return NULL;
> >    }
> 
> You don't need the change here, if later in the "error:" label you keep
> the "if (ret)" condition.
> 

OK.
Although it already works fine.

Will changed in next version.

Regards,
- Chen

> >    for (i = 0; i < nr_qgroups; ++i) {
> >      char *line = lines[i + 2];
> >      struct guestfs_int_btrfsqgroup *this  =
> >        &ret->guestfs_int_btrfsqgroup_list_val[i];
> > -    uint64_t dummy1, dummy2;
> > -    char *p;
> >
> > -    if (sscanf (line, "%" SCNu64 "/%" SCNu64 " %" SCNu64 " %" SCNu64,
> > -                &dummy1, &dummy2, &this->btrfsqgroup_rfer,
> > -                &this->btrfsqgroup_excl) != 4) {
> > +    if (sscanf (line, "%m[0-9/] %" SCNu64 " %" SCNu64,
> > +                &this->btrfsqgroup_id, &this->btrfsqgroup_rfer,
> > +                &this->btrfsqgroup_excl) != 3) {
> >        reply_with_error ("cannot parse output of qgroup show command: %s", line);
> >        goto error;
> >      }
> > -    p = strchr(line, ' ');
> > -    if (!p) {
> > -      reply_with_error ("truncated line: %s", line);
> > -      goto error;
> > -    }
> > -    *p = '\0';
> > -    this->btrfsqgroup_id = line;
> >    }
> >
> > -  free (lines);
> >    return ret;
> >
> >  error:
> > -  free_stringslen (lines, nr_qgroups + 2);
> > -  if (ret)
> > -    free (ret->guestfs_int_btrfsqgroup_list_val);
> > +  for (i = 0; i < nr_qgroups; ++i) {
> > +    struct guestfs_int_btrfsqgroup *this =
> > +      &ret->guestfs_int_btrfsqgroup_list_val[i];
> > +    free (this->btrfsqgroup_id);
> 
> No need to save "this", just
>   free (ret->guestfs_int_btrfsqgroup_list_val[i].btrfsqgroup_id);
> should be enough (still well under 80 characters :) ).
> 
> Thanks,
> --
> Pino Toscano
> 
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs




More information about the Libguestfs mailing list