From babd2da2dddb1cd10d9b69d4b1618e0fc50737ee Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sat, 3 Mar 2018 15:43:14 +0800 Subject: [PATCH 1/2] net: fix usage of writeBuffer in makeSyncWrite The binding writeBuffer has been changed in https://github.com/nodejs/node/pull/19041 and it now requires the last argument to be a context object. makeSyncWrite was not updated accordingly, resulting assertions on Windows. This patch fixes the usage of writeBuffer there. --- lib/internal/net.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/internal/net.js b/lib/internal/net.js index adaa4475b02232..9c2602b79e9208 100644 --- a/lib/internal/net.js +++ b/lib/internal/net.js @@ -3,6 +3,7 @@ const Buffer = require('buffer').Buffer; const { isIPv6 } = process.binding('cares_wrap'); const { writeBuffer } = process.binding('fs'); +const errors = require('internal/errors'); const octet = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])'; const re = new RegExp(`^${octet}[.]${octet}[.]${octet}[.]${octet}$`); @@ -33,13 +34,13 @@ function makeSyncWrite(fd) { this._bytesDispatched += chunk.length; - try { - writeBuffer(fd, chunk, 0, chunk.length, null); - } catch (ex) { + const ctx = {}; + writeBuffer(fd, chunk, 0, chunk.length, null, undefined, ctx); + if (ctx.errno !== undefined) { + const ex = errors.uvException(ctx); // Legacy: net writes have .code === .errno, whereas writeBuffer gives the // raw errno number in .errno. - if (typeof ex.code === 'string') - ex.errno = ex.code; + ex.errno = ex.code; return cb(ex); } cb(); From 9620e7b62d579083526003fe2b056038cb0f0e85 Mon Sep 17 00:00:00 2001 From: Joyee Cheung Date: Sat, 3 Mar 2018 16:56:13 +0800 Subject: [PATCH 2/2] squash! update test-stdout-close-catch --- lib/internal/errors.js | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 9816474d7a067a..a4a79d671e4938 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -426,7 +426,23 @@ function message(key, args) { * @returns {Error} */ function uvException(ctx) { - const err = new Error(); + const [ code, uvmsg ] = errmap.get(ctx.errno); + let message = `${code}: ${uvmsg}, ${ctx.syscall}`; + + let path; + let dest; + if (ctx.path) { + path = ctx.path.toString(); + message += ` '${path}'`; + } + if (ctx.dest) { + dest = ctx.dest.toString(); + message += ` -> '${dest}'`; + } + + // Pass the message to the constructor instead of setting it on the object + // to make sure it is the same as the one created in C++ + const err = new Error(message); for (const prop of Object.keys(ctx)) { if (prop === 'message' || prop === 'path' || prop === 'dest') { @@ -435,20 +451,13 @@ function uvException(ctx) { err[prop] = ctx[prop]; } - const [ code, uvmsg ] = errmap.get(ctx.errno); err.code = code; - let message = `${code}: ${uvmsg}, ${ctx.syscall}`; - if (ctx.path) { - const path = ctx.path.toString(); - message += ` '${path}'`; + if (path) { err.path = path; } - if (ctx.dest) { - const dest = ctx.dest.toString(); - message += ` -> '${dest}'`; + if (dest) { err.dest = dest; } - err.message = message; Error.captureStackTrace(err, uvException); return err;