diff options
author | Daniel Golle <daniel@makrotopia.org> | 2022-03-31 00:58:40 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2022-03-31 10:22:03 +0200 |
commit | e956bcf5d6533de9bbf2bbefae60c32e52348cf9 (patch) | |
tree | f5b13152cc76f797a23bb11ecbb175168e6b046e | |
parent | a37f65471c2b69fa588cbf8e9794ff1fe6d04605 (diff) |
fs: fix off-by-one in fs.dirname() function
Make sure fs.dirname() doesn't truncate the last character of the
returned path. Previously ucv_string_new_length was called with a
length which no longer included the last character (which had just
been tested not to be a '/' or '.' and hence broke the loop at that
point).
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
[testcase added]
Signed-off-by: Paul Spooren <mail@aparcar.org>
[testcase folded into this commit and fixed]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
-rw-r--r-- | lib/fs.c | 2 | ||||
-rw-r--r-- | tests/custom/04_bugs/34_dirname_off_by_one | 16 |
2 files changed, 17 insertions, 1 deletions
@@ -948,7 +948,7 @@ uc_fs_dirname(uc_vm_t *vm, size_t nargs) if (i == 0) return ucv_string_new("/"); - return ucv_string_new_length(s, i); + return ucv_string_new_length(s, i + 1); } static uc_value_t * diff --git a/tests/custom/04_bugs/34_dirname_off_by_one b/tests/custom/04_bugs/34_dirname_off_by_one new file mode 100644 index 0000000..34ef7c7 --- /dev/null +++ b/tests/custom/04_bugs/34_dirname_off_by_one @@ -0,0 +1,16 @@ +Make sure fs.dirname() doesn't truncate the last character of the +returned path. Previously ucv_string_new_length was called with a +length which no longer included the last character (which had just +been tested not to be a '/' or '.' and hence broke the loop at that +point). + +-- Testcase -- +{% + fs = require('fs'); + printf("%s\n", fs.dirname('/etc/config/wireless')); +%} +-- End -- + +-- Expect stdout -- +/etc/config +-- End -- |