Skip to content

mobile: gate all c.bl.* blockchain methods through beginOp (#242)#243

Merged
ehsan6sha merged 1 commit into
mainfrom
fix/242-gate-blockchain-methods
Jun 1, 2026
Merged

mobile: gate all c.bl.* blockchain methods through beginOp (#242)#243
ehsan6sha merged 1 commit into
mainfrom
fix/242-gate-blockchain-methods

Conversation

@ehsan6sha

Copy link
Copy Markdown
Member

The ~40 blockchain/hardware methods on the mobile Client called c.bl.X(context.TODO(), c.bloxPid, ...) with no closed-check, so an in-flight read (BloxFreeSpace/GetFolderSize/ListActivePlugins/...) could run concurrently with Shutdown() and nil-deref the torn-down client -> Go SIGSEGV (addr=0xb8) -> SIGABRT. #241's beginOp/inflight-drain gate covered only ConnectToBlox/Ping.

Route all 44 c.bl.* methods through beginOp(): once Shutdown has set closed, calls return ErrClientClosed instead of dereferencing freed state; otherwise they register in inflight so Shutdown drains them (and opCancel cancels them) before closing the host/datastore. ReplicateInPool returns an error-JSON on closed (bare []byte signature); ChatWithAI gates the setup call but keeps context.TODO() for the streaming buffer that outlives the call.

Test: TestBlockchainMethodsAfterShutdownReturnErrClosed asserts the blockchain reads named in the crash log return ErrClientClosed after Shutdown. Verified to reproduce the production nil-deref panic when the gate is removed, and pass with it. go build + go vet clean.

The ~40 blockchain/hardware methods on the mobile Client called
c.bl.X(context.TODO(), c.bloxPid, ...) with no closed-check, so an
in-flight read (BloxFreeSpace/GetFolderSize/ListActivePlugins/...) could
run concurrently with Shutdown() and nil-deref the torn-down client ->
Go SIGSEGV (addr=0xb8) -> SIGABRT. #241's beginOp/inflight-drain gate
covered only ConnectToBlox/Ping.

Route all 44 c.bl.* methods through beginOp(): once Shutdown has set
closed, calls return ErrClientClosed instead of dereferencing freed
state; otherwise they register in inflight so Shutdown drains them (and
opCancel cancels them) before closing the host/datastore. ReplicateInPool
returns an error-JSON on closed (bare []byte signature); ChatWithAI gates
the setup call but keeps context.TODO() for the streaming buffer that
outlives the call.

Test: TestBlockchainMethodsAfterShutdownReturnErrClosed asserts the
blockchain reads named in the crash log return ErrClientClosed after
Shutdown. Verified to reproduce the production nil-deref panic when the
gate is removed, and pass with it. go build + go vet clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@ehsan6sha ehsan6sha merged commit fa0e17f into main Jun 1, 2026
3 of 9 checks passed
@ehsan6sha ehsan6sha deleted the fix/242-gate-blockchain-methods branch June 1, 2026 01:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant