Changelog

nodejs/node · Aug 17–23, 2026 · 140 commits

Node.js week: security fixes, faster I/O, and QUIC/URL wins

A strong week of memory-safety fixes, module/compile-cache portability, faster URL and fs paths, plus QUIC and stream correctness work.

Major fixes and security hardening

Memory-safety and correctness bugs were fixed in core file and transcoding pathsfs.mkdtemp() got a heap-overflow fix for long prefixes, and UCS2 transcoding no longer writes out of bounds on odd-length input.

Module resolution now handles unreadable configs more safely — Node distinguishes missing package.json from unreadable ones, avoiding incorrect resolution when config files exist but can’t be read.

Source-mapped errors, signals, and platform behavior were tightenedERR_INVALID_ARG_TYPE now behaves correctly with --enable-source-maps, Windows SIGWINCH handling in child processes is fixed, and --use-largepages was effectively retired as a no-op warning flag.

Performance and startup improvements

URL and query-string handling got significantly faster — WHATWG URL parsing added an ASCII fast path with fewer allocations, while URLSearchParams was reworked to reduce scanning, coercions, and repeated serialization work.

File and module loading paths were optimizedfs.readFile() now finishes small regular files in one thread-pool round trip, package.json lookup is cached per directory, and bootstrap defers more builtin loading when snapshots aren’t being built.

Compile cache support became more flexible — the compile cache can now be read-only, and portable cache layout no longer gets split by uid, making prebuilt caches usable across users.

Streams, QUIC, and async I/O correctness

Stream iteration and broadcast semantics were hardened — aborts are now handled earlier and more consistently, consumer leaks on pre-aborted signals were fixed, and broadcast/end handling better respects buffering and backpressure.

QUIC/HTTP/3 handling was improved — incoming streams can now be consumed through session-level callbacks like onheaders, blocked streams resume correctly when flow control opens up, and unconsumed HTTP/3 requests now get H3_REQUEST_REJECTED.

Filesystem async APIs gained cancellation support — stat-style promise and callback operations now accept signal, aligning them with the rest of the abortable fs surface.

SQLite, FFI, and networking hardening

SQLite bindings were made more reentrancy-safe — parameter binding now blocks reentry during stepping, busy statements can’t be finalized from authorizers, and StatementSync.run() validates integer result conversion more strictly.

FFI semantics were tightened — callbacks stay non-constructible, float setters now reject non-numbers, and shared-buffer/pointer conversion paths were aligned to reject invalid inputs consistently.

HTTP and socket edge cases were fixed — keylog listeners now attach to existing agent sockets, socket teardown no longer crashes on nullish parent links, and parser/header accounting got a few small cleanups.

Other misc changes

  • perf_hooks histograms gained statistical comparison APIs
  • fs.cp preserved symlink types more accurately with filters
  • Test runner JUnit output and coverage reporting improved
  • node --test directory handling regressed less and was restored
  • Various docs, benchmarks, build/CI, and type-definition updates across the tree