Skip to content

Commit e72e49a

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

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

src/node_file.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2922,6 +2922,11 @@ 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
2926+
// path.toNamespacedPath logic is ported to C++
2927+
#ifdef _WIN32
2928+
file_path = "\\\\?\\" + file_path;
2929+
#endif
29252930

29262931
switch (FilePathIsFile(env, file_path)) {
29272932
case BindingData::FilePathIsFileReturnType::kIsFile:
@@ -2959,6 +2964,11 @@ void BindingData::LegacyMainResolve(const FunctionCallbackInfo<Value>& args) {
29592964
i < legacy_main_extensions_package_fallback_end;
29602965
i++) {
29612966
file_path = *initial_file_path + std::string(legacy_main_extensions[i]);
2967+
// TODO(StefanStojanovic): Remove ifdef after
2968+
// path.toNamespacedPath logic is ported to C++
2969+
#ifdef _WIN32
2970+
file_path = "\\\\?\\" + file_path;
2971+
#endif
29622972

29632973
switch (FilePathIsFile(env, file_path)) {
29642974
case BindingData::FilePathIsFileReturnType::kIsFile:

src/node_modules.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,15 @@ void BindingData::ReadPackageJSON(const FunctionCallbackInfo<Value>& args) {
256256
permission::PermissionScope::kFileSystemRead,
257257
path.ToStringView());
258258

259+
// TODO(StefanStojanovic): Remove ifdef after
260+
// path.toNamespacedPath logic is ported to C++
261+
#ifdef _WIN32
262+
auto package_json = GetPackageJSON(
263+
realm, "\\\\?\\" + path.ToString(), is_esm ? &error_context : nullptr);
264+
#else
259265
auto package_json =
260266
GetPackageJSON(realm, path.ToString(), is_esm ? &error_context : nullptr);
267+
#endif
261268
if (package_json == nullptr) {
262269
return;
263270
}

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

Lines changed: 42 additions & 0 deletions
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)