diff options
| -rw-r--r-- | lib/util/fix_win32_filename.c | 10 | ||||
| -rw-r--r-- | tests/libutil/fix_win32_filename.c | 4 | 
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)  | 
