Skip to content

Commit

Permalink
module: improve resolve paths validation
Browse files Browse the repository at this point in the history
This commit adds input validation to require.resolve()'s
paths option. Prior to this change, passing in a non-array
value lead to a misleading 'module not found' error.

Refs: nodejs#27583

PR-URL: nodejs#27613
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
cjihrig authored and Trott committed May 10, 2019
1 parent ae749e7 commit a608caa
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 16 deletions.
38 changes: 22 additions & 16 deletions lib/internal/modules/cjs/loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ const { compileFunction } = internalBinding('contextify');

const {
ERR_INVALID_ARG_VALUE,
ERR_INVALID_OPT_VALUE,
ERR_REQUIRE_ESM
} = require('internal/errors').codes;
const { validateString } = require('internal/validators');
Expand Down Expand Up @@ -573,28 +574,33 @@ Module._resolveFilename = function(request, parent, isMain, options) {

var paths;

if (typeof options === 'object' && options !== null &&
Array.isArray(options.paths)) {
const isRelative = request.startsWith('./') || request.startsWith('../') ||
(isWindows && request.startsWith('.\\') || request.startsWith('..\\'));
if (typeof options === 'object' && options !== null) {
if (Array.isArray(options.paths)) {
const isRelative = request.startsWith('./') ||
request.startsWith('../') ||
(isWindows && request.startsWith('.\\') ||
request.startsWith('..\\'));

if (isRelative) {
paths = options.paths;
} else {
const fakeParent = new Module('', null);
if (isRelative) {
paths = options.paths;
} else {
const fakeParent = new Module('', null);

paths = [];
paths = [];

for (var i = 0; i < options.paths.length; i++) {
const path = options.paths[i];
fakeParent.paths = Module._nodeModulePaths(path);
const lookupPaths = Module._resolveLookupPaths(request, fakeParent);
for (var i = 0; i < options.paths.length; i++) {
const path = options.paths[i];
fakeParent.paths = Module._nodeModulePaths(path);
const lookupPaths = Module._resolveLookupPaths(request, fakeParent);

for (var j = 0; j < lookupPaths.length; j++) {
if (!paths.includes(lookupPaths[j]))
paths.push(lookupPaths[j]);
for (var j = 0; j < lookupPaths.length; j++) {
if (!paths.includes(lookupPaths[j]))
paths.push(lookupPaths[j]);
}
}
}
} else if (options.paths !== undefined) {
throw new ERR_INVALID_OPT_VALUE('options.paths', options.paths);
}
} else {
paths = Module._resolveLookupPaths(request, parent);
Expand Down
8 changes: 8 additions & 0 deletions test/fixtures/require-resolve.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,11 @@ assert.throws(() => {
);
}
}

// Test paths option validation
common.expectsError(() => {
require.resolve('.\\three.js', { paths: 'foo' })
}, {
code: 'ERR_INVALID_OPT_VALUE',
type: TypeError,
});

0 comments on commit a608caa

Please sign in to comment.