Re: assert failed in submodule edge case

2015-04-16 Thread Jens Lehmann

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=synthetic pointer, item=optimized out) 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=optimized out, argv=0x7fffd648, 
prefix=0x7dd09f subrepo/) at builtin/add.c:370
#7  0x00406001 in run_builtin (argv=0x7fffd640, argc=2, p=0x79d740 
commands) 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=optimized out) 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

2015-04-13 Thread Dennis Kaarsemaker
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=synthetic pointer, item=optimized out) 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=optimized out, argv=0x7fffd648, 
 prefix=0x7dd09f subrepo/) at builtin/add.c:370
 #7  0x00406001 in run_builtin (argv=0x7fffd640, argc=2, 
 p=0x79d740 commands) 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=optimized out) 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