Skip to content

node:domain: EventEmitter domain error routing segfaults #4395

@andrewtdiz

Description

@andrewtdiz

Summary

Current node-suite/domain/members-emitter-errors segfaults in Perry when a domain-owned EventEmitter emits error. Node routes the emitter error through the domain error handler and returns false from emit().

Repro

import domain from "node:domain";
import { EventEmitter } from "node:events";

const d = domain.create();
const ee = new EventEmitter();

d.on("error", (err: any) => {
  console.log("domain error:", err.message, err.domain === d, err.domainThrown, typeof err.domainBound, err.domainEmitter === ee);
});

d.add(ee);
console.log("members after add:", d.members.includes(ee), ee.domain === d, d.members.length);
console.log("emit returned:", ee.emit("error", new Error("emitter boom")));
d.remove(ee);
console.log("members after remove:", d.members.includes(ee), ee.domain, d.members.length);

Current behavior

Node v26.3.0:

members after add: true true 1
domain error: emitter boom true false undefined true
emit returned: false
members after remove: false null 0

Perry on current-main scan baseline 460fc3d6a:

Segmentation fault (core dumped)
exit=139

Focused parity output:

node-suite/domain/members-emitter-errors (output mismatch)
Perry: Segmentation fault (core dumped)

Suggested scope

Fix only node:domain membership and EventEmitter error routing for domain-owned emitters: domain.add(emitter), emitter.domain, domain error metadata (domain, domainEmitter, domainThrown, domainBound), emit("error", err) return value, and domain.remove(emitter).

Non-goals: broader domain async context semantics, unrelated EventEmitter behavior, and process-level uncaught exception handling beyond this fixture.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    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