Skip to content

Commit

Permalink
errors: provide defaults for unmapped uv errors
Browse files Browse the repository at this point in the history
libuv does not map 100% of errors. When an unmapped error is
encountered, the Map returns undefined, which is then
unsuccessfully destructured, causing an exception. This commit
adds a default value in the event of an unmapped error.

PR-URL: #29288
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
cjihrig authored and BridgeAR committed Sep 4, 2019
1 parent 3bc16f9 commit 30b80e5
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 2 deletions.
6 changes: 4 additions & 2 deletions lib/internal/errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,8 @@ function lazyUv() {
return uvBinding;
}

const uvUnmappedError = ['UNKNOWN', 'unknown error'];

function uvErrmapGet(name) {
uvBinding = lazyUv();
if (!uvBinding.errmap) {
Expand All @@ -346,7 +348,7 @@ function uvErrmapGet(name) {
* @returns {Error}
*/
function uvException(ctx) {
const [ code, uvmsg ] = uvErrmapGet(ctx.errno);
const [ code, uvmsg ] = uvErrmapGet(ctx.errno) || uvUnmappedError;
let message = `${code}: ${ctx.message || uvmsg}, ${ctx.syscall}`;

let path;
Expand Down Expand Up @@ -404,7 +406,7 @@ function uvException(ctx) {
* @returns {Error}
*/
function uvExceptionWithHostPort(err, syscall, address, port) {
const [ code, uvmsg ] = uvErrmapGet(err);
const [ code, uvmsg ] = uvErrmapGet(err) || uvUnmappedError;
const message = `${syscall} ${code}: ${uvmsg}`;
let details = '';

Expand Down
25 changes: 25 additions & 0 deletions test/parallel/test-uv-unmapped-exception.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// Flags: --expose-internals
'use strict';
require('../common');
const assert = require('assert');
const { uvException, uvExceptionWithHostPort } = require('internal/errors');

{
const exception = uvException({ errno: 100, syscall: 'open' });

assert.strictEqual(exception.message, 'UNKNOWN: unknown error, open');
assert.strictEqual(exception.errno, 100);
assert.strictEqual(exception.syscall, 'open');
assert.strictEqual(exception.code, 'UNKNOWN');
}

{
const exception = uvExceptionWithHostPort(100, 'listen', '127.0.0.1', 80);

assert.strictEqual(exception.message,
'listen UNKNOWN: unknown error 127.0.0.1:80');
assert.strictEqual(exception.code, 'UNKNOWN');
assert.strictEqual(exception.syscall, 'listen');
assert.strictEqual(exception.address, '127.0.0.1');
assert.strictEqual(exception.port, 80);
}

0 comments on commit 30b80e5

Please sign in to comment.