diff options
Diffstat (limited to 'libs/libcurl/src/cookie.c')
| -rw-r--r-- | libs/libcurl/src/cookie.c | 32 | 
1 files changed, 19 insertions, 13 deletions
diff --git a/libs/libcurl/src/cookie.c b/libs/libcurl/src/cookie.c index cc698af53b..03f9699bd4 100644 --- a/libs/libcurl/src/cookie.c +++ b/libs/libcurl/src/cookie.c @@ -330,7 +330,7 @@ static char *sanitize_cookie_path(const char *cookie_path)   */
  void Curl_cookie_loadfiles(struct Curl_easy *data)
  {
 -  struct curl_slist *list = data->set.cookielist;
 +  struct curl_slist *list = data->state.cookielist;
    if(list) {
      Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
      while(list) {
 @@ -365,9 +365,7 @@ static void strstore(char **str, const char *newstr, size_t len)    DEBUGASSERT(newstr);
    DEBUGASSERT(str);
    free(*str);
 -  *str = Curl_memdup(newstr, len + 1);
 -  if(*str)
 -    (*str)[len] = 0;
 +  *str = Curl_strndup(newstr, len);
  }
  /*
 @@ -1029,15 +1027,23 @@ Curl_cookie_add(struct Curl_easy *data,     * dereference it.
     */
    if(data && (domain && co->domain && !Curl_host_is_ipnum(co->domain))) {
 -    const psl_ctx_t *psl = Curl_psl_use(data);
 -    int acceptable;
 -
 -    if(psl) {
 -      acceptable = psl_is_cookie_domain_acceptable(psl, domain, co->domain);
 -      Curl_psl_release(data);
 +    bool acceptable = FALSE;
 +    char lcase[256];
 +    char lcookie[256];
 +    size_t dlen = strlen(domain);
 +    size_t clen = strlen(co->domain);
 +    if((dlen < sizeof(lcase)) && (clen < sizeof(lcookie))) {
 +      const psl_ctx_t *psl = Curl_psl_use(data);
 +      if(psl) {
 +        /* the PSL check requires lowercase domain name and pattern */
 +        Curl_strntolower(lcase, domain, dlen + 1);
 +        Curl_strntolower(lcookie, co->domain, clen + 1);
 +        acceptable = psl_is_cookie_domain_acceptable(psl, lcase, lcookie);
 +        Curl_psl_release(data);
 +      }
 +      else
 +        acceptable = !bad_domain(domain, strlen(domain));
      }
 -    else
 -      acceptable = !bad_domain(domain, strlen(domain));
      if(!acceptable) {
        infof(data, "cookie '%s' dropped, domain '%s' must not "
 @@ -1347,7 +1353,7 @@ static int cookie_sort_ct(const void *p1, const void *p2)  static struct Cookie *dup_cookie(struct Cookie *src)
  {
 -  struct Cookie *d = calloc(sizeof(struct Cookie), 1);
 +  struct Cookie *d = calloc(1, sizeof(struct Cookie));
    if(d) {
      CLONE(domain);
      CLONE(path);
  | 
