Skip to content

Commit 4dcdfaf

Browse files
isaacsry
isaacs
authored andcommitted
Fix require("../blah") issues
Added some more tests, and refactored the uri and path modules to use the same normalization logic, so that nothing is relying on flaky regexps. http://groups.google.com/group/nodejs/browse_thread/thread/34779f8c10098c5e http://groups.google.com/group/nodejs/browse_thread/thread/1aa0146b92582679#msg_9822c03998cb4064
1 parent a2d809f commit 4dcdfaf

File tree

10 files changed

+62
-38
lines changed

10 files changed

+62
-38
lines changed

lib/uri.js

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,7 @@ function uri_parse (url) {
9696
}
9797

9898
/* normalize */
99-
var directories = [];
100-
for (var i = 0; i < items.directories.length; i++) {
101-
var directory = items.directories[i];
102-
if (directory == '.') {
103-
} else if (directory == '..') {
104-
if (directories.length && directories[directories.length - 1] != '..')
105-
directories.pop();
106-
else
107-
directories.push('..');
108-
} else {
109-
directories.push(directory);
110-
}
111-
}
112-
items.directories = directories;
99+
items.directories = require("path").normalizeArray(items.directories);
113100

114101
items.domains = items.domain.split(".");
115102

src/node.js

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -667,31 +667,31 @@ var posix = posixModule.exports;
667667

668668
var pathModule = createInternalModule("path", function (exports) {
669669
exports.join = function () {
670-
var joined = "",
671-
dotre = /^\.\//,
672-
dotreplace = "",
673-
dotdotre = /(^|(\/)([^\/]+\/)?)\.\.\//g,
674-
dotdotreplace = ""
675-
for (var i = 0; i < arguments.length; i++) {
676-
var part = arguments[i].toString();
677-
678-
/* Some logic to shorten paths */
679-
if (part === ".") continue;
680-
while (dotre.exec(part)) part = part.replace(dotre, dotreplace);
681-
682-
if (i === 0) {
683-
part = part.replace(/\/*$/, "/");
684-
} else if (i === arguments.length - 1) {
685-
part = part.replace(/^\/*/, "");
670+
return exports.normalize(Array.prototype.join.call(arguments, "/"));
671+
};
672+
673+
function normalizeArray (parts) {
674+
var directories = [];
675+
for (var i = 0; i < parts.length; i++) {
676+
var directory = parts[i];
677+
if (directory === "." || (directory === "" && directories.length)) {
678+
continue;
679+
}
680+
if (
681+
directory === ".."
682+
&& directories.length
683+
&& directories[directories.length - 1] != '..'
684+
) {
685+
directories.pop();
686686
} else {
687-
part = part.replace(/^\/*/, "").replace(/\/*$/, "/");
687+
directories.push(directory);
688688
}
689-
joined += part;
690689
}
691-
// replace /foo/../bar/baz with /bar/baz
692-
while (dotdotre.exec(joined)) joined = joined.replace(dotdotre, dotdotreplace);
693-
return joined;
694-
690+
return directories;
691+
}
692+
693+
exports.normalize = function (path) {
694+
return normalizeArray(path.split("/")).join("/");
695695
};
696696

697697
exports.dirname = function (path) {
@@ -898,7 +898,6 @@ Module.prototype.loadScript = function (filename, loadPromise) {
898898
require.paths = process.paths;
899899
require.async = requireAsync;
900900
require.main = process.mainModule;
901-
902901
// create wrapper function
903902
var wrapper = "var __wrap__ = function (exports, require, module, __filename) { "
904903
+ content
@@ -958,6 +957,10 @@ process.mainModule = createModule(".");
958957
var loadPromise = new process.Promise();
959958
process.mainModule.load(process.ARGV[1], loadPromise);
960959

960+
loadPromise.addErrback(function(e) {
961+
throw e;
962+
});
963+
961964
// All our arguments are loaded. We've evaluated all of the scripts. We
962965
// might even have created TCP servers. Now we enter the main eventloop. If
963966
// there are no watchers on the loop (except for the ones that were
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
var root = require("./../root");
3+
4+
exports.hello = function () {
5+
return root.calledFromFoo();
6+
};

test/mjsunit/fixtures/cycles/root.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
var foo = exports.foo = require("./folder/foo");
3+
4+
exports.hello = "hello";
5+
exports.sayHello = function () {
6+
return foo.hello();
7+
};
8+
exports.calledFromFoo = function () {
9+
return exports.hello;
10+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
exports.hello = "hello from one!";
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exports.hello = require('./hello').hello;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
exports.hello = "hello from two!";
2+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
exports.hello = require('./hello').hello;

test/mjsunit/test-module-loading.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,17 @@ assert.equal("D", d3.D());
3333
assert.equal(true, d4.D instanceof Function);
3434
assert.equal("D", d4.D());
3535

36+
debug("test index.js modules ids and relative loading")
37+
var one = require("./fixtures/nested-index/one"),
38+
two = require("./fixtures/nested-index/two");
39+
assert.notEqual(one.hello, two.hello);
40+
41+
debug("test cycles containing a .. path");
42+
var root = require("./fixtures/cycles/root"),
43+
foo = require("./fixtures/cycles/folder/foo");
44+
assert.equal(root.foo, foo);
45+
assert.equal(root.sayHello(), root.hello);
46+
3647
var errorThrown = false;
3748
try {
3849
require("./fixtures/throws_error");

test/mjsunit/test-readdir.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ puts("readdir " + fixturesDir);
77

88
promise.addCallback(function (files) {
99
p(files);
10-
assert.deepEqual(["a.js", "b", "multipart.js", "test_ca.pem",
10+
assert.deepEqual(["a.js", "b","cycles", "multipart.js",
11+
"nested-index","test_ca.pem",
1112
"test_cert.pem", "test_key.pem", "throws_error.js", "x.txt"], files.sort());
1213
});
1314

0 commit comments

Comments
 (0)