Thank you very much for your investigation.
Perl 5.38 is merge to rawhide now.
Regards;
Jitka
On 7/13/23 12:55, Richard W.M. Jones wrote:
On Thu, Jul 13, 2023 at 11:03:35AM +0100, Richard W.M. Jones wrote:
On Thu, Jul 13, 2023 at 10:29:44AM +0100, Richard W.M. Jones wrote:
It's a crash in Perl code, although called from the nbdkit perl plugin
(C bindings). Still debugging this ...
Core was generated by `/home/rjones/d/nbdkit/server/nbdkit -U
/tmp/nbdkittPN34a/sock -P /tmp/nbdkittPN'.
Program terminated with signal SIGSEGV, Segmentation fault.
warning: Section `.reg-xstate/150177' in core file too small.
#0 Perl_my_snprintf (buffer=0x7f3a1e5fc630 "p\310_\036:\177", len=32,
format=0x7f3a1ef7e322 "_<(eval %lu)")
at /usr/src/debug/perl-5.38.0-499.fc39.x86_64/util.c:5248
Downloading source file /usr/src/debug/perl-5.38.0-499.fc39.x86_64/util.c
5248 WITH_LC_NUMERIC_SET_TO_NEEDED(
[Current thread is 1 (Thread 0x7f3a1e5fd6c0 (LWP 150177))]
(gdb) bt
#0 Perl_my_snprintf (buffer=0x7f3a1e5fc630 "p\310_\036:\177", len=32,
format=0x7f3a1ef7e322 "_<(eval %lu)")
at /usr/src/debug/perl-5.38.0-499.fc39.x86_64/util.c:5248
https://github.com/Perl/perl5/blob/ff7e37d5ca2e55a1e53e5b375e3cc9aedc9ce4ec/util.c#L5248
Since its hardly obvious from the code, that macro expands to the
monster below. I didn't bother to format it completely ...
# 5245 "util.c"
if (retval == -1) {
do {
void (*_restore_LC_NUMERIC_function)(PerlInterpreter* my_perl
__attribute__((unused))) = ((void *)0);
do {
_Bool _in_lc_numeric = ((( ((
_Bool
) ((my_perl->Icompiling).cop_hints & 0x00000004)) || ( ((_Bool)
((my_perl->Icompiling).cop_hints & 0x00000010)) &&
Perl__is_in_locale_category(my_perl, (1), (
1
)))) || (((my_perl->Icurcop) && (((my_perl->Icurcop))->cop_hints + 0) & 0x00000004) ||
(((my_perl->Icurcop) && (((my_perl->Icurcop))->cop_hints + 0) & 0x00000010) &&
Perl__is_in_locale_category(my_perl, (0), (
1
))))));
((void)0);
if (_in_lc_numeric) {
if ((! (my_perl->Inumeric_underlying) && (my_perl->Inumeric_standard) <
2)) { Perl_set_numeric_underlying(my_perl); _restore_LC_NUMERIC_function =
&Perl_set_numeric_standard; }
} else {
if ((! (my_perl->Inumeric_standard))) {
Perl_set_numeric_standard(my_perl); _restore_LC_NUMERIC_function =
&Perl_set_numeric_underlying; } }
} while (0);
retval = vsnprintf(buffer, len, format, ap);;
do { if (_restore_LC_NUMERIC_function) {
_restore_LC_NUMERIC_function(my_perl); } ((void)0); } while (0);
} while (0);
... because the fundamental problem is:
(gdb) print my_perl
$13 = (PerlInterpreter *) 0x0
so that's not gonna work.
It turns out to be a bug in nbdkit! A close reading of the perlembed
man page reveals that we need to set the interpreter context when
calling into Perl from a new thread. The fix is:
https://gitlab.com/nbdkit/nbdkit/-/commit/495708e9d1b396ff450df15d5789b4f6c51f6ebc
I'll add this to Rawhide shortly.
Rich.
--
Jitka Plesnikova
Senior Software Engineer
Red Hat
_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs