mirror of
https://github.com/curl/curl.git
synced 2024-11-27 05:50:21 +08:00
cookie.c: Made cookie sort function more deterministic
Since qsort implementations vary with regards to handling the order of similiar elements, this change makes the internal sort function more deterministic by comparing path length first, then domain length and finally the cookie name. Spotted with testcase 62 on Windows.
This commit is contained in:
parent
4b643f1ca4
commit
762961fe35
25
lib/cookie.c
25
lib/cookie.c
@ -5,7 +5,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
*
|
*
|
||||||
* This software is licensed as described in the file COPYING, which
|
* This software is licensed as described in the file COPYING, which
|
||||||
* you should have received as part of this distribution. The terms
|
* you should have received as part of this distribution. The terms
|
||||||
@ -777,11 +777,28 @@ static int cookie_sort(const void *p1, const void *p2)
|
|||||||
{
|
{
|
||||||
struct Cookie *c1 = *(struct Cookie **)p1;
|
struct Cookie *c1 = *(struct Cookie **)p1;
|
||||||
struct Cookie *c2 = *(struct Cookie **)p2;
|
struct Cookie *c2 = *(struct Cookie **)p2;
|
||||||
|
size_t l1, l2;
|
||||||
|
|
||||||
size_t l1 = c1->path?strlen(c1->path):0;
|
/* 1 - compare cookie path lengths */
|
||||||
size_t l2 = c2->path?strlen(c2->path):0;
|
l1 = c1->path ? strlen(c1->path) : 0;
|
||||||
|
l2 = c2->path ? strlen(c2->path) : 0;
|
||||||
|
|
||||||
return (l2 > l1) ? 1 : (l2 < l1) ? -1 : 0 ;
|
if(l1 != l2)
|
||||||
|
return (l2 > l1) ? 1 : -1 ; /* avoid size_t <=> int conversions */
|
||||||
|
|
||||||
|
/* 2 - compare cookie domain lengths */
|
||||||
|
l1 = c1->domain ? strlen(c1->domain) : 0;
|
||||||
|
l2 = c2->domain ? strlen(c2->domain) : 0;
|
||||||
|
|
||||||
|
if(l1 != l2)
|
||||||
|
return (l2 > l1) ? 1 : -1 ; /* avoid size_t <=> int conversions */
|
||||||
|
|
||||||
|
/* 3 - compare cookie names */
|
||||||
|
if(c1->name && c2->name)
|
||||||
|
return strcmp(c1->name, c2->name);
|
||||||
|
|
||||||
|
/* sorry, can't be more deterministic */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user