module: use UNC paths when loading native addons
When using require to load a native addon the path must be converted into a long path, otherwise the addon will fail to be loaded on windows if the path is longer than 260 characters. PR-URL: https://github.com/nodejs/node/pull/2965 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Benjamin Gruenbaum <inglor@gmail.com>
This commit is contained in:
parent
59cb053394
commit
8593b3e8eb
@ -456,7 +456,9 @@ Module._extensions['.json'] = function(module, filename) {
|
|||||||
|
|
||||||
|
|
||||||
//Native extension for .node
|
//Native extension for .node
|
||||||
Module._extensions['.node'] = process.dlopen;
|
Module._extensions['.node'] = function(module, filename) {
|
||||||
|
return process.dlopen(module, path._makeLong(filename));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// bootstrap main module.
|
// bootstrap main module.
|
||||||
|
13
test/addons/load-long-path/binding.cc
Normal file
13
test/addons/load-long-path/binding.cc
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include <node.h>
|
||||||
|
#include <v8.h>
|
||||||
|
|
||||||
|
void Method(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
||||||
|
v8::Isolate* isolate = args.GetIsolate();
|
||||||
|
args.GetReturnValue().Set(v8::String::NewFromUtf8(isolate, "world"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void init(v8::Local<v8::Object> target) {
|
||||||
|
NODE_SET_METHOD(target, "hello", Method);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_MODULE(binding, init);
|
8
test/addons/load-long-path/binding.gyp
Normal file
8
test/addons/load-long-path/binding.gyp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'binding',
|
||||||
|
'sources': [ 'binding.cc' ]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
29
test/addons/load-long-path/test.js
Normal file
29
test/addons/load-long-path/test.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
'use strict';
|
||||||
|
const common = require('../../common');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
common.refreshTmpDir();
|
||||||
|
|
||||||
|
// make a path that is more than 260 chars long.
|
||||||
|
// Any given folder cannot have a name longer than 260 characters,
|
||||||
|
// so create 10 nested folders each with 30 character long names.
|
||||||
|
var addonDestinationDir = path.resolve(common.tmpDir);
|
||||||
|
|
||||||
|
for (var i = 0; i < 10; i++) {
|
||||||
|
addonDestinationDir = path.join(addonDestinationDir, 'x'.repeat(30));
|
||||||
|
fs.mkdirSync(addonDestinationDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
const addonPath = path.join(__dirname, 'build', 'Release', 'binding.node');
|
||||||
|
const addonDestinationPath = path.join(addonDestinationDir, 'binding.node');
|
||||||
|
|
||||||
|
// Copy binary to long path destination
|
||||||
|
var contents = fs.readFileSync(addonPath);
|
||||||
|
fs.writeFileSync(addonDestinationPath, contents);
|
||||||
|
|
||||||
|
// Attempt to load at long path destination
|
||||||
|
var addon = require(addonDestinationPath);
|
||||||
|
assert(addon != null);
|
||||||
|
assert(addon.hello() == 'world');
|
Loading…
x
Reference in New Issue
Block a user