◐ Shell
clean mode source ↗

net: emit an error when custom lookup resolves to a non-string address · nodejs/node@a757f00

Original file line numberDiff line numberDiff line change

@@ -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') || !isIP(ip)) {

14201420

err = new ERR_INVALID_IP_ADDRESS(ip);

14211421

process.nextTick(connectErrorNT, self, err);

14221422

} else if (addressType !== 4 && addressType !== 6) {

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+

});