From: Elijah Newren <newren@gmail.com>
To: Denton Liu <liu.denton@gmail.com>
Cc: "Junio C Hamano" <gitster@pobox.com>,
"Git Mailing List" <git@vger.kernel.org>,
"SZEDER Gábor" <szeder.dev@gmail.com>
Subject: Re: [PATCH] dir: special case check for the possibility that pathspec is NULL
Date: Tue, 1 Oct 2019 00:01:44 -0700 [thread overview]
Message-ID: <CABPp-BGv0zRbvSkXSvF=Q55Z9gJ1od4dsDpTOSDLVv9tppkKnw@mail.gmail.com> (raw)
In-Reply-To: <20190930223105.GA86525@generichostname>
On Mon, Sep 30, 2019 at 3:31 PM Denton Liu <liu.denton@gmail.com> wrote:
>
> Hi Elijah,
>
> On Mon, Sep 30, 2019 at 12:11:06PM -0700, Elijah Newren wrote:
> > Commits 404ebceda01c ("dir: also check directories for matching
> > pathspecs", 2019-09-17) and 89a1f4aaf765 ("dir: if our pathspec might
> > match files under a dir, recurse into it", 2019-09-17) added calls to
> > match_pathspec() and do_match_pathspec() passing along their pathspec
> > parameter. Both match_pathspec() and do_match_pathspec() assume the
> > pathspec argument they are given is non-NULL. It turns out that
> > unpack-tree.c's verify_clean_subdirectory() calls read_directory() with
> > pathspec == NULL, and it is possible on case insensitive filesystems for
> > that NULL to make it to these new calls to match_pathspec() and
> > do_match_pathspec(). Add appropriate checks on the NULLness of pathspec
> > to avoid a segfault.
> >
> > In case the negation throws anyone off (one of the calls was to
> > do_match_pathspec() while the other was to !match_pathspec(), yet no
> > negation of the NULLness of pathspec is used), there are two ways to
> > understand the differences:
> > * The code already handled the pathspec == NULL cases before this
> > series, and this series only tried to change behavior when there was
> > a pathspec, thus we only want to go into the if-block if pathspec is
> > non-NULL.
> > * One of the calls is for whether to recurse into a subdirectory, the
> > other is for after we've recursed into it for whether we want to
> > remove the subdirectory itself (i.e. the subdirectory didn't match
> > but something under it could have). That difference in situation
> > leads to the slight differences in logic used (well, that and the
> > slightly unusual fact that we don't want empty pathspecs to remove
> > untracked directories by default).
> >
> > Helped-by: Denton Liu <liu.denton@gmail.com>
> > Helped-by: SZEDER Gábor <szeder.dev@gmail.com>
> > Signed-off-by: Elijah Newren <newren@gmail.com>
> > ---
> > This patch applies on top of en/clean-nested-with-ignored, which is now
> > in next.
> >
> > Denton found and analyzed one issue and provided the patch for the
> > match_pathspec() call, SZEDER figured out why the issue only reproduced
> > for some folks and not others and provided the testcase, and I looked
> > through the remainder of the series and noted the do_match_pathspec()
> > call that should have the same check.
>
> Thanks for catching what I missed.
>
> >
> > So, I'm not sure who should be author and who should be helped-by; I
> > feel like their contributions are possibly bigger than mine. While I
> > tried to reproduce and debug, they ended up doing the work, and I just
> > looked through the rest of the series for similar issues and wrote up
> > a commit message. *shrug*
>
> Eh, it doesn't really matter to me. GitHub appears to have de facto
> standardised the Co-authored-by: trailer to allow credit to be split
> amonst multiple authors so _maybe_ we could use that, but I'm pretty
> impartial.
>
> >
> > dir.c | 8 +++++---
> > t/t0050-filesystem.sh | 23 +++++++++++++++++++++++
> > 2 files changed, 28 insertions(+), 3 deletions(-)
> >
> > diff --git a/dir.c b/dir.c
> > index 7ff79170fc..bd39b86be4 100644
> > --- a/dir.c
> > +++ b/dir.c
> > @@ -1962,8 +1962,9 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
> > ((state == path_untracked) &&
> > (get_dtype(cdir.de, istate, path.buf, path.len) == DT_DIR) &&
> > ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
> > - do_match_pathspec(istate, pathspec, path.buf, path.len,
> > - baselen, NULL, DO_MATCH_LEADING_PATHSPEC) == MATCHED_RECURSIVELY_LEADING_PATHSPEC))) {
> > + (pathspec &&
> > + do_match_pathspec(istate, pathspec, path.buf, path.len,
> > + baselen, NULL, DO_MATCH_LEADING_PATHSPEC) == MATCHED_RECURSIVELY_LEADING_PATHSPEC)))) {
> > struct untracked_cache_dir *ud;
> > ud = lookup_untracked(dir->untracked, untracked,
> > path.buf + baselen,
> > @@ -1975,7 +1976,8 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
> > if (subdir_state > dir_state)
> > dir_state = subdir_state;
> >
> > - if (!match_pathspec(istate, pathspec, path.buf, path.len,
> > + if (pathspec &&
> > + !match_pathspec(istate, pathspec, path.buf, path.len,
> > 0 /* prefix */, NULL,
> > 0 /* do NOT special case dirs */))
> > state = path_none;
> > diff --git a/t/t0050-filesystem.sh b/t/t0050-filesystem.sh
> > index 192c94eccd..edb30f9eb2 100755
> > --- a/t/t0050-filesystem.sh
> > +++ b/t/t0050-filesystem.sh
> > @@ -131,4 +131,27 @@ $test_unicode 'merge (silent unicode normalization)' '
> > git merge topic
> > '
> >
> > +test_expect_success CASE_INSENSITIVE_FS 'checkout with no pathspec and a case insensitive fs' '
> > + git init repo &&
> > + (
> > + cd repo &&
> > +
> > + >Gitweb &&
> > + git add Gitweb &&
> > + git commit -m "add Gitweb" &&
> > +
> > + git checkout --orphan todo &&
> > + git reset --hard &&
> > + # the subdir is crucial, without it there is no segfault
>
> We should either remove this comment or change the justification. A
> future reader may be confused at what particular segfault this refers
> to.
Yep, good point, I'll just go ahead and remove it.
> > + mkdir -p gitweb/subdir &&
> > + >gitweb/subdir/file &&
> > + # it is not strictly necessary to add and commit the
> > + # gitweb directory, its presence is sufficient
>
> Same here, its presence is sufficient to... what?
I will clean this one too and send a v2 tomorrow; it's getting late.
Thanks for all the digging you did on this bug to get it sorted out,
Denton; I really appreciate it.
Elijah
next prev parent reply other threads:[~2019-10-01 7:01 UTC|newest]
Thread overview: 73+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-25 18:59 [PATCH] t7300-clean: demonstrate deleting nested repo with an ignored file breakage SZEDER Gábor
2019-08-25 20:34 ` SZEDER Gábor
2019-08-25 22:32 ` Philip Oakley
2019-08-26 7:48 ` SZEDER Gábor
2019-09-05 15:47 ` [RFC PATCH v2 00/12] Fix some git clean issues Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 01/12] t7300: Add some testcases showing failure to clean specified pathspecs Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 02/12] dir: fix typo in comment Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 03/12] dir: fix off-by-one error in match_pathspec_item Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 04/12] dir: Directories should be checked for matching pathspecs too Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 05/12] dir: Make the DO_MATCH_SUBMODULE code reusable for a non-submodule case Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 06/12] dir: If our pathspec might match files under a dir, recurse into it Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 07/12] dir: add commentary explaining match_pathspec_item's return value Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 08/12] git-clean.txt: do not claim we will delete files with -n/--dry-run Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 09/12] clean: disambiguate the definition of -d Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 10/12] clean: avoid removing untracked files in a nested git repository Elijah Newren
2019-09-05 21:20 ` SZEDER Gábor
2019-09-05 15:47 ` [RFC PATCH v2 11/12] clean: rewrap overly long line Elijah Newren
2019-09-05 15:47 ` [RFC PATCH v2 12/12] clean: fix theoretical path corruption Elijah Newren
2019-09-05 19:27 ` SZEDER Gábor
2019-09-07 0:34 ` Elijah Newren
2019-09-05 19:01 ` [RFC PATCH v2 00/12] Fix some git clean issues SZEDER Gábor
2019-09-07 0:33 ` Elijah Newren
2019-09-12 22:12 ` [PATCH v3 " Elijah Newren
2019-09-12 22:12 ` [PATCH v3 01/12] t7300: add testcases showing failure to clean specified pathspecs Elijah Newren
2019-09-13 18:54 ` Junio C Hamano
2019-09-13 19:10 ` Elijah Newren
2019-09-13 20:29 ` Junio C Hamano
2019-09-12 22:12 ` [PATCH v3 02/12] dir: fix typo in comment Elijah Newren
2019-09-12 22:12 ` [PATCH v3 03/12] dir: fix off-by-one error in match_pathspec_item Elijah Newren
2019-09-13 19:05 ` Junio C Hamano
2019-09-12 22:12 ` [PATCH v3 04/12] dir: also check directories for matching pathspecs Elijah Newren
2019-09-12 22:12 ` [PATCH v3 05/12] dir: make the DO_MATCH_SUBMODULE code reusable for a non-submodule case Elijah Newren
2019-09-12 22:12 ` [PATCH v3 06/12] dir: if our pathspec might match files under a dir, recurse into it Elijah Newren
2019-09-13 19:45 ` Junio C Hamano
2019-09-12 22:12 ` [PATCH v3 07/12] dir: add commentary explaining match_pathspec_item's return value Elijah Newren
2019-09-13 20:04 ` Junio C Hamano
2019-09-12 22:12 ` [PATCH v3 08/12] git-clean.txt: do not claim we will delete files with -n/--dry-run Elijah Newren
2019-09-12 22:12 ` [PATCH v3 09/12] clean: disambiguate the definition of -d Elijah Newren
2019-09-12 22:12 ` [PATCH v3 10/12] clean: avoid removing untracked files in a nested git repository Elijah Newren
2019-09-12 22:12 ` [PATCH v3 11/12] clean: rewrap overly long line Elijah Newren
2019-09-12 22:12 ` [PATCH v3 12/12] clean: fix theoretical path corruption Elijah Newren
2019-09-17 16:34 ` [PATCH v4 00/12] Fix some git clean issues Elijah Newren
2019-09-17 16:34 ` [PATCH v4 01/12] t7300: add testcases showing failure to clean specified pathspecs Elijah Newren
2019-09-17 16:34 ` [PATCH v4 02/12] dir: fix typo in comment Elijah Newren
2019-09-17 16:34 ` [PATCH v4 03/12] dir: fix off-by-one error in match_pathspec_item Elijah Newren
2019-09-17 16:34 ` [PATCH v4 04/12] dir: also check directories for matching pathspecs Elijah Newren
2019-09-25 20:39 ` [BUG] git is segfaulting, was " Denton Liu
2019-09-25 21:28 ` Elijah Newren
2019-09-25 21:55 ` Denton Liu
2019-09-26 20:35 ` Denton Liu
2019-09-27 0:12 ` Elijah Newren
2019-09-27 1:09 ` SZEDER Gábor
2019-09-27 2:17 ` SZEDER Gábor
2019-09-27 17:10 ` Denton Liu
2019-09-30 19:11 ` [PATCH] dir: special case check for the possibility that pathspec is NULL Elijah Newren
2019-09-30 22:31 ` Denton Liu
2019-10-01 7:01 ` Elijah Newren [this message]
2019-10-01 18:30 ` [PATCH v2] " Elijah Newren
2019-10-01 18:40 ` Denton Liu
2019-10-01 18:54 ` Elijah Newren
2019-10-01 18:55 ` [PATCH v3] " Elijah Newren
2019-10-01 19:35 ` Denton Liu
2019-10-01 19:39 ` Elijah Newren
2019-10-02 15:51 ` Elijah Newren
2019-10-07 18:04 ` SZEDER Gábor
2019-09-17 16:34 ` [PATCH v4 05/12] dir: make the DO_MATCH_SUBMODULE code reusable for a non-submodule case Elijah Newren
2019-09-17 16:34 ` [PATCH v4 06/12] dir: if our pathspec might match files under a dir, recurse into it Elijah Newren
2019-09-17 16:34 ` [PATCH v4 07/12] dir: add commentary explaining match_pathspec_item's return value Elijah Newren
2019-09-17 16:35 ` [PATCH v4 08/12] git-clean.txt: do not claim we will delete files with -n/--dry-run Elijah Newren
2019-09-17 16:35 ` [PATCH v4 09/12] clean: disambiguate the definition of -d Elijah Newren
2019-09-17 16:35 ` [PATCH v4 10/12] clean: avoid removing untracked files in a nested git repository Elijah Newren
2019-09-17 16:35 ` [PATCH v4 11/12] clean: rewrap overly long line Elijah Newren
2019-09-17 16:35 ` [PATCH v4 12/12] clean: fix theoretical path corruption Elijah Newren
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='CABPp-BGv0zRbvSkXSvF=Q55Z9gJ1od4dsDpTOSDLVv9tppkKnw@mail.gmail.com' \
--to=newren@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=liu.denton@gmail.com \
--cc=szeder.dev@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).