Possible crash: `Nan::ThrowError` called from `ClientWorker::Execute()`, which runs on the libuv threadpool
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 79/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- cpp, node.js
- 領域
- backend, embedded-iot
調査の方向性
src/linux/BTSerialPortBindingServer.ccと、src/BTSerialPortBindingServer.hにあるClientWorkerの宣言を読みます。issueではExecute()と安全でない例外呼び出しが特定されています。Execute()から設定されたエラーをNANがどのように処理するかを確認し、示されているように呼び出しをSetErrorMessage()に置き換えます。エラーがコールバックに届き、Bluetoothハードウェアがなくてもプロセスが動作し続けることを確認します。
索引モデルが issue の本文から書いたものです。
説明
Nan::ThrowError called from ClientWorker::Execute(), which runs on the libuv threadpool
BTSerialPortBindingServer::ClientWorker is a Nan::AsyncWorker, so its
Execute() override runs on a libuv threadpool thread rather than the thread
that owns the V8 isolate. It raises a JavaScript exception from there:
// src/linux/BTSerialPortBindingServer.cc
void BTSerialPortBindingServer::ClientWorker::Execute(){
if(mBaton == nullptr){
return Nan::ThrowError("listen_baton_t is null!");
}
Nan::ThrowError reaches v8::Isolate::ThrowException, which may only be
called on the isolate's own thread. The declaration confirms the context:
// src/BTSerialPortBindingServer.h
class ClientWorker : public Nan::AsyncWorker {
void Execute() override;
void HandleOKCallback() override;
};
Reproduction
The behaviour does not depend on Bluetooth hardware; it follows from raising a
V8 exception inside Execute(). A minimal addon with the same shape:
class ThrowingWorker : public Nan::AsyncWorker {
public:
explicit ThrowingWorker(Nan::Callback *cb) : Nan::AsyncWorker(cb) {}
void Execute() override {
return Nan::ThrowError("raised from the worker thread");
}
void HandleOKCallback() override {
Nan::HandleScope scope;
v8::Local<v8::Value> argv[] = { Nan::Null() };
callback->Call(1, argv, async_resource);
}
};
const addon = require('./build/Release/poc.node');
process.on('uncaughtException', e => console.log('[uncaughtException]', e && e.message));
addon.run(() => console.log('[callback] ran'));
setTimeout(() => console.log('[alive] process survived'), 1000);
Node v22.17.1, macOS arm64, nan 2.x:
| worker body | exit code | output |
|---|---|---|
Nan::ThrowError(...) |
139 (SIGSEGV), 5/5 runs | none; the callback never runs |
SetErrorMessage(...) |
0, 3/3 runs | [callback] err = raised from the worker thread, [alive] process survived |
Suggested fix
NAN provides SetErrorMessage() for exactly this: record the message in
Execute() and let NAN deliver it on the loop thread through
HandleErrorCallback().
void BTSerialPortBindingServer::ClientWorker::Execute(){
if(mBaton == nullptr){
- return Nan::ThrowError("listen_baton_t is null!");
+ return SetErrorMessage("listen_baton_t is null!");
}
The existing HandleOKCallback() stays as it is; NAN calls
HandleErrorCallback() instead when an error message has been set, and the
default implementation passes the message to the stored callback as an Error.
- 主要言語
- C++
- スター
- 205
- フォーク
- 56
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
lsongdev/node-bluetooth のほかの issue
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
lsongdev/node-bluetooth#61 ·
-
難易度 3/5 1〜2日 初心者へのやさしさ 25/100
lsongdev/node-bluetooth#60 ·
-
難易度 4/5 3〜5日 初心者へのやさしさ 30/100
lsongdev/node-bluetooth#57 · コメント 1 件 · リアクション 2 件 ·
-
Maintenance status?オープン
難易度 1/5 1時間未満 初心者へのやさしさ 10/100
lsongdev/node-bluetooth#55 · コメント 8 件 ·
-
Battery status?オープン
難易度 5/5 1週間以上 初心者へのやさしさ 20/100
lsongdev/node-bluetooth#54 · コメント 1 件 ·
lsongdev/node-bluetooth の issue をすべて見る
似ている issue
-
1 type: problem 2 scope: firmware 3 good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
SpaceTeam/STS1_COBC_SW#511 ·
-
documentation good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
imaaiagent/fumi#3 ·
-
A bare port in --modelserver does not reach the model server対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
rocketride-org/rocketride-server#2618 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug format I/O medium priority rt_lib
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信
-
refactor
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 1 日以内に返信