Created
February 18, 2020 17:21
-
-
Save xeioex/3360d66543dc5c9884517cc97aa94c74 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/njs_fs.c b/src/njs_fs.c | |
--- a/src/njs_fs.c | |
+++ b/src/njs_fs.c | |
@@ -566,11 +566,11 @@ njs_fs_symlink(njs_vm_t *vm, njs_value_t | |
njs_type_error(vm, "\"type\" must be a string"); | |
return NJS_ERROR; | |
} | |
- /* type is ignored */ | |
ret = symlink(target_path, file_path); | |
if (njs_slow_path(ret != 0)) { | |
- ret = njs_fs_error(vm, "symlink", strerror(errno), path, errno, &retval); | |
+ ret = njs_fs_error(vm, "symlink", strerror(errno), path, errno, | |
+ &retval); | |
goto done; | |
} | |
@@ -632,11 +632,14 @@ static njs_int_t | |
njs_fs_realpath(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, | |
njs_index_t calltype) | |
{ | |
+ u_char *resolved_path; | |
+ size_t size; | |
+ ssize_t length; | |
njs_int_t ret; | |
const char *file_path; | |
- char *resolved_path; | |
njs_value_t encoding, retval, *path, *callback, *options; | |
njs_fs_encoding_t enc; | |
+ char path_buf[MAXPATHLEN]; | |
static const njs_value_t string_encoding = njs_string("encoding"); | |
@@ -691,16 +694,20 @@ njs_fs_realpath(njs_vm_t *vm, njs_value_ | |
return NJS_ERROR; | |
} | |
- resolved_path = realpath(file_path, NULL); | |
+ resolved_path = (u_char *) realpath(file_path, path_buf); | |
if (njs_slow_path(resolved_path == NULL)) { | |
- ret = njs_fs_error(vm, "realpath", strerror(errno), path, errno, &retval); | |
+ ret = njs_fs_error(vm, "realpath", strerror(errno), path, errno, | |
+ &retval); | |
goto done; | |
} | |
- // XXX: utf8 paths | |
- ret = njs_string_new(vm, &retval, (const u_char*) resolved_path, | |
- strlen(resolved_path), strlen(resolved_path)); | |
- free(resolved_path); | |
+ size = njs_strlen(resolved_path); | |
+ length = njs_utf8_length(resolved_path, size); | |
+ if (njs_slow_path(length < 0)) { | |
+ length = 0; | |
+ } | |
+ | |
+ ret = njs_string_new(vm, &retval, resolved_path, size, length); | |
if (njs_slow_path(ret != NJS_OK)) { | |
return NJS_ERROR; | |
} | |
diff --git a/test/js/fs_promises_004.js b/test/js/fs_promises_004.js | |
--- a/test/js/fs_promises_004.js | |
+++ b/test/js/fs_promises_004.js | |
@@ -2,6 +2,7 @@ var fs = require('fs'); | |
var fsp = fs.promises; | |
var dname = './build/test/'; | |
var fname = dname + 'fs_promises_004'; | |
+var fname_utf8 = dname + 'fs_promises_αβγ_004'; | |
var lname = dname + 'fs_promises_004_lnk'; | |
@@ -28,6 +29,7 @@ var testSync = () => new Promise((resolv | |
} | |
fs.writeFileSync(fname, fname); | |
+ fs.writeFileSync(fname_utf8, fname_utf8); | |
var rname = fs.realpathSync(fname); | |
@@ -41,9 +43,15 @@ var testSync = () => new Promise((resolv | |
throw new Error('fs.symlinkSync error 3'); | |
} | |
+ var rname_utf8 = fs.realpathSync(fname_utf8); | |
+ if (rname_utf8.slice(-7,-4) != 'αβγ') { | |
+ throw new Error('fs.realpathSync error 2'); | |
+ } | |
+ | |
fs.unlinkSync(lname); | |
fs.accessSync(fname); | |
fs.unlinkSync(fname); | |
+ fs.unlinkSync(fname_utf8); | |
resolve(); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment