Skip to content

Commit

Permalink
net: validate host name for server listen
Browse files Browse the repository at this point in the history
Fixes: nodejs#54441

Co-authored-by: Luigi Pinca <[email protected]>
PR-URL: nodejs#54470
Reviewed-By: Paolo Insogna <[email protected]>
Reviewed-By: Matteo Collina <[email protected]>
Reviewed-By: Jake Yuesong Li <[email protected]>
  • Loading branch information
2 people authored and louwers committed Nov 2, 2024
1 parent 972bbe2 commit c2a7249
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
8 changes: 8 additions & 0 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ const {
NumberParseInt,
ObjectDefineProperty,
ObjectSetPrototypeOf,
RegExp,
RegExpPrototypeExec,
Symbol,
SymbolAsyncDispose,
SymbolDispose,
Expand Down Expand Up @@ -143,6 +145,8 @@ const { kTimeout } = require('internal/timers');
const DEFAULT_IPV4_ADDR = '0.0.0.0';
const DEFAULT_IPV6_ADDR = '::';

const HOST_REGEXP = new RegExp('^[a-zA-Z0-9-:%.]+$');

const noop = () => {};

const kPerfHooksNetConnectContext = Symbol('kPerfHooksNetConnectContext');
Expand Down Expand Up @@ -2020,6 +2024,10 @@ Server.prototype.listen = function(...args) {
toNumber(args.length > 2 && args[2]); // (port, host, backlog)

options = options._handle || options.handle || options;
if (typeof options.host === 'string' && RegExpPrototypeExec(HOST_REGEXP, options.host) === null) {
throw new ERR_INVALID_ARG_VALUE('host', options.host);
}

const flags = getFlags(options.ipv6Only);
// Refresh the id to make the previous call invalid
this._listeningId++;
Expand Down
12 changes: 12 additions & 0 deletions test/parallel/test-net-server-listen-options.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ function close() { this.close(); }
// Test listen({port})
net.createServer().listen({ port: 0 })
.on('listening', common.mustCall(close));
// Test listen(host, port}) on ipv4
net.createServer().listen({ host: '127.0.0.1', port: '3000' }).on('listening', common.mustCall(close));
// Test listen(host, port}) on ipv6
net.createServer().listen({ host: '::', port: '3001' }).on('listening', common.mustCall(close));
}

// Test listen(port, cb) and listen({ port }, cb) combinations
Expand Down Expand Up @@ -66,6 +70,13 @@ const listenOnPort = [
name: 'TypeError',
message: /^The argument 'options' must have the property "port" or "path"\. Received .+$/,
});
} else if (typeof options.host === 'string' && !options.host.match(/^[a-zA-Z0-9-:%.]+$/)) {
assert.throws(fn,
{
code: 'ERR_INVALID_ARG_VALUE',
name: 'TypeError',
message: /^The argument 'host' is invalid\. Received .+$/,
});
} else {
assert.throws(fn,
{
Expand All @@ -91,4 +102,5 @@ const listenOnPort = [
shouldFailToListen({ host: 'localhost:3000' });
shouldFailToListen({ host: { port: 3000 } });
shouldFailToListen({ exclusive: true });
shouldFailToListen({ host: '[::]', port: 3000 });
}

0 comments on commit c2a7249

Please sign in to comment.