Re: [PATCH 6/8] Convert resolve_ref_unsafe+xstrdup to resolve_ref

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Nguyễn,

Nguyễn Thái Ngọc Duy wrote:
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index 2b8e73b..6efb1cf 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -696,15 +696,14 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
>  {
>        int ret = 0;
>        struct branch_info old;
> +       char *path;
>        unsigned char rev[20];
>        int flag;
>        memset(&old, 0, sizeof(old));
> -       old.path = xstrdup(resolve_ref_unsafe("HEAD", rev, 0, &flag));
> +       old.path = path = resolve_ref("HEAD", rev, 0, &flag);
>        old.commit = lookup_commit_reference_gently(rev, 1);
> -       if (!(flag & REF_ISSYMREF)) {
> -               free((char *)old.path);
> +       if (!(flag & REF_ISSYMREF))
>                old.path = NULL;
> -       }
>
>        if (old.path && !prefixcmp(old.path, "refs/heads/"))
>                old.name = old.path + strlen("refs/heads/");

This caught my eye immediately: you introduced a new "path" variable.
Let's scroll ahead and see why.

> @@ -718,8 +717,10 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
>        }
>
>        ret = merge_working_tree(opts, &old, new);
> -       if (ret)
> +       if (ret) {
> +               free(path);
>                return ret;
> +       }
>
>        if (!opts->quiet && !old.path && old.commit && new->commit != old.commit)
>                orphaned_commit_warning(old.commit);
> @@ -727,7 +728,7 @@ static int switch_branches(struct checkout_opts *opts, struct branch_info *new)
>        update_refs_for_switch(opts, &old, new);
>
>        ret = post_checkout_hook(old.commit, new->commit, 1);
> -       free((char *)old.path);
> +       free(path);
>        return ret || opts->writeout_error;
>  }

Before application of your patch, if !(flag & REF_ISSYMREF) then
old.path is set to NULL and this free() would've read free(NULL).  Was
this codepath ever reached, and did you fix a bug by introducing the
new "path" variable, or was it never reached but you introduced the
new variable for clarity anyway?  Either case is worth mentioning in
the commit message, I think.

> diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
> index b954ca8..dc19f3c 100644
> --- a/builtin/for-each-ref.c
> +++ b/builtin/for-each-ref.c
> @@ -628,11 +628,8 @@ static void populate_value(struct refinfo *ref)
>
>        if (need_symref && (ref->flag & REF_ISSYMREF) && !ref->symref) {
>                unsigned char unused1[20];
> -               const char *symref;
> -               symref = resolve_ref_unsafe(ref->refname, unused1, 1, NULL);
> -               if (symref)
> -                       ref->symref = xstrdup(symref);
> -               else
> +               ref->symref = resolve_ref(ref->refname, unused1, 1, NULL);
> +               if (!ref->symref)
>                        ref->symref = "";
>        }
> [...]

This bit along with the others follow a common pattern: one temporary
variable was used to capture the value of resolve_ref_unsafe(), before
using xstrdup() on it to perform the actual assignment.  You changed
the resolve_ref_unsafe() to resolve_ref() and got rid of that extra
variable.

Thanks.

-- Ram
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]