All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sunshine <sunshine@sunshineco.com>
To: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Cc: Git List <git@vger.kernel.org>
Subject: Re: [PATCH 09/26] upload-pack: move rev-list code out of check_non_tip()
Date: Wed, 25 May 2016 03:36:49 -0400	[thread overview]
Message-ID: <CAPig+cRM_6Yj0=ZOwf8xq9fipCVOFVVLeh5yOpqTxrq4r314iw@mail.gmail.com> (raw)
In-Reply-To: <1460552110-5554-10-git-send-email-pclouds@gmail.com>

On Wed, Apr 13, 2016 at 8:54 AM, Nguyễn Thái Ngọc Duy <pclouds@gmail.com> wrote:
> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
> ---
> diff --git a/upload-pack.c b/upload-pack.c
> @@ -451,7 +451,7 @@ static int is_our_ref(struct object *o)
> -static void check_non_tip(void)
> +static int check_unreachable(struct object_array *src)
> @@ -461,14 +461,6 @@ static void check_non_tip(void)
> -       /*
> -        * In the normal in-process case without
> -        * uploadpack.allowReachableSHA1InWant,
> -        * non-tip requests can never happen.
> -        */
> -       if (!stateless_rpc && !(allow_unadvertised_object_request & ALLOW_REACHABLE_SHA1))
> -               goto error;
> -
> @@ -476,7 +468,7 @@ static void check_non_tip(void)
>         if (start_command(&cmd))
> -               goto error;
> +               return 0;
> @@ -495,16 +487,16 @@ static void check_non_tip(void)
>                 if (write_in_full(cmd.in, namebuf, 42) < 0)
> -                       goto error;
> +                       return 0;
> [...]
> +       for (i = 0; i < src->nr; i++) {
> +               o = src->objects[i].item;
>                 if (is_our_ref(o))
>                         continue;
>                 memcpy(namebuf, oid_to_hex(&o->oid), GIT_SHA1_HEXSZ);
>                 if (write_in_full(cmd.in, namebuf, 41) < 0)
> -                       goto error;
> +                       return 0;
>         }
>         close(cmd.in);

It's a little bit ugly how this close() becomes disconnected after the
refactoring. In the original code, due to the consistent application
of 'goto error', it's reasonably obvious that skipping the close() is
not harmful since the error case die()'s unconditionally (according to
the comment). However, after the refactoring, the function simply
returns without invoking close(), so there's a disconnect, and it's
not obvious without looking at the caller that the program will die().

Also, if this function later gets a new caller, is that caller going
to need intimate knowledge about this potential descriptor leak?

> @@ -516,7 +508,7 @@ static void check_non_tip(void)
>          */
>         i = read_in_full(cmd.out, namebuf, 1);
>         if (i)
> -               goto error;
> +               return 0;
>         close(cmd.out);

Same observation.

It might be clearer if you retained the 'error' label and used it to
ensure that the descriptors get closed:

    cmd.in = -1;
    cmd.out = -1;
    ...
    if (...)
        goto error;
    ...
    /* All the non-tip ... */
    return 1;

error:
    if (cmd.in >= 0)
        close(cmd.in);
    if (cmd.out >= 0)
        close(cmd.out);
    return 0;

>         /*
> @@ -525,15 +517,29 @@ static void check_non_tip(void)
>          * even when it showed no commit.
>          */
>         if (finish_command(&cmd))
> -               goto error;
> +               return 0;

Here too. Does 'cmd' need to be cleaned up if the function bails
before finish_command()?

>         /* All the non-tip ones are ancestors of what we advertised */
> -       return;
> +       return 1;
> +}
> +
> +static void check_non_tip(void)
> +{
> +       int i;
> +
> +       /*
> +        * In the normal in-process case without
> +        * uploadpack.allowReachableSHA1InWant,
> +        * non-tip requests can never happen.
> +        */
> +       if (!stateless_rpc && !(allow_unadvertised_object_request & ALLOW_REACHABLE_SHA1))
> +               ;               /* error */
> +       else if (check_unreachable(&want_obj))
> +               return;

With the loss of the 'error' label (below), this logic becomes a bit
more difficult to follow. I wonder if it would help to invert the
sense of the conditional...

    if (stateless_rpc || ...)
        if (check_unreachable(...))
            return;

Or, perhaps, retain the 'error' label:

    if (!stateless_rpc && ...)
        goto error:
    if (check_unreachable(...))
        return;

error:
    /* Pick one ... */

I think I might find the latter a bit clearer, but it's highly subjective.

> -error:
>         /* Pick one of them (we know there at least is one) */
>         for (i = 0; i < want_obj.nr; i++) {
> -               o = want_obj.objects[i].item;
> +               struct object *o = want_obj.objects[i].item;
>                 if (!is_our_ref(o))
>                         die("git upload-pack: not our ref %s",
>                             oid_to_hex(&o->oid));

  reply	other threads:[~2016-05-25  7:36 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-13 12:54 [PATCH 00/26] nd/shallow-deepen updates Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 01/26] remote-curl.c: convert fetch_git() to use argv_array Nguyễn Thái Ngọc Duy
2016-05-25  6:41   ` Eric Sunshine
2016-04-13 12:54 ` [PATCH 02/26] transport-helper.c: refactor set_helper_option() Nguyễn Thái Ngọc Duy
2016-05-25  6:47   ` Eric Sunshine
2016-04-13 12:54 ` [PATCH 03/26] upload-pack: move shallow deepen code out of receive_needs() Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 04/26] upload-pack: move "shallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 05/26] upload-pack: remove unused variable "backup" Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 06/26] upload-pack: move "unshallow" sending code out of deepen() Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 07/26] upload-pack: use skip_prefix() instead of starts_with() Nguyễn Thái Ngọc Duy
2016-05-25  7:02   ` Eric Sunshine
2016-04-13 12:54 ` [PATCH 08/26] upload-pack: tighten number parsing at "deepen" lines Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 09/26] upload-pack: move rev-list code out of check_non_tip() Nguyễn Thái Ngọc Duy
2016-05-25  7:36   ` Eric Sunshine [this message]
2016-04-13 12:54 ` [PATCH 10/26] fetch-pack: use skip_prefix() instead of starts_with() Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 11/26] fetch-pack: use a common function for verbose printing Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 12/26] fetch-pack.c: mark strings for translating Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 13/26] fetch-pack: use a separate flag for fetch in deepening mode Nguyễn Thái Ngọc Duy
2016-04-13 12:54 ` [PATCH 14/26] shallow.c: implement a generic shallow boundary finder based on rev-list Nguyễn Thái Ngọc Duy
2016-05-27  4:00   ` Eric Sunshine
2016-04-13 12:54 ` [PATCH 15/26] upload-pack: add deepen-since to cut shallow repos based on time Nguyễn Thái Ngọc Duy
2016-04-13 12:55 ` [PATCH 16/26] fetch: define shallow boundary with --shallow-since Nguyễn Thái Ngọc Duy
2016-04-13 12:55 ` [PATCH 17/26] clone: define shallow clone boundary based on time " Nguyễn Thái Ngọc Duy
2016-04-13 12:55 ` [PATCH 18/26] t5500, t5539: tests for shallow depth since a specific date Nguyễn Thái Ngọc Duy
2016-06-05  4:43   ` Eric Sunshine
2016-04-13 12:55 ` [PATCH 19/26] refs: add expand_ref() Nguyễn Thái Ngọc Duy
2016-04-13 12:55 ` [PATCH 20/26] upload-pack: support define shallow boundary by excluding revisions Nguyễn Thái Ngọc Duy
2016-04-13 12:55 ` [PATCH 21/26] fetch: define shallow boundary with --shallow-exclude Nguyễn Thái Ngọc Duy
2016-06-05  5:03   ` Eric Sunshine
2016-04-13 12:55 ` [PATCH 22/26] clone: define shallow clone " Nguyễn Thái Ngọc Duy
2016-06-05  5:05   ` Eric Sunshine
2016-04-13 12:55 ` [PATCH 23/26] t5500, t5539: tests for shallow depth excluding a ref Nguyễn Thái Ngọc Duy
2016-06-05  5:09   ` Eric Sunshine
2016-04-13 12:55 ` [PATCH 24/26] upload-pack: split check_unreachable() in two, prep for get_reachable_list() Nguyễn Thái Ngọc Duy
2016-06-05 19:43   ` Eric Sunshine
2016-06-10 12:14     ` Duy Nguyen
2016-04-13 12:55 ` [PATCH 25/26] upload-pack: add get_reachable_list() Nguyễn Thái Ngọc Duy
2016-06-05 19:51   ` Eric Sunshine
2016-04-13 12:55 ` [PATCH 26/26] fetch, upload-pack: --deepen=N extends shallow boundary by N commits Nguyễn Thái Ngọc Duy
2016-04-14 16:12 ` [PATCH 00/26] nd/shallow-deepen updates Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPig+cRM_6Yj0=ZOwf8xq9fipCVOFVVLeh5yOpqTxrq4r314iw@mail.gmail.com' \
    --to=sunshine@sunshineco.com \
    --cc=git@vger.kernel.org \
    --cc=pclouds@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.