Skip to content

Commit e6da803

Browse files
module,win: fix long path resolve
Fixes: nodejs#50753
1 parent 8a41d9b commit e6da803

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

src/node_file.cc

+8
Original file line numberDiff line numberDiff line change
@@ -2922,6 +2922,10 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo<Value>& args) {
29222922

29232923
for (int i = 0; i < legacy_main_extensions_with_main_end; i++) {
29242924
file_path = *initial_file_path + std::string(legacy_main_extensions[i]);
2925+
// TODO(StefanStojanovic): Remove ifdef after path.toNamespacedPath logic is ported to C++
2926+
#ifdef _WIN32
2927+
file_path = "\\\\?\\" + file_path;
2928+
#endif
29252929

29262930
switch (FilePathIsFile(env, file_path)) {
29272931
case BindingData::FilePathIsFileReturnType::kIsFile:
@@ -2959,6 +2963,10 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo<Value>& args) {
29592963
i < legacy_main_extensions_package_fallback_end;
29602964
i++) {
29612965
file_path = *initial_file_path + std::string(legacy_main_extensions[i]);
2966+
// TODO(StefanStojanovic): Remove ifdef after path.toNamespacedPath logic is ported to C++
2967+
#ifdef _WIN32
2968+
file_path = "\\\\?\\" + file_path;
2969+
#endif
29622970

29632971
switch (FilePathIsFile(env, file_path)) {
29642972
case BindingData::FilePathIsFileReturnType::kIsFile:

src/node_modules.cc

+6
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,14 @@ void BindingData::ReadPackageJSON(const FunctionCallbackInfo<Value>& args) {
256256
permission::PermissionScope::kFileSystemRead,
257257
path.ToStringView());
258258

259+
// TODO(StefanStojanovic): Remove ifdef after path.toNamespacedPath logic is ported to C++
260+
#ifdef _WIN32
261+
auto package_json = GetPackageJSON(
262+
realm, "\\\\?\\" + path.ToString(), is_esm ? &error_context : nullptr);
263+
#else
259264
auto package_json =
260265
GetPackageJSON(realm, path.ToString(), is_esm ? &error_context : nullptr);
266+
#endif
261267
if (package_json == nullptr) {
262268
return;
263269
}

test/es-module/test-GH-50753.js

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
'use strict';
2+
3+
// Flags: --expose-internals
4+
5+
const common = require('../common');
6+
if (!common.isWindows) {
7+
common.skip('this test is Windows-specific.');
8+
}
9+
10+
const fs = require('fs');
11+
const path = require('path');
12+
const tmpdir = require('../common/tmpdir');
13+
14+
// https://github.com/nodejs/node/issues/50753
15+
// Make a path that is more than 260 chars long.
16+
// Module layout will be the following:
17+
// package.json
18+
// main
19+
// main.js
20+
21+
const packageDirNameLen = Math.max(260 - tmpdir.path.length, 1);
22+
const packageDirName = tmpdir.resolve('x'.repeat(packageDirNameLen));
23+
const packageDirPath = path.resolve(packageDirName);
24+
const packageJsonFilePath = path.join(packageDirPath, 'package.json');
25+
const mainDirName = 'main';
26+
const mainDirPath = path.resolve(packageDirPath, mainDirName);
27+
const mainJsFile = 'main.js';
28+
const mainJsFilePath = path.resolve(mainDirPath, mainJsFile);
29+
30+
tmpdir.refresh();
31+
32+
fs.mkdirSync(packageDirPath);
33+
fs.writeFileSync(
34+
packageJsonFilePath,
35+
`{"main":"${mainDirName}/${mainJsFile}"}`
36+
);
37+
fs.mkdirSync(mainDirPath);
38+
fs.writeFileSync(mainJsFilePath, 'console.log("hello world");');
39+
40+
require('internal/modules/run_main').executeUserEntryPoint(packageDirPath);
41+
42+
tmpdir.refresh();

0 commit comments

Comments
 (0)