summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Golle <daniel@makrotopia.org>2022-03-31 00:58:40 +0100
committerJo-Philipp Wich <jo@mein.io>2022-03-31 10:22:03 +0200
commite956bcf5d6533de9bbf2bbefae60c32e52348cf9 (patch)
treef5b13152cc76f797a23bb11ecbb175168e6b046e
parenta37f65471c2b69fa588cbf8e9794ff1fe6d04605 (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.c2
-rw-r--r--tests/custom/04_bugs/34_dirname_off_by_one16
2 files changed, 17 insertions, 1 deletions
diff --git a/lib/fs.c b/lib/fs.c
index bae5d28..99f6072 100644
--- a/lib/fs.c
+++ b/lib/fs.c
@@ -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 --