urlapi: skip the extra dedotdot alloc if no dot in path

Saves an allocation for many/most URLs.

Updates test 1395 accordingly

Closes #10403
This commit is contained in:
Daniel Stenberg 2023-02-02 11:15:47 +01:00
parent 671158242d
commit 63c53ea627
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
2 changed files with 38 additions and 23 deletions

View file

@ -24,7 +24,7 @@
#include "curlcheck.h"
/* copied from urlapi.c */
extern char *dedotdotify(const char *input, size_t clen);
extern int dedotdotify(const char *input, size_t clen, char **out);
#include "memdebug.h"
@ -58,35 +58,43 @@ UNITTEST_START
{ "/1/./..", "/" },
{ "/1/./../2", "/2" },
{ "/hello/1/./../2", "/hello/2" },
{ "test/this", "test/this" },
{ "test/this", NULL },
{ "test/this/../now", "test/now" },
{ "/1../moo../foo", "/1../moo../foo"},
{ "/../../moo", "/moo"},
{ "/../../moo?andnot/../yay", "/moo?andnot/../yay"},
{ "/123?foo=/./&bar=/../", "/123?foo=/./&bar=/../"},
{ "/../moo/..?what", "/?what" },
{ "/", "/" },
{ "", "" },
{ "/", NULL },
{ "", NULL },
{ "/.../", "/.../" },
{ "./moo", "moo" },
{ "../moo", "moo" },
{ "/.", "/" },
{ "/..", "/" },
{ "/moo/..", "/" },
{ "..", "" },
{ ".", "" },
{ "/..", "/" },
{ "/.", "/" },
};
for(i = 0; i < sizeof(pairs)/sizeof(pairs[0]); i++) {
char *out = dedotdotify(pairs[i].input, strlen(pairs[i].input));
abort_unless(out != NULL, "returned NULL!");
char *out;
int err = dedotdotify(pairs[i].input, strlen(pairs[i].input), &out);
abort_unless(err == 0, "returned error");
abort_if(err && out, "returned error with output");
if(strcmp(out, pairs[i].output)) {
if(out && strcmp(out, pairs[i].output)) {
fprintf(stderr, "Test %u: '%s' gave '%s' instead of '%s'\n",
i, pairs[i].input, out, pairs[i].output);
fail("Test case output mismatched");
fails++;
}
else if(!out && pairs[i].output) {
fprintf(stderr, "Test %u: '%s' gave '%s' instead of NULL\n",
i, pairs[i].input, out);
fail("Test case output mismatched");
fails++;
}
else
fprintf(stderr, "Test %u: OK\n", i);
free(out);