summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/fix_win32_filename.c10
-rw-r--r--tests/libutil/fix_win32_filename.c4
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/util/fix_win32_filename.c b/lib/util/fix_win32_filename.c
index 948de66..d368eb0 100644
--- a/lib/util/fix_win32_filename.c
+++ b/lib/util/fix_win32_filename.c
@@ -66,7 +66,15 @@ static const char *bad_names[] = {
static buffer_t *handle_component(buffer_t *buf, const char *comp, size_t len)
{
for (size_t i = 0; i < sizeof(bad_names) / sizeof(bad_names[0]); ++i) {
- if (!strncasecmp(comp, bad_names[i], len)) {
+ size_t badlen = strlen(bad_names[i]);
+
+ if (badlen > len || strncasecmp(comp, bad_names[i], badlen))
+ continue;
+
+ while (badlen < len && comp[badlen] == '_')
+ ++badlen;
+
+ if (badlen == len) {
buf = buffer_append(buf, comp, len);
if (buf != NULL)
buf = buffer_append(buf, "_", 1);
diff --git a/tests/libutil/fix_win32_filename.c b/tests/libutil/fix_win32_filename.c
index a4f71e8..e8932d6 100644
--- a/tests/libutil/fix_win32_filename.c
+++ b/tests/libutil/fix_win32_filename.c
@@ -22,6 +22,10 @@ static const struct {
{ "foo/bar/test.LPT1/bla", "foo/bar/test.LPT1_/bla" },
{ "C:\\/foo/COM1.bla/bar",
"C\xEF\x80\xBA\xEF\x81\x9c/foo/COM1_.bla/bar" },
+ { "com1", "com1_" },
+ { "COM1_", "COM1__" },
+ { "COM1__", "COM1___" },
+ { "COM1___", "COM1____" },
};
int main(int argc, char **argv)