From d3f9b84be8e959fe35d899c645e716ab731c3c19 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Wed, 24 Feb 2016 09:12:59 +0100 Subject: [PATCH] dgram: handle default address case when offset and length are specified Fixes a regression introduced by: https://github.com/nodejs/node/pull/4374. Adds a new test to avoid similar issue in the future. The test is disabled on windows, because this feature never worked there. Fixes: https://github.com/nodejs/node/issues/5398 Reviewed-By: Roman Reiss Reviewed-By: Rod Vagg Reviewed-By: Evan Lucas --- lib/dgram.js | 10 ++++- test/parallel/test-dgram-send-default-host.js | 43 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/parallel/test-dgram-send-default-host.js diff --git a/lib/dgram.js b/lib/dgram.js index 28da535ec7..d2bc02eab0 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -286,6 +286,13 @@ function enqueue(self, toEnqueue) { } +// valid combinations +// send(buffer, offset, length, port, address, callback) +// send(buffer, offset, length, port, address) +// send(buffer, offset, length, port) +// send(bufferOrList, port, address, callback) +// send(bufferOrList, port, address) +// send(bufferOrList, port) Socket.prototype.send = function(buffer, offset, length, @@ -294,8 +301,7 @@ Socket.prototype.send = function(buffer, callback) { var self = this; - // same as arguments.length === 5 || arguments.length === 6 - if (address) { + if (address || (port && typeof port !== 'function')) { buffer = sliceBuffer(buffer, offset, length); } else { callback = port; diff --git a/test/parallel/test-dgram-send-default-host.js b/test/parallel/test-dgram-send-default-host.js new file mode 100644 index 0000000000..0c50e70f43 --- /dev/null +++ b/test/parallel/test-dgram-send-default-host.js @@ -0,0 +1,43 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const dgram = require('dgram'); + +if (common.isWindows) { + // on Windows this test will fail + // see https://github.com/nodejs/node/pull/5407 + console.log('1..0 # Skipped: This test does not apply on Windows.'); + return; +} + +const client = dgram.createSocket('udp4'); + +const timer = setTimeout(function() { + throw new Error('Timeout'); +}, common.platformTimeout(2000)); + +const toSend = [new Buffer(256), new Buffer(256), new Buffer(256), 'hello']; + +toSend[0].fill('x'); +toSend[1].fill('y'); +toSend[2].fill('z'); + +client.on('listening', function() { + client.send(toSend[0], 0, toSend[0].length, common.PORT); + client.send(toSend[1], common.PORT); + client.send([toSend[2]], common.PORT); + client.send(toSend[3], 0, toSend[3].length, common.PORT); +}); + +client.on('message', function(buf, info) { + const expected = toSend.shift().toString(); + assert.ok(buf.toString() === expected, 'message was received correctly'); + + if (toSend.length === 0) { + client.close(); + clearTimeout(timer); + } +}); + +client.bind(common.PORT);