From 750c2c5e8a47277abcf874a0400f04901f623f8c Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Thu, 23 Dec 2021 10:04:48 +0800 Subject: [PATCH] normalize_path removes prefix one ./ and multi ../ --- src/shared_func.c | 45 +++++++++++++++++++++++++++++++---- src/tests/test_sorted_array.c | 4 ++-- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/shared_func.c b/src/shared_func.c index 3b3b085..8680f38 100644 --- a/src/shared_func.c +++ b/src/shared_func.c @@ -3031,8 +3031,12 @@ char *format_http_date(time_t t, BufferInfo *buffer) int normalize_path(const char *from, const char *filename, char *full_filename, const int size) { + const char *start; const char *last; - int len; + const char *end; + int up_count; + int path_len; + int i; if (IS_FILE_RESOURCE(from)) { from = from + FILE_RESOURCE_TAG_LEN; @@ -3047,8 +3051,35 @@ int normalize_path(const char *from, const char *filename, last = strrchr(from, '/'); if (last != NULL) { - len = last - from; - return snprintf(full_filename, size, "%.*s/%s", len, from, filename); + end = filename + strlen(filename); + if (memcmp(filename, "./", 2) == 0) { + start = filename + 2; + } else { + start = filename; + } + up_count = 0; + while (start + 3 < end) { + if (memcmp(start, "../", 3) != 0) { + break; + } + + ++up_count; + start += 3; + } + + path_len = last - from; + for (i=0; istr), from->str, uri); + (int)(last - from->str), from->str, start); } else { fpath.str = (char *)from->str; fpath.len = last - from->str; diff --git a/src/tests/test_sorted_array.c b/src/tests/test_sorted_array.c index 386c883..931fb0b 100644 --- a/src/tests/test_sorted_array.c +++ b/src/tests/test_sorted_array.c @@ -26,7 +26,7 @@ #include "fastcommon/array_allocator.h" #include "fastcommon/sorted_array.h" -#define ELEMENT_COUNT 1000 +#define ELEMENT_COUNT 64 * 1024 static bool silence; @@ -72,7 +72,7 @@ static int test_i64() } last_index = ELEMENT_COUNT - 1; - for (i=0; icount; i++) { + for (i=0; ielts[index]; input->elts[index] = input->elts[last_index - index];