Hi,
I tried running VPP with its LD_PRELOAD library on a Java app.
What I found was that it will segfault if the JVM encounters some kind of
issue, for example not finding the main class to run.
The segfault happens in vcl_worker_cleanup coming from vppcom_app_exit, it
looks like this is due to indexing issues when __vcl_worker_index is -1.
Here is a suggestion for patch to avoid it. Please consider it and add test
coverage for it.
```
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index 70d2674f9..873204945 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -1438,6 +1438,11 @@ vppcom_app_exit (void)
{
if (!pool_elts (vcm->workers))
return;
+
+ /* exiting thread never used vcl */
+ if (vcl_get_worker_index () == ~0)
+ return;
+
vcl_worker_cleanup (vcl_worker_get_current (), 1 /* notify vpp */ );
vcl_set_worker_index (~0);
vcl_elog_stop (vcm);
```
This is what the segfault backtrace looks like in gdb
```
Error: Could not find or load main class MainClass
Caused by: java.lang.ClassNotFoundException: MainClass
[Thread 0x7fff4ffff6c0 (LWP 1119246) exited]
[Thread 0x7fff641f96c0 (LWP 1119243) exited]
[Thread 0x7fff642fa6c0 (LWP 1119242) exited]
[Thread 0x7fff66b9d6c0 (LWP 1119240) exited]
Thread 11 "VM Thread" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fff4fefe6c0 (LWP 1119247)]
vcl_worker_cleanup (wrk=wrk@entry=0x853fe7bd0140, notify_vpp=notify_vpp@entry=1
'\001') at vpp/src/vcl/vcl_private.c:123
warning: 123 vpp/src/vcl/vcl_private.c: No such file or directory
(gdb) bt
#0 vcl_worker_cleanup (wrk=wrk@entry=0x853fe7bd0140,
notify_vpp=notify_vpp@entry=1 '\001') at vpp/src/vcl/vcl_private.c:123
#1 0x00007ffff7d6ffb6 in vppcom_app_exit () at vpp/src/vcl/vppcom.c:1441
#2 0x00007ffff7dec231 in __cxa_finalize () from /lib64/libc.so.6
#3 0x00007ffff7d6e1b7 in __do_global_dtors_aux () from
/tmp/vpp_files/lib64/libvppcom.so.26.10
#4 0x00007ffff7fc1a50 in ?? ()
#5 0x00007ffff7fc90e2 in _dl_call_fini (closure_map=0x7fff4fefd5a0,
closure_map@entry=0x7ffff7fc1a50) at dl-call_fini.c:43
#6 0x00007ffff7fcd370 in _dl_fini () at dl-fini.c:120
#7 0x00007ffff7dec7b1 in __run_exit_handlers () from /lib64/libc.so.6
#8 0x00007ffff7dec880 in exit () from /lib64/libc.so.6
#9 0x00007fffa9880c79 in os::exit(int) () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#10 0x00007fffa942104c in vm_direct_exit(int) () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#11 0x00007fffa9c96a67 in VM_Operation::evaluate() () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#12 0x00007fffa9c9a0a2 in VMThread::evaluate_operation(VM_Operation*) () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#13 0x00007fffa9c9acd7 in VMThread::inner_execute(VM_Operation*) () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#14 0x00007fffa9c9af97 in VMThread::run() () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#15 0x00007fffa9bf842f in Thread::call_run() () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#16 0x00007fffa9875b16 in thread_native_entry(Thread*) () from
/home/<user>/.sdkman/candidates/java/25.0.3-tem/lib/server/libjvm.so
#17 0x00007ffff7e3ea7f in start_thread () from /lib64/libc.so.6
#18 0x00007ffff7eaf4fc in clone3 () from /lib64/libc.so.6
```
I created a minimal reproducer with Java. Which was just HelloWorld and then
misspell the main class such that it cannot be found, but I see that I am not
allowed to attach tar.gz files. The reproducer stays with me for now. Hopefully
you can reproduce it on your own.
Thanks,
Jakob
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#27102): https://lists.fd.io/g/vpp-dev/message/27102
Mute This Topic: https://lists.fd.io/mt/120203465/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/leave/14379924/21656/631435203/xyzzy
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-