Skip to content

JVM SIGSEGV in native bcos_sdk_stop when stopping/destroying SDK or EventSubscribe #951

Description

@kyonRay

Description

Calling the stop/destroy lifecycle on the SDK / EventSubscribe (which reaches native bcos_sdk_stop via RpcJniObj.stop()) crashes the JVM with SIGSEGV (process exit code 134).

Environment

  • macOS arm64 (Apple Silicon) running the x86_64 fisco-bcos-macOS-x86_64 node and the SDK JNI via Rosetta 2
  • bcos-sdk-jni 3.7.0, node v3.7.3, Java 8 (Zulu)

Crash (hs_err)

# A fatal error has been detected by the Java Runtime Environment:
#  SIGSEGV (0xb) ... SEGV_ACCERR
# Problematic frame:
# C  [libbcos-sdk-jni-aarch64.dylib+0x263bb0]  bcos_sdk_stop+0x140
Current thread: JavaThread "Test worker" [_thread_in_native]
  j  org.fisco.bcos.sdk.jni.rpc.RpcJniObj.stop()V+0
  j  <test that built an EventSubscribe/Client and then stopped it>

The crash is in native bcos_sdk_stop, triggered from the Java stop/destroy path — consistent with a use-after-free / double-stop on the native handle (related to the AMOP/eventsub lifecycle, where the JNI object may be stopped/freed more than once or while callbacks are in flight).

Impact

Apps or tests that build an SDK / EventSubscribe and then stop()/destroy() it can hard-crash the JVM. (It also silently wipes JaCoCo coverage data, because a native crash bypasses the JVM shutdown hook.)

Suggested investigation

Make the native stop path idempotent and null-/freed-checked (stop subscriptions before freeing the RPC object; guard against double bcos_sdk_stop). This may ultimately live in bcos-sdk-jni / bcos-c-sdk rather than this Java repo — feel free to transfer.

Found via

A filter/eventsub integration test that called stop()/destroy(), during #947.

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions