Subject: Re: Coredump on ls-remote + --sort

From: Ævar Arnfjörð Bjarmason <[email-masked]>
Date: Sat, 22 Sep 2018 14:33:11 +0200

On Sat, Sep 22 2018, H.Merijn Brand wrote:

> A small background why I wanted this: I need to build a new version of
> some software hosted in git, add a lot of shared/static stuff and
> automatically test it. I want to get the most recent *tag* and create a
> folder with the tagname in it, go into that folder and clone the repo,
> check out the tag, add the rest of the stuff, build and test
>
> As the default outpout of «git ls-remote --tags» or «git ls-remote» is
> topologically sorted by tagname, the most recent tag is likely to be in
> the middle.
>
> Linux 4.12.14-lp150.12.16-default [openSUSE Leap 15.0]
>
> $ git --version
> git version 2.19.0
>
> $ git ls-remote --tags github.com:Tux/App-ccdiff
> 5e2513ab6dd4a24c8f3a3ace0a3faba6a291d818        refs/tags/0.04
> 2f7ea0f1e751dc20c1ddb15f6d61c6fa62d5d6f1        refs/tags/0.05
> a3802907be5b10383c7438f1d1c660fe13a05d3f        refs/tags/0.06
> 3e4bfa7cde75fba221650b9d3aa5555b706803df        refs/tags/0.07
> 05829d1ac5b49bbdd2167bc363b94f8a12e752b3        refs/tags/0.08
> 9c6e5861ea9c6e50c501663d43c5a9f6d31b54bc        refs/tags/0.09
> e815b059f6326da936c3a92272ba67e273b1dc3e        refs/tags/0.10
> e6b40e331c945449bb8e71023de4920ca5574adc        refs/tags/0.20
> be55e6336b1db5ffad23a6a0a663763e2f5da779        refs/tags/0.21
> e283d563f02bb8d2131e8b95852072ac204b28b4        refs/tags/0.22
> 0d3d1830f542121bfef1d984f21343c6d9c774f8        refs/tags/0.23
> d7bf195a92095a4f0b810584810450e4001b1a2c        refs/tags/0.24
> 5c517cf3f79cb18173714e63bc5b80a3e3f888f1        refs/tags/0.25
>
> Whether or not supported, it should not dump core
>
> $ git ls-remote --tags --sort=authordate github.com:Tux/App-ccdiff
> Segmentation fault (core dumped)
>
> (gdb) where
> #0  0x00007ffff74784a6 in __strlen_sse2 () from /lib64/libc.so.6
> #1  0x000000000057a956 in for_each_replace_ref ()
> #2  0x0000000000596cec in do_lookup_replace_object ()
> #3  0x00000000005c14eb in oid_object_info_extended ()
> #4  0x000000000058b984 in get_object ()
> #5  0x000000000058ddde in populate_value ()
> #6  0x000000000058e36b in compare_refs ()
> #7  0x000000000061447a in msort_with_tmp.part ()
> #8  0x0000000000614505 in msort_with_tmp.part ()
> #9  0x0000000000614518 in msort_with_tmp.part ()
> #10 0x0000000000614518 in msort_with_tmp.part ()
> #11 0x000000000061459e in git_qsort_s ()
> #12 0x000000000058ed40 in ref_array_sort ()
> #13 0x000000000044ef66 in cmd_ls_remote ()
> #14 0x000000000040784f in handle_builtin ()
> #15 0x0000000000407bb0 in cmd_main ()
> #16 0x0000000000406b04 in main ()
>
> Linux 3.10.0-862.6.3.el7.x86_64 [CentOS Linux 7.5.1804 (Core)]
>
> $ git --version
> git version 2.18.0
>
> $ git ls-remote --tags https://github.com/Tux/App-ccdiff
> 5e2513ab6dd4a24c8f3a3ace0a3faba6a291d818        refs/tags/0.04
> 2f7ea0f1e751dc20c1ddb15f6d61c6fa62d5d6f1        refs/tags/0.05
> a3802907be5b10383c7438f1d1c660fe13a05d3f        refs/tags/0.06
> 3e4bfa7cde75fba221650b9d3aa5555b706803df        refs/tags/0.07
> 05829d1ac5b49bbdd2167bc363b94f8a12e752b3        refs/tags/0.08
> 9c6e5861ea9c6e50c501663d43c5a9f6d31b54bc        refs/tags/0.09
> e815b059f6326da936c3a92272ba67e273b1dc3e        refs/tags/0.10
> e6b40e331c945449bb8e71023de4920ca5574adc        refs/tags/0.20
> be55e6336b1db5ffad23a6a0a663763e2f5da779        refs/tags/0.21
> e283d563f02bb8d2131e8b95852072ac204b28b4        refs/tags/0.22
> 0d3d1830f542121bfef1d984f21343c6d9c774f8        refs/tags/0.23
> d7bf195a92095a4f0b810584810450e4001b1a2c        refs/tags/0.24
> 5c517cf3f79cb18173714e63bc5b80a3e3f888f1        refs/tags/0.25
>
> $ git ls-remote --tags --sort=authordate https://github.com/Tux/App-ccdiff
> Segmentation fault
>
> (gdb) where
> #0  0x00007ffff751a67f in __strlen_sse42 () from /lib64/libc.so.6
> #1  0x0000000000561c06 in for_each_replace_ref ()
> #2  0x000000000057c3fa in do_lookup_replace_object ()
> #3  0x00000000005a6aa8 in read_object_file_extended ()
> #4  0x00000000005731e5 in get_object ()
> #5  0x00000000005749df in populate_value ()
> #6  0x0000000000574e9d in compare_refs ()
> #7  0x00000000005efe57 in msort_with_tmp.part.0 ()
> #8  0x00000000005efe31 in msort_with_tmp.part.0 ()
> #9  0x00000000005efe0e in msort_with_tmp.part.0 ()
> #10 0x00000000005efe0e in msort_with_tmp.part.0 ()
> #11 0x00000000005eff5c in git_qsort_s ()
> #12 0x00000000005757e0 in ref_array_sort ()
> #13 0x000000000044c6b6 in cmd_ls_remote ()
> #14 0x000000000040730e in handle_builtin ()
> #15 0x000000000040760e in cmd_main ()
> #16 0x0000000000406554 in main ()

I can't reproduce this, I just get for both ssh and https:

    $ ~/g/git/git --exec-path=$PWD ls-remote --tags --sort=authordate https://github.com/Tux/App-ccdiff
    fatal: missing object 2f7ea0f1e751dc20c1ddb15f6d61c6fa62d5d6f1 for refs/tags/0.05
    $ ~/g/git/git --exec-path=$PWD version
    git version 2.18.0

Same thing on latest 'master' (v2.19.0-221-g150f307afc).

But maybe that's just a symptom of the same bug, when I clone the repo I
get a working 0.05 tag, and it passes fsck, and I do get the
2f7ea0f1e751dc20c1ddb15f6d61c6fa62d5d6f1 object (which is the 0.05 tag
object).