All of lore.kernel.org
 help / color / mirror / Atom feed
From: Duy Nguyen <pclouds@gmail.com>
To: Martin Erik Werner <martinerikwerner@gmail.com>
Cc: "Torsten Bögershausen" <tboegi@web.de>,
	"Git Mailing List" <git@vger.kernel.org>,
	richih@debian.org
Subject: Re: [PATCH v2 2/2] setup: Don't dereference in-tree symlinks for absolute paths
Date: Mon, 27 Jan 2014 07:49:42 +0700	[thread overview]
Message-ID: <CACsJy8AwBXtYTbQhcAfYgwuEGrzbMG9SDo8JOpSVF945O7VPyQ@mail.gmail.com> (raw)
In-Reply-To: <1390781250-20389-2-git-send-email-martinerikwerner@gmail.com>

On Mon, Jan 27, 2014 at 7:07 AM, Martin Erik Werner
<martinerikwerner@gmail.com> wrote:
> diff --git a/setup.c b/setup.c
> index 5432a31..0789a96 100644
> --- a/setup.c
> +++ b/setup.c
> @@ -22,11 +22,51 @@ char *prefix_path_gently(const char *prefix, int len,
>         const char *orig = path;
>         char *sanitized;
>         if (is_absolute_path(orig)) {
> -               const char *temp = real_path(path);
> -               sanitized = xmalloc(len + strlen(temp) + 1);
> -               strcpy(sanitized, temp);
> +               int i, match;
> +               size_t wtpartlen;
> +               char *npath, *wtpart;
> +               struct string_list list = STRING_LIST_INIT_DUP;
> +               const char *work_tree = get_git_work_tree();
> +               if (!work_tree)
> +                       return NULL;
> +               npath = xmalloc(strlen(path) + 1);
>                 if (remaining_prefix)
>                         *remaining_prefix = 0;
> +               if (normalize_path_copy_len(npath, path, remaining_prefix)) {
> +                       free(npath);
> +                       return NULL;
> +               }
> +
> +               string_list_split(&list, npath, '/', -1);
> +               wtpart = xmalloc(strlen(npath) + 1);
> +               i = 0;
> +               match = 0;

> +               strcpy(wtpart, list.items[i++].string);
> +               strcat(wtpart, "/");
> +               if (strcmp(real_path(wtpart), work_tree) == 0) {
> +                       match = 1;
> +               } else {

Could we remove this part and let the while loop handle the first path
component too? The only difference I see is if this code matches, we
have a trailing slash, while the "while" loop does not have a trailing
slash in wtpart.

> +                       while (i < list.nr) {
> +                               strcat(wtpart, list.items[i++].string);
> +                               if (strcmp(real_path(wtpart), work_tree) == 0) {
> +                                       match = 1;
> +                                       break;
> +                               }
> +                               strcat(wtpart, "/");
> +                       }
> +               }
> +               string_list_clear(&list, 0);
> +               if (!match) {
> +                       free(npath);
> +                       free(wtpart);
> +                       return NULL;
> +               }
> +
> +               wtpartlen = strlen(wtpart);
> +               sanitized = xmalloc(strlen(npath) - wtpartlen);
> +               strcpy(sanitized, npath + wtpartlen + 1);

This "+ 1" is to ignore '/', isn't it? If so we should not do if match
is set 1 outside "while" loop.

> +               free(npath);
> +               free(wtpart);

All this new code looks long enough to be a separate function with a
meaningful name. And we could travese through each path component in
npath without wtpart (replacing '/' with '\0' to terminate the string
temporarily for real_path()). But it's up to you. Whichever way is
easier to read to you.

>         } else {
>                 sanitized = xmalloc(len + strlen(path) + 1);
>                 if (len)
> @@ -34,26 +74,10 @@ char *prefix_path_gently(const char *prefix, int len,
>                 strcpy(sanitized + len, path);
>                 if (remaining_prefix)
>                         *remaining_prefix = len;
> -       }
> -       if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix))
> -               goto error_out;
> -       if (is_absolute_path(orig)) {
> -               size_t root_len, len, total;
> -               const char *work_tree = get_git_work_tree();
> -               if (!work_tree)
> -                       goto error_out;
> -               len = strlen(work_tree);
> -               root_len = offset_1st_component(work_tree);
> -               total = strlen(sanitized) + 1;
> -               if (strncmp(sanitized, work_tree, len) ||
> -                   (len > root_len && sanitized[len] != '\0' && sanitized[len] != '/')) {
> -               error_out:
> +               if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix)) {
>                         free(sanitized);
>                         return NULL;
>                 }
> -               if (sanitized[len] == '/')
> -                       len++;
> -               memmove(sanitized, sanitized + len, total - len);
>         }
>         return sanitized;
>  }
-- 
Duy

  reply	other threads:[~2014-01-27  0:50 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-15 12:48 git-mv with absolute path derefereces symlinks Martin Erik Werner
2014-01-26 14:22 ` [PATCH 0/2] in-tree symlink handling with absolute paths Martin Erik Werner
2014-01-26 14:22   ` [PATCH 1/2] t0060: Add test for manipulating symlinks via " Martin Erik Werner
2014-01-26 14:22   ` [PATCH 2/2] setup: Don't dereference in-tree symlinks for " Martin Erik Werner
2014-01-26 17:19     ` Torsten Bögershausen
2014-01-27  0:07       ` Martin Erik Werner
2014-01-27  0:07         ` [PATCH v2 " Martin Erik Werner
2014-01-27  0:49           ` Duy Nguyen [this message]
2014-01-27 16:31           ` Junio C Hamano
2014-01-31 20:21           ` [PATCH v3 0/4] " Martin Erik Werner
2014-02-02  1:59             ` [PATCH v4 0/4] Handling of " Martin Erik Werner
2014-02-02  1:59               ` [PATCH v4 1/4] t0060: Add test for manipulating symlinks via " Martin Erik Werner
2014-02-02  1:59               ` [PATCH v4 2/4] t0060: Add test for prefix_path when path == work tree Martin Erik Werner
2014-02-02  1:59               ` [PATCH v4 3/4] setup: Add 'abspath_part_inside_repo' function Martin Erik Werner
2014-02-02  2:19                 ` Duy Nguyen
2014-02-02  2:23                   ` Duy Nguyen
2014-02-02 11:13                   ` Martin Erik Werner
2014-02-02 11:21                     ` David Kastrup
2014-02-02 11:37                       ` Torsten Bögershausen
2014-02-02 12:09                         ` Martin Erik Werner
2014-02-02 12:27                           ` Torsten Bögershausen
2014-02-02 12:15                     ` Duy Nguyen
2014-02-02  1:59               ` [PATCH v4 4/4] setup: Don't dereference in-tree symlinks for absolute paths Martin Erik Werner
2014-02-02 16:35               ` [PATCH v5 0/5] Handling of " Martin Erik Werner
2014-02-02 16:35                 ` [PATCH v5 1/5] t0060: Add test for manipulating symlinks via " Martin Erik Werner
2014-02-03 18:50                   ` Junio C Hamano
2014-02-03 19:52                     ` Junio C Hamano
2014-02-03 20:12                     ` Martin Erik Werner
2014-02-02 16:35                 ` [PATCH v5 2/5] t0060: Add test for prefix_path when path == work tree Martin Erik Werner
2014-02-02 16:35                 ` [PATCH v5 3/5] t0060: Add tests for prefix_path when path begins with " Martin Erik Werner
2014-02-02 16:35                 ` [PATCH v5 4/5] setup: Add 'abspath_part_inside_repo' function Martin Erik Werner
2014-02-03 21:00                   ` Junio C Hamano
2014-02-03 23:16                     ` Martin Erik Werner
2014-02-04 18:09                       ` Junio C Hamano
2014-02-04 18:32                         ` Martin Erik Werner
2014-02-02 16:35                 ` [PATCH v5 5/5] setup: Don't dereference in-tree symlinks for absolute paths Martin Erik Werner
2014-02-03  4:15                   ` Duy Nguyen
2014-02-03 13:17                     ` Martin Erik Werner
2014-02-04  0:05                       ` Junio C Hamano
2014-02-04 14:25                 ` [PATCH v6 0/6] Handling of " Martin Erik Werner
2014-02-04 14:25                   ` [PATCH v6 1/6] t3004: Add test for ls-files on symlinks via " Martin Erik Werner
2014-02-04 14:25                   ` [PATCH v6 2/6] t0060: Add test for prefix_path " Martin Erik Werner
2014-02-04 14:25                   ` [PATCH v6 3/6] t0060: Add test for prefix_path when path == work tree Martin Erik Werner
2014-02-04 14:25                   ` [PATCH v6 4/6] t0060: Add tests for prefix_path when path begins with " Martin Erik Werner
2014-02-04 20:00                     ` Torsten Bögershausen
2014-02-04 20:07                       ` Junio C Hamano
2014-02-04 14:25                   ` [PATCH v6 5/6] setup: Add 'abspath_part_inside_repo' function Martin Erik Werner
2014-02-04 19:18                     ` Junio C Hamano
2014-02-04 14:25                   ` [PATCH v6 6/6] setup: Don't dereference in-tree symlinks for absolute paths Martin Erik Werner
2014-01-31 20:22           ` [PATCH v3 1/4] t0060: Add test for manipulating symlinks via " Martin Erik Werner
2014-01-31 20:22           ` [PATCH v3 2/4] t0060: Add test for prefix_path when path == work tree Martin Erik Werner
2014-01-31 20:22           ` [PATCH v3 3/4] setup: Add 'abspath_part_inside_repo' function Martin Erik Werner
2014-01-31 22:37             ` Torsten Bögershausen
2014-02-01  1:31               ` Martin Erik Werner
2014-02-01  2:31             ` Duy Nguyen
2014-01-31 20:23           ` [PATCH v3 4/4] setup: Don't dereference in-tree symlinks for absolute paths Martin Erik Werner

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=CACsJy8AwBXtYTbQhcAfYgwuEGrzbMG9SDo8JOpSVF945O7VPyQ@mail.gmail.com \
    --to=pclouds@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=martinerikwerner@gmail.com \
    --cc=richih@debian.org \
    --cc=tboegi@web.de \
    /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.