Another possible instance of async-signal-safe opendir path callstack? (Was: [PATCH] tmp-objdir: do not opendir() when handling a signal)
- From
- Jan Pokorný <poki@fnusa.cz>
- Date
- Oct 20, 2022, 11:58 UTC
- Message-ID
- <00af268377fb7c3b8efd059482ee7449b71f48b1.camel@fnusa.cz>
- In-Reply-To
- <pull.1348.git.git.1664236383785.gitgitgadget@gmail.com>
John Cai via GitGitGadget píše v Po 26. 09. 2022 v 23:53 +0000:
Show 15 quoted lines
> From: John Cai <johncai86@gmail.com> > > In the tmp-objdir api, tmp_objdir_create will create a temporary > directory but also register signal handlers responsible for removing > the directory's contents and the directory itself. However, the > function responsible for recursively removing the contents and > directory, remove_dir_recurse() calls opendir(3) and closedir(3). > This can be problematic because these functions allocate and free > memory, which are not async-signal-safe functions. This can lead to > deadlocks. > > One place we call tmp_objdir_create() is in git-receive-pack, where > we create a temporary quarantine directory "incoming". Incoming > objects will be written to this directory before they get moved to > the object directory.
Just noticed this unattended git crash in the logs and I think it might actually be another occurrence of the same problem in principle, so shamelessly piggy-backing the stack trace here (no coredump preserved at this point, sorry):
#0 0x00007f08df0ea06c __pthread_kill_implementation (libc.so.6 + 0x8b06c)
#1 0x00007f08df098046 raise (libc.so.6 + 0x39046)
#2 0x00007f08df0817fc abort (libc.so.6 + 0x227fc)
#3 0x00007f08df082533 __libc_message.cold (libc.so.6 + 0x23533)
#4 0x00007f08df090a67 __libc_assert_fail (libc.so.6 + 0x31a67)
#5 0x00007f08df0f68f2 sysmalloc (libc.so.6 + 0x978f2)
#6 0x00007f08df0f7789 _int_malloc (libc.so.6 + 0x98789)
#7 0x00007f08df0f80d2 __libc_malloc (libc.so.6 + 0x990d2)
#8 0x00007f08df12fa55 __alloc_dir (libc.so.6 + 0xd0a55)
->#9 0x00007f08df12fac2 opendir_tail (libc.so.6 + 0xd0ac2)
#10 0x00005632ea10c823 remove_temporary_files.lto_priv.0 (git + 0xdc823)
->#11 0x00005632ea10c97c remove_pack_on_signal.lto_priv.0 (git + 0xdc97c)
#12 0x00007f08df0980f0 __restore_rt (libc.so.6 + 0x390f0)
#13 0x00007f08df0f7775 _int_malloc (libc.so.6 + 0x98775)
#14 0x00007f08df0f80d2 __libc_malloc (libc.so.6 + 0x990d2)
#15 0x00007f08df0d2b44 _IO_file_doallocate (libc.so.6 + 0x73b44)
#16 0x00007f08df0e1d20 _IO_doallocbuf (libc.so.6 + 0x82d20)
#17 0x00007f08df0e0a8c _IO_file_underflow@@GLIBC_2.2.5 (libc.so.6 + 0x81a8c)
#18 0x00007f08df0d4598 __getdelim (libc.so.6 + 0x75598)
#19 0x00005632ea29f372 strbuf_getwholeline (git + 0x26f372)
#20 0x00005632ea117915 cmd_repack (git + 0xe7915)
#21 0x00005632ea0556fa handle_builtin.lto_priv.0 (git + 0x256fa)
#22 0x00005632ea050551 main (git + 0x20551)
#23 0x00007f08df082a50 __libc_start_call_main (libc.so.6 + 0x23a50)
#24 0x00007f08df082b09 __libc_start_main@@GLIBC_2.34 (libc.so.6 + 0x23b09)
#25 0x00005632ea051555 _start (git + 0x21555)As per the captured info, following Fedora x86_64 packages were involved:
git-2.37.3-1.fc38 zlib-1.2.12-5.fc38 pcre2-10.40-1.fc37.1
Full command at hand:
/usr/libexec/git-core/git repack -d -l --no-write-bitmap-index
It happened twice, actually, about a week's time apart, but that was a month ago while this unattended task runs hourly till today and git hasn't been updated since.
Not subscribed to the list and I don't think I can provide more info on this, but feel free to contact me directly.
-- poki