Skip to content

Instantly share code, notes, and snippets.

@xeioex
Created February 18, 2020 17:21
Show Gist options
  • Save xeioex/3360d66543dc5c9884517cc97aa94c74 to your computer and use it in GitHub Desktop.
Save xeioex/3360d66543dc5c9884517cc97aa94c74 to your computer and use it in GitHub Desktop.
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