diff --git a/src/response.c b/src/response.c index f1ec040e..2ef00032 100644 --- a/src/response.c +++ b/src/response.c @@ -234,10 +234,14 @@ static handler_t http_response_physical_path_check(request_st * const r) { } } - buffer * const tb = r->tmp_buf; + const uint32_t pathused = r->physical.path.used; for (char *pprev = pathinfo; pathinfo; pprev = pathinfo, pathinfo = strchr(pathinfo+1, '/')) { - buffer_copy_string_len(tb, r->physical.path.ptr, pathinfo - r->physical.path.ptr); - const stat_cache_st * const nst = stat_cache_path_stat(tb); + /*(temporarily modify r->physical.path in-place)*/ + r->physical.path.used = pathinfo - r->physical.path.ptr + 1; + *pathinfo = '\0'; + const stat_cache_st * const nst = stat_cache_path_stat(&r->physical.path); + *pathinfo = '/'; + r->physical.path.used = pathused; if (NULL == nst) { pathinfo = pathinfo != pprev ? pprev : NULL; break; @@ -253,7 +257,7 @@ static handler_t http_response_physical_path_check(request_st * const r) { /* we have a PATHINFO */ if (pathinfo) { - size_t len = strlen(pathinfo), reqlen; + size_t len = r->physical.path.ptr+pathused-1-pathinfo, reqlen; if (r->conf.force_lowercase_filenames && len <= (reqlen = buffer_string_length(&r->target)) && buffer_eq_icase_ssn(r->target.ptr + reqlen - len, pathinfo, len)) {