Skip to content

Commit a02a6f0

Browse files
committed
net: emit an error when custom lookup resolves to a non-string address
1 parent c864dea commit a02a6f0

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

lib/net.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ const {
115115
},
116116
genericNodeError,
117117
} = require('internal/errors');
118-
const { isUint8Array } = require('internal/util/types');
118+
const { isStringObject, isUint8Array } = require('internal/util/types');
119119
const { queueMicrotask } = require('internal/process/task_queues');
120120
const {
121121
guessHandleType,
@@ -1416,7 +1416,7 @@ function lookupAndConnect(self, options) {
14161416
// calls net.Socket.connect() on it (that's us). There are no event
14171417
// listeners registered yet so defer the error event to the next tick.
14181418
process.nextTick(connectErrorNT, self, err);
1419-
} else if (!isIP(ip)) {
1419+
} else if ((typeof ip !== 'string' && !isStringObject(ip)) || !isIP(ip)) {
14201420
err = new ERR_INVALID_IP_ADDRESS(ip);
14211421
process.nextTick(connectErrorNT, self, err);
14221422
} else if (addressType !== 4 && addressType !== 6) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import * as common from '../common/index.mjs';
2+
import net from 'node:net';
3+
import { describe, it } from 'node:test';
4+
5+
const brokenCustomLookup = (_hostname, options, callback) => {
6+
// Incorrectly return an array of IPs instead of a string.
7+
callback(null, ['127.0.0.1'], options.family);
8+
};
9+
10+
describe('when family is ipv4', () => {
11+
it('socket emits an error when lookup does not return a string', (t, done) => {
12+
const options = {
13+
host: 'example.com',
14+
port: 80,
15+
lookup: brokenCustomLookup,
16+
family: 4
17+
};
18+
19+
const socket = net.connect(options, common.mustNotCall());
20+
socket.on('error', (err) => {
21+
t.assert.strictEqual(err.code, 'ERR_INVALID_IP_ADDRESS');
22+
23+
done();
24+
});
25+
});
26+
});
27+
28+
describe('when family is ipv6', () => {
29+
it('socket emits an error when lookup does not return a string', (t, done) => {
30+
const options = {
31+
host: 'example.com',
32+
port: 80,
33+
lookup: brokenCustomLookup,
34+
family: 6
35+
};
36+
37+
const socket = net.connect(options, common.mustNotCall());
38+
socket.on('error', (err) => {
39+
t.assert.strictEqual(err.code, 'ERR_INVALID_IP_ADDRESS');
40+
41+
done();
42+
});
43+
});
44+
});

0 commit comments

Comments
 (0)