summaryrefslogtreecommitdiffstats
path: root/src/util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.cc')
-rw-r--r--src/util.cc17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/util.cc b/src/util.cc
index 73f13f8..6bafc91 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -113,29 +113,30 @@ bool CanonicalizePath(char* path, int* len, string* err) {
}
while (src < end) {
- const char* sep = (const char*)memchr(src, '/', end - src);
- if (sep == NULL)
- sep = end;
-
if (*src == '.') {
- if (sep - src == 1) {
+ if (src[1] == '/' || src + 1 == end) {
// '.' component; eliminate.
src += 2;
continue;
- } else if (sep - src == 2 && src[1] == '.') {
+ } else if (src[1] == '.' && (src[2] == '/' || src + 2 == end)) {
// '..' component. Back up if possible.
if (component_count > 0) {
dst = components[component_count - 1];
src += 3;
--component_count;
} else {
- while (src <= sep)
- *dst++ = *src++;
+ *dst++ = *src++;
+ *dst++ = *src++;
+ *dst++ = *src++;
}
continue;
}
}
+ const char* sep = (const char*)memchr(src, '/', end - src);
+ if (sep == NULL)
+ sep = end;
+
if (sep > src) {
if (component_count == kMaxPathComponents)
Fatal("path has too many components");