Files
scriptc/tests/corpus/5278-host-null-bytes.cjs
T
Chris Tate 9835ad0d75 Move scriptc to Node 24.22.0
Pin Node v24.22.0 (commit f14cd3aa7bf9, Undici 7.29.1, OpenSSL 3.5.8) in
.node-version, Dockerfile.sandbox, the docs matrix fallback, the
compatibility pin, the fetch profile, and process.version. A node-pin test
checks that these pins agree. The Node compatibility snapshot is
regenerated from the v24.22.0 API docs; the new stream_iter chapter maps
to node:stream/iter, and the SuiteContext rows no longer match the
TestContext evidence.

Runtime and compiler changes follow Node 24.22 behavior:

- fs.read, fs.readSync, and FileHandle.read validate the position before
  the zero-length return.
- fs.statfs results include frsize; Windows reads
  FileFsFullSizeInformation and reports bfree and bavail separately.
- fs.utimes, futimes, and lutimes keep nanosecond precision.
- ServerResponse sets writableFinished where 'finish' is emitted and runs
  end() callbacks before the 'finish' listeners while the socket is still
  attached; a request read to 'end' closes before its response.
- socket.write(string, 'buffer') throws ERR_UNKNOWN_ENCODING.
- URL protocol-setter rejections keep the current URL, the host setter
  no longer leaves a "/." escape when it adds a port to a "//" path, and
  new URLSearchParams(null) parses "null".
- util.stripVTControlCharacters uses Node 24.22's ANSI pattern,
  util.styleText accepts #RGB and #RRGGBB colors, and
  util.types.isDataView has its JS name and length.
- structuredClone and AbortSignal.any use the "cannot be converted to
  sequence" message.
- crypto.getCiphers, getHashes, and constants match Node 24.22.
- dns.lookup, net.connect, and tls.connect throw ERR_INVALID_ARG_VALUE for
  hosts with null bytes.
- fs.readFile validates options.buffer and refuses its valid forms;
  httpValidation and certificateCompression refuse by name.
- url.domainToASCII, url.domainToUnicode, and url.parse hostnames follow
  ada 4.0: ASCII domains are lowercased without checking their xn--
  labels, the RFC 5893 rule checks how LTR labels end and how RTL labels
  start, a Punycode label whose decoded form begins with "xn--" fails, and
  ToUnicode decodes only labels that pass the ToASCII checks. The url
  legacy test cases are regenerated with Node 24.22.

Corpus programs 5275-5279 cover the new behavior. 1640, 2283, 2599, and
3136 are updated where they pinned Node 24.15 output.
2026-10-14 17:27:02 -05:00

29 lines
1.4 KiB
JavaScript

// Hostnames with null bytes: dns.lookup throws ERR_INVALID_ARG_VALUE for
// 'hostname'; net.connect, net.createConnection, and tls.connect throw it
// for 'options.host', synchronously and before any lookup or dial. The
// callbacks never run.
'use strict';
const dns = require('node:dns');
const net = require('node:net');
const tls = require('node:tls');
const show = (label, fn) => {
try {
fn();
console.log(label, 'accepted');
} catch (e) {
console.log(label, e.name, e.code, e.message);
}
};
show('lookup', () => dns.lookup('local\u0000host', { family: 4 }, () => console.log('lookup callback ran')));
show('lookup trailing', () => dns.lookup('example.com\u0000', { family: 4 }, () => console.log('lookup callback ran')));
// The received value prints like util.inspect: quote choice, escapes, and
// truncation after 128 characters.
show('lookup quotes', () => dns.lookup("it's \"q\"\u0000", { family: 4 }, () => {}));
show('lookup escapes', () => dns.lookup('a\\b\u0000\u007f\u0085\t\ud800', { family: 4 }, () => {}));
show('lookup long', () => dns.lookup('\u0000' + 'x'.repeat(140), { family: 4 }, () => {}));
show('connect', () => net.connect(9, 'a\u0000b', () => console.log('connect callback ran')));
show('createConnection', () => net.createConnection(9, '\u0000'));
show('tls connect', () => tls.connect(9, 'a\u0000b', () => console.log('tls callback ran')));
show('tls options', () => tls.connect({ port: 9, host: 'x\u0000' }));
console.log('done');