Skip to content

Loading an empty externalized builtin aborts the processΒ #64749

Description

@Archkon

Version

latest main branch

Platform

7.1.4-arch1-1

Subsystem

No response

What steps will reproduce the bug?

Build Node.js using --node-builtin-modules-path:

./configure --node-builtin-modules-path=/path/to/node/source
 make -j4

Replace a builtin source file with an empty file, then load that builtin:

  /path/to/node/source/lib/path.js
  out/Release/node -e "require('path')"

The same issue can occur when an empty file is supplied through one of the
shared builtin path options, such as:


  --shared-builtin-undici/undici-path
  --shared-builtin-amaro/dist/index-path

How often does it reproduce? Is there a required condition?

Every

What is the expected behavior? Why is that the expected behavior?

An empty builtin source should be represented as an empty V8 string.If the empty source is not a valid implementation of that builtin, Node.js may subsequently report a normal JavaScript compilation or runtime error, but it should not terminate due to a native V8 CHECK.

What do you see instead?

The process aborts in v8::String::NewExternalTwoByte() because V8 checks that the external string resource has a non-null data pointer:

Additional information

That check was removed during the external resource lifetime refactoring in PR #47055.

PR #60518 later changed the --node-builtin-modules-path loader to use AddExternalizedBuiltin(), exposing the same issue through dynamically loaded builtin modules. Before that change, this path used String::NewFromUtf8(),which handled empty source files.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions