From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Elijah Newren via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, blees@dcon.de,
Junio C Hamano <gitster@pobox.com>,
kyle@kyleam.com, sxlijin@gmail.com,
Junio C Hamano <gitster@pobox.com>,
Elijah Newren <newren@gmail.com>
Subject: Re: [PATCH v2 6/8] dir: fix checks on common prefix directory
Date: Sun, 15 Dec 2019 11:29:32 +0100 (CET) [thread overview]
Message-ID: <nycvar.QRO.7.76.6.1912151126030.46@tvgsbejvaqbjf.bet> (raw)
In-Reply-To: <9839aca00a10b16d96c47db631ac025281ffc864.1576008027.git.gitgitgadget@gmail.com>
Hi Elijah,
I have not had time to dive deeply into this, but I know that it _does_
cause a ton of segmentation faults in the `shears/pu` branch (where all of
Git for Windows' patches are rebased on top of `pu`):
On Tue, 10 Dec 2019, Elijah Newren via GitGitGadget wrote:
> diff --git a/dir.c b/dir.c
> index 645b44ea64..9c71a9ac21 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -2102,37 +2102,69 @@ static int treat_leading_path(struct dir_struct *dir,
> const struct pathspec *pathspec)
> {
> struct strbuf sb = STRBUF_INIT;
> - int baselen, rc = 0;
> + int prevlen, baselen;
> const char *cp;
> + struct cached_dir cdir;
> + struct dirent de;
> + enum path_treatment state = path_none;
> +
> + /*
> + * For each directory component of path, we are going to check whether
> + * that path is relevant given the pathspec. For example, if path is
> + * foo/bar/baz/
> + * then we will ask treat_path() whether we should go into foo, then
> + * whether we should go into bar, then whether baz is relevant.
> + * Checking each is important because e.g. if path is
> + * .git/info/
> + * then we need to check .git to know we shouldn't traverse it.
> + * If the return from treat_path() is:
> + * * path_none, for any path, we return false.
> + * * path_recurse, for all path components, we return true
> + * * <anything else> for some intermediate component, we make sure
> + * to add that path to the relevant list but return false
> + * signifying that we shouldn't recurse into it.
> + */
>
> while (len && path[len - 1] == '/')
> len--;
> if (!len)
> return 1;
> +
> + memset(&cdir, 0, sizeof(cdir));
> + memset(&de, 0, sizeof(de));
> + cdir.de = &de;
> + de.d_type = DT_DIR;
So here, `de` is zeroed out, and therefore `de.d_name` is `NULL`.
> baselen = 0;
> + prevlen = 0;
> while (1) {
> - cp = path + baselen + !!baselen;
> + prevlen = baselen + !!baselen;
> + cp = path + prevlen;
> cp = memchr(cp, '/', path + len - cp);
> if (!cp)
> baselen = len;
> else
> baselen = cp - path;
> - strbuf_setlen(&sb, 0);
> + strbuf_reset(&sb);
> strbuf_add(&sb, path, baselen);
> if (!is_directory(sb.buf))
> break;
> - if (simplify_away(sb.buf, sb.len, pathspec))
> - break;
> - if (treat_one_path(dir, NULL, istate, &sb, baselen, pathspec,
> - DT_DIR, NULL) == path_none)
> + strbuf_reset(&sb);
> + strbuf_add(&sb, path, prevlen);
> + memcpy(de.d_name, path+prevlen, baselen-prevlen);
But here we try to copy a path into that `de.d_name`, which is still
`NULL`?
That can't be right, can it?
Thanks for your help,
Dscho
> + de.d_name[baselen-prevlen] = '\0';
> + state = treat_path(dir, NULL, &cdir, istate, &sb, prevlen,
> + pathspec);
> + if (state != path_recurse)
> break; /* do not recurse into it */
> - if (len <= baselen) {
> - rc = 1;
> + if (len <= baselen)
> break; /* finished checking */
> - }
> }
> + add_path_to_appropriate_result_list(dir, NULL, &cdir, istate,
> + &sb, baselen, pathspec,
> + state);
> +
> strbuf_release(&sb);
> - return rc;
> + return state == path_recurse;
> }
>
> static const char *get_ident_string(void)
> diff --git a/t/t3011-common-prefixes-and-directory-traversal.sh b/t/t3011-common-prefixes-and-directory-traversal.sh
> index d6e161ddd8..098fddc75b 100755
> --- a/t/t3011-common-prefixes-and-directory-traversal.sh
> +++ b/t/t3011-common-prefixes-and-directory-traversal.sh
> @@ -74,7 +74,7 @@ test_expect_success 'git ls-files -o --directory untracked_dir does not recurse'
> test_cmp expect actual
> '
>
> -test_expect_failure 'git ls-files -o --directory untracked_dir/ does not recurse' '
> +test_expect_success 'git ls-files -o --directory untracked_dir/ does not recurse' '
> echo untracked_dir/ >expect &&
> git ls-files -o --directory untracked_dir/ >actual &&
> test_cmp expect actual
> @@ -86,7 +86,7 @@ test_expect_success 'git ls-files -o untracked_repo does not recurse' '
> test_cmp expect actual
> '
>
> -test_expect_failure 'git ls-files -o untracked_repo/ does not recurse' '
> +test_expect_success 'git ls-files -o untracked_repo/ does not recurse' '
> echo untracked_repo/ >expect &&
> git ls-files -o untracked_repo/ >actual &&
> test_cmp expect actual
> @@ -133,7 +133,7 @@ test_expect_success 'git ls-files -o .git shows nothing' '
> test_must_be_empty actual
> '
>
> -test_expect_failure 'git ls-files -o .git/ shows nothing' '
> +test_expect_success 'git ls-files -o .git/ shows nothing' '
> git ls-files -o .git/ >actual &&
> test_must_be_empty actual
> '
> --
> gitgitgadget
>
>
>
next prev parent reply other threads:[~2019-12-15 10:29 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-09 20:47 [PATCH 0/8] Directory traversal bugs Elijah Newren via GitGitGadget
2019-12-09 20:47 ` [PATCH 1/8] t3011: demonstrate directory traversal failures Elijah Newren via GitGitGadget
2019-12-09 21:06 ` Denton Liu
2019-12-09 20:47 ` [PATCH 2/8] Revert "dir.c: make 'git-status --ignored' work within leading directories" Elijah Newren via GitGitGadget
2019-12-09 21:32 ` Denton Liu
2019-12-09 21:51 ` Elijah Newren
2019-12-09 22:09 ` Eric Sunshine
2019-12-09 20:47 ` [PATCH 3/8] dir: remove stray quote character in comment Elijah Newren via GitGitGadget
2019-12-09 20:47 ` [PATCH 4/8] dir: exit before wildcard fall-through if there is no wildcard Elijah Newren via GitGitGadget
2019-12-09 20:47 ` [PATCH 5/8] dir: break part of read_directory_recursive() out for reuse Elijah Newren via GitGitGadget
2019-12-09 20:47 ` [PATCH 6/8] dir: fix checks on common prefix directory Elijah Newren via GitGitGadget
2019-12-09 20:47 ` [PATCH 7/8] dir: synchronize treat_leading_path() and read_directory_recursive() Elijah Newren via GitGitGadget
2019-12-09 20:47 ` [PATCH 8/8] dir: consolidate similar code in treat_directory() Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 0/8] Directory traversal bugs Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 1/8] t3011: demonstrate directory traversal failures Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 2/8] Revert "dir.c: make 'git-status --ignored' work within leading directories" Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 3/8] dir: remove stray quote character in comment Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 4/8] dir: exit before wildcard fall-through if there is no wildcard Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 5/8] dir: break part of read_directory_recursive() out for reuse Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 6/8] dir: fix checks on common prefix directory Elijah Newren via GitGitGadget
2019-12-15 10:29 ` Johannes Schindelin [this message]
2019-12-16 13:51 ` Elijah Newren
2019-12-16 16:00 ` Elijah Newren
2019-12-16 18:13 ` Junio C Hamano
2019-12-16 21:08 ` Elijah Newren
2019-12-16 21:25 ` Junio C Hamano
2019-12-16 22:39 ` Elijah Newren
2019-12-17 0:04 ` Johannes Schindelin
2019-12-17 0:14 ` Junio C Hamano
2019-12-17 11:08 ` Johannes Schindelin
2019-12-17 17:33 ` Junio C Hamano
2019-12-17 19:32 ` Johannes Schindelin
2019-12-17 5:26 ` Elijah Newren
2019-12-17 11:15 ` Johannes Schindelin
2019-12-17 16:58 ` Elijah Newren
2019-12-10 20:00 ` [PATCH v2 7/8] dir: synchronize treat_leading_path() and read_directory_recursive() Elijah Newren via GitGitGadget
2019-12-10 20:00 ` [PATCH v2 8/8] dir: consolidate similar code in treat_directory() Elijah Newren via GitGitGadget
2019-12-17 8:33 ` [PATCH v3 0/3] Directory traversal bugs Elijah Newren via GitGitGadget
2019-12-17 8:33 ` [PATCH v3 1/3] t3011: demonstrate directory traversal failures Elijah Newren via GitGitGadget
2019-12-17 8:33 ` [PATCH v3 2/3] dir: remove stray quote character in comment Elijah Newren via GitGitGadget
2019-12-17 8:33 ` [PATCH v3 3/3] dir: exit before wildcard fall-through if there is no wildcard Elijah Newren via GitGitGadget
2019-12-17 11:18 ` [PATCH v3 0/3] Directory traversal bugs Johannes Schindelin
2019-12-17 18:24 ` Junio C Hamano
2019-12-21 22:05 ` Johannes Schindelin
2019-12-18 19:29 ` [PATCH v4 0/8] " Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 1/8] t3011: demonstrate directory traversal failures Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 2/8] Revert "dir.c: make 'git-status --ignored' work within leading directories" Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 3/8] dir: remove stray quote character in comment Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 4/8] dir: exit before wildcard fall-through if there is no wildcard Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 5/8] dir: break part of read_directory_recursive() out for reuse Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 6/8] dir: fix checks on common prefix directory Elijah Newren via GitGitGadget
2019-12-18 21:29 ` Junio C Hamano
2019-12-19 20:23 ` Elijah Newren
2019-12-19 22:24 ` Jeff King
2019-12-20 17:00 ` Elijah Newren
2019-12-20 21:14 ` Jeff King
2019-12-20 18:01 ` Junio C Hamano
2019-12-20 21:15 ` Jeff King
2019-12-18 19:29 ` [PATCH v4 7/8] dir: synchronize treat_leading_path() and read_directory_recursive() Elijah Newren via GitGitGadget
2019-12-18 19:29 ` [PATCH v4 8/8] dir: consolidate similar code in treat_directory() Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 0/8] Directory traversal bugs Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 1/8] t3011: demonstrate directory traversal failures Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 2/8] Revert "dir.c: make 'git-status --ignored' work within leading directories" Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 3/8] dir: remove stray quote character in comment Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 4/8] dir: exit before wildcard fall-through if there is no wildcard Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 5/8] dir: break part of read_directory_recursive() out for reuse Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 6/8] dir: fix checks on common prefix directory Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 7/8] dir: synchronize treat_leading_path() and read_directory_recursive() Elijah Newren via GitGitGadget
2019-12-19 21:28 ` [PATCH v5 8/8] dir: consolidate similar code in treat_directory() Elijah Newren via GitGitGadget
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=nycvar.QRO.7.76.6.1912151126030.46@tvgsbejvaqbjf.bet \
--to=johannes.schindelin@gmx.de \
--cc=blees@dcon.de \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=kyle@kyleam.com \
--cc=newren@gmail.com \
--cc=sxlijin@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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).