Re: assert failed in submodule edge case
Am 13.04.2015 um 18:55 schrieb Dennis Kaarsemaker: Reported by djanos_ in #git: git add segfaults when you manage to confuse it with a submodule in the index that is no longer a submodule. Here's his script to reproduce the segfault: mkdir segfault cd segfault mkdir subrepo cd subrepo git init . echo a > a git add a git commit -m "a" cd .. git init . git add . If you add a "git rm -f --cached subrepo" here the problem goes away. cd subrepo rm -rf .git git add . This last git add will now barf: git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed. These all work as I think they are intended to: $ git -C segfault add subrepo/a fatal: Pathspec 'subrepo/a' is in submodule 'subrepo' $ git -C segfault/subrepo add a fatal: Pathspec 'a' is in submodule 'subrepo' And this does nothing, it also doesn't crash: $ git -C segfault add subrepo GDB backtrace below, this is with next as of e6f3401. Starting program: /home/dennis/code/git/git -C segfault/subrepo add . [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed. Program received signal SIGABRT, Aborted. 0x7702ae37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. (gdb) bt #0 0x7702ae37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 #1 0x7702c528 in __GI_abort () at abort.c:89 #2 0x77023ce6 in __assert_fail_base (fmt=0x77173c08 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x560660 "item->nowildcard_len <= item->len && item->prefix <= item->len", file=file@entry=0x560826 "pathspec.c", line=line@entry=317, function=function@entry=0x560850 <__PRETTY_FUNCTION__.22237> "prefix_pathspec") at assert.c:92 #3 0x77023d92 in __GI___assert_fail (assertion=assertion@entry=0x560660 "item->nowildcard_len <= item->len && item->prefix <= item->len", file=file@entry=0x560826 "pathspec.c", line=line@entry=317, function=function@entry=0x560850 <__PRETTY_FUNCTION__.22237> "prefix_pathspec") at assert.c:101 #4 0x004d6a37 in prefix_pathspec (elt=0x7fffdaf1 ".", prefixlen=8, prefix=0x7dd09f "subrepo/", flags=50, raw=0x7fffd648, p_short_magic=, item=) at pathspec.c:316 #5 parse_pathspec (pathspec=pathspec@entry=0x7fffd240, magic_mask=magic_mask@entry=0, flags=flags@entry=50, prefix=prefix@entry=0x7dd09f "subrepo/", argv=argv@entry=0x7fffd648) at pathspec.c:417 #6 0x0040698c in cmd_add (argc=, argv=0x7fffd648, prefix=0x7dd09f "subrepo/") at builtin/add.c:370 #7 0x00406001 in run_builtin (argv=0x7fffd640, argc=2, p=0x79d740 ) at git.c:350 #8 handle_builtin (argc=2, argv=0x7fffd640) at git.c:532 #9 0x00405151 in run_argv (argv=0x7fffd458, argcp=0x7fffd43c) at git.c:578 #10 main (argc=2, av=) at git.c:686 I dig a bit into pathspec.c and it looks like the PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE code in prefix_pathspec is only stripping out paths inside the submodule, not the submodule itself. I also guess that it shouldn't as otherwise you can't ever 'git add' a submodule. So I have no idea how to proceed, or even what the correct behaviour of 'git add' should be in this case. I do think that failing an assert() to tell a user he's doing something unexpected/silly/wrong isn't the right thing to do though :) The problem seems to be that "subrepo" is still registered as a submodule in the index. But we should see a proper error message instead of an assert in that case ... CCed Duy who knows much more about pathspec.c than me. -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: assert failed in submodule edge case
Err, ignore the 'segfault' bits. It's an assert() failure. He called it a segfault at first and that got stuck in my head. On ma, 2015-04-13 at 18:55 +0200, Dennis Kaarsemaker wrote: > Reported by djanos_ in #git: git add segfaults when you manage to > confuse it with a submodule in the index that is no longer a submodule. > > Here's his script to reproduce the segfault: > > mkdir segfault > cd segfault > > mkdir subrepo > cd subrepo > > git init . > echo a > a > git add a > git commit -m "a" > > cd .. > > git init . > git add . > > cd subrepo > rm -rf .git > git add . > > This last git add will now barf: > git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= > item->len && item->prefix <= item->len' failed. > > These all work as I think they are intended to: > $ git -C segfault add subrepo/a > fatal: Pathspec 'subrepo/a' is in submodule 'subrepo' > $ git -C segfault/subrepo add a > fatal: Pathspec 'a' is in submodule 'subrepo' > > And this does nothing, it also doesn't crash: > > $ git -C segfault add subrepo > > GDB backtrace below, this is with next as of e6f3401. > > Starting program: /home/dennis/code/git/git -C segfault/subrepo add . > [Thread debugging using libthread_db enabled] > Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". > git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= > item->len && item->prefix <= item->len' failed. > > Program received signal SIGABRT, Aborted. > 0x7702ae37 in __GI_raise (sig=sig@entry=6) at > ../nptl/sysdeps/unix/sysv/linux/raise.c:56 > 56../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. > (gdb) bt > #0 0x7702ae37 in __GI_raise (sig=sig@entry=6) at > ../nptl/sysdeps/unix/sysv/linux/raise.c:56 > #1 0x7702c528 in __GI_abort () at abort.c:89 > #2 0x77023ce6 in __assert_fail_base (fmt=0x77173c08 "%s%s%s:%u: > %s%sAssertion `%s' failed.\n%n", > assertion=assertion@entry=0x560660 "item->nowildcard_len <= item->len && > item->prefix <= item->len", file=file@entry=0x560826 "pathspec.c", > line=line@entry=317, > function=function@entry=0x560850 <__PRETTY_FUNCTION__.22237> > "prefix_pathspec") at assert.c:92 > #3 0x77023d92 in __GI___assert_fail > (assertion=assertion@entry=0x560660 "item->nowildcard_len <= item->len && > item->prefix <= item->len", > file=file@entry=0x560826 "pathspec.c", line=line@entry=317, > function=function@entry=0x560850 <__PRETTY_FUNCTION__.22237> > "prefix_pathspec") at assert.c:101 > #4 0x004d6a37 in prefix_pathspec (elt=0x7fffdaf1 ".", > prefixlen=8, prefix=0x7dd09f "subrepo/", flags=50, raw=0x7fffd648, > p_short_magic=, item=) at pathspec.c:316 > #5 parse_pathspec (pathspec=pathspec@entry=0x7fffd240, > magic_mask=magic_mask@entry=0, flags=flags@entry=50, > prefix=prefix@entry=0x7dd09f "subrepo/", > argv=argv@entry=0x7fffd648) at pathspec.c:417 > #6 0x0040698c in cmd_add (argc=, argv=0x7fffd648, > prefix=0x7dd09f "subrepo/") at builtin/add.c:370 > #7 0x00406001 in run_builtin (argv=0x7fffd640, argc=2, > p=0x79d740 ) at git.c:350 > #8 handle_builtin (argc=2, argv=0x7fffd640) at git.c:532 > #9 0x00405151 in run_argv (argv=0x7fffd458, > argcp=0x7fffd43c) at git.c:578 > #10 main (argc=2, av=) at git.c:686 > > I dig a bit into pathspec.c and it looks like the > PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE code in prefix_pathspec is only > stripping out paths inside the submodule, not the submodule itself. > > I also guess that it shouldn't as otherwise you can't ever 'git add' a > submodule. So I have no idea how to proceed, or even what the correct > behaviour of 'git add' should be in this case. I do think that failing > an assert() to tell a user he's doing something unexpected/silly/wrong > isn't the right thing to do though :) > -- Dennis Kaarsemaker www.kaarsemaker.net -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
assert failed in submodule edge case
Reported by djanos_ in #git: git add segfaults when you manage to confuse it with a submodule in the index that is no longer a submodule. Here's his script to reproduce the segfault: mkdir segfault cd segfault mkdir subrepo cd subrepo git init . echo a > a git add a git commit -m "a" cd .. git init . git add . cd subrepo rm -rf .git git add . This last git add will now barf: git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed. These all work as I think they are intended to: $ git -C segfault add subrepo/a fatal: Pathspec 'subrepo/a' is in submodule 'subrepo' $ git -C segfault/subrepo add a fatal: Pathspec 'a' is in submodule 'subrepo' And this does nothing, it also doesn't crash: $ git -C segfault add subrepo GDB backtrace below, this is with next as of e6f3401. Starting program: /home/dennis/code/git/git -C segfault/subrepo add . [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len <= item->len && item->prefix <= item->len' failed. Program received signal SIGABRT, Aborted. 0x7702ae37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. (gdb) bt #0 0x7702ae37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 #1 0x7702c528 in __GI_abort () at abort.c:89 #2 0x77023ce6 in __assert_fail_base (fmt=0x77173c08 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0x560660 "item->nowildcard_len <= item->len && item->prefix <= item->len", file=file@entry=0x560826 "pathspec.c", line=line@entry=317, function=function@entry=0x560850 <__PRETTY_FUNCTION__.22237> "prefix_pathspec") at assert.c:92 #3 0x77023d92 in __GI___assert_fail (assertion=assertion@entry=0x560660 "item->nowildcard_len <= item->len && item->prefix <= item->len", file=file@entry=0x560826 "pathspec.c", line=line@entry=317, function=function@entry=0x560850 <__PRETTY_FUNCTION__.22237> "prefix_pathspec") at assert.c:101 #4 0x004d6a37 in prefix_pathspec (elt=0x7fffdaf1 ".", prefixlen=8, prefix=0x7dd09f "subrepo/", flags=50, raw=0x7fffd648, p_short_magic=, item=) at pathspec.c:316 #5 parse_pathspec (pathspec=pathspec@entry=0x7fffd240, magic_mask=magic_mask@entry=0, flags=flags@entry=50, prefix=prefix@entry=0x7dd09f "subrepo/", argv=argv@entry=0x7fffd648) at pathspec.c:417 #6 0x0040698c in cmd_add (argc=, argv=0x7fffd648, prefix=0x7dd09f "subrepo/") at builtin/add.c:370 #7 0x00406001 in run_builtin (argv=0x7fffd640, argc=2, p=0x79d740 ) at git.c:350 #8 handle_builtin (argc=2, argv=0x7fffd640) at git.c:532 #9 0x00405151 in run_argv (argv=0x7fffd458, argcp=0x7fffd43c) at git.c:578 #10 main (argc=2, av=) at git.c:686 I dig a bit into pathspec.c and it looks like the PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE code in prefix_pathspec is only stripping out paths inside the submodule, not the submodule itself. I also guess that it shouldn't as otherwise you can't ever 'git add' a submodule. So I have no idea how to proceed, or even what the correct behaviour of 'git add' should be in this case. I do think that failing an assert() to tell a user he's doing something unexpected/silly/wrong isn't the right thing to do though :) -- Dennis Kaarsemaker www.kaarsemaker.net -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html