diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/cookie.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/lib/cookie.c b/lib/cookie.c index a67204e6e..51c55de0a 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -143,6 +143,34 @@ static bool tailmatch(const char *cooke_domain, const char *hostname) return FALSE; } +static bool pathmatch(const char* cookie_path, const char* url_path) +{ + size_t cookie_path_len = strlen(cookie_path); + size_t url_path_len = strlen(url_path); + + if(url_path_len < cookie_path_len) + return FALSE; + + /* not using checkprefix() because matching should be case-sensitive */ + if(strncmp(cookie_path, url_path, cookie_path_len)) + return FALSE; + + /* it is true if cookie_path and url_path are the same */ + if(cookie_path_len == url_path_len) + return TRUE; + + /* here, cookie_path_len < url_path_len */ + + /* it is false if cookie path is /example and url path is /examples */ + if(cookie_path[cookie_path_len - 1] != '/') { + if(url_path[cookie_path_len] != '/') { + return FALSE; + } + } + /* matching! */ + return TRUE; +} + /* * Load cookies from all given cookie files (CURLOPT_COOKIEFILE). */ @@ -858,10 +886,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, /* now check the left part of the path with the cookies path requirement */ - if(!co->path || - /* not using checkprefix() because matching should be - case-sensitive */ - !strncmp(co->path, path, strlen(co->path)) ) { + if(!co->path || pathmatch(co->path, path) ) { /* and now, we know this is a match and we should create an entry for the return-linked-list */ |