diagnostics_channel: Channel::binding_data_ dangles after environment cleanup, crashing node:sqlite at exit
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 48/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- javascript, node.js, sqlite
- Bereich
- backend, databases, observability
Rechercherichtung
Führen Sie zuerst die bereitgestellte node:diagnostics_channel- und node:sqlite-Reproduktion aus und verfolgen Sie dann Channel::binding_data_ durch Environment::RunCleanup() und den SQLite-Profiling-Callback. Bestätigen Sie die Korrektur anhand desselben Beendigungsszenarios, einschließlich einer Anweisung, die ohne explizites close() mitten in einem Schritt verbleibt, und stellen Sie sicher, dass der Prozess ohne SIGSEGV beendet wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Version
v27.0.0-pre (2dfdb6a4206)
Platform
Darwin 25.6.0 arm64
Subsystem
diagnostics_channel, sqlite
What steps will reproduce the bug?
Channel holds its BindingData as a raw pointer that is never cleared, so any native holder that outlives environment cleanup reads a destroyed object. Here's a replication case using node:sqlite:
const dc = require('node:diagnostics_channel');
const { DatabaseSync } = require('node:sqlite');
dc.subscribe('sqlite.db.query', () => {});
const db = new DatabaseSync(':memory:');
db.exec('CREATE TABLE t(x)');
const ins = db.prepare('INSERT INTO t VALUES (?)');
for (let i = 0; i < 200; i++) ins.run(i);
// Start iterating and abandon it: the statement stays mid-step, so the
// finalize that happens at teardown fires SQLite's profile callback.
const it = db.prepare('SELECT * FROM t').iterate();
it.next();
globalThis.keepAlive = { db, it };
console.log('reached end of script');
How often does it reproduce? Is there a required condition?
Three conditions are required (all included in the example above):
- A subscriber on
sqlite.db.query, so the SQLite profile hook is installed. - A statement left mid-step at exit, so that the finalize during teardown has a started statement to profile.
- No explicit
close(), so the statement is finalized by the destructor chain afterEnvironment::RunCleanup()rather than before it.
What is the expected behavior? Why is that the expected behavior?
Exiting a process that used node:sqlite with a sqlite.db.query subscriber
shouldn't crash.
What do you see instead?
SIGSEGV, exit 139, after the script has finished.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 122k
- Forks
- 37.4k
- Ø Merge
- 4 T. 2 Std.
- Gemergte PRs (30 T.)
- 277
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus nodejs/node
-
doc
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
-
build
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
-
feature request
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Ähnliche Issues
-
Bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Automattic/safe-publish#594 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
dream-num/dsh-univer-office#104 ·
-
comp/dashboard invalid P3
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
NousResearch/hermes-agent#121143 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
avniproject/avni-webapp#1811 ·
-
area/auroraboot area/webui bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100