diff options
author | Mike Hommey <mh@glandium.org> | 2016-08-15 10:21:29 +0900 |
---|---|---|
committer | Mike Hommey <mh@glandium.org> | 2016-08-15 10:21:29 +0900 |
commit | 70b8893d0b1092538b8db47cd8a7741dc37d4358 (patch) | |
tree | 6fdd207ac86efce3fef702ba1cc37577dfa68f17 | |
parent | 5d8c55a4077b4586326d3c6b139dab48e41e6100 (diff) | |
download | nspr-hg-70b8893d0b1092538b8db47cd8a7741dc37d4358.tar.gz |
Bug 1295056 - Return consistent results for PL_str*cmp when one of the pointers is NULL. r=wtcNSPR_4_13_BETA2
-rw-r--r-- | lib/libc/src/strcase.c | 12 | ||||
-rw-r--r-- | lib/libc/src/strcmp.c | 12 |
2 files changed, 16 insertions, 8 deletions
diff --git a/lib/libc/src/strcase.c b/lib/libc/src/strcase.c index b938ba41..ad542587 100644 --- a/lib/libc/src/strcase.c +++ b/lib/libc/src/strcase.c @@ -48,8 +48,10 @@ PL_strcasecmp(const char *a, const char *b) const unsigned char *ua = (const unsigned char *)a; const unsigned char *ub = (const unsigned char *)b; - if( ((const char *)0 == a) || (const char *)0 == b ) - return (PRIntn)(a-b); + if( (const char *)0 == a ) + return ((const char *)0 == b) ? 0 : -1; + if( (const char *)0 == b ) + return 1; while( (uc[*ua] == uc[*ub]) && ('\0' != *a) ) { @@ -67,8 +69,10 @@ PL_strncasecmp(const char *a, const char *b, PRUint32 max) const unsigned char *ua = (const unsigned char *)a; const unsigned char *ub = (const unsigned char *)b; - if( ((const char *)0 == a) || (const char *)0 == b ) - return (PRIntn)(a-b); + if( (const char *)0 == a ) + return ((const char *)0 == b) ? 0 : -1; + if( (const char *)0 == b ) + return 1; while( max && (uc[*ua] == uc[*ub]) && ('\0' != *a) ) { diff --git a/lib/libc/src/strcmp.c b/lib/libc/src/strcmp.c index 2d8fbcd9..296d7163 100644 --- a/lib/libc/src/strcmp.c +++ b/lib/libc/src/strcmp.c @@ -9,8 +9,10 @@ PR_IMPLEMENT(PRIntn) PL_strcmp(const char *a, const char *b) { - if( ((const char *)0 == a) || (const char *)0 == b ) - return (PRIntn)(a-b); + if( (const char *)0 == a ) + return ((const char *)0 == b) ? 0 : -1; + if( (const char *)0 == b ) + return 1; return (PRIntn)strcmp(a, b); } @@ -18,8 +20,10 @@ PL_strcmp(const char *a, const char *b) PR_IMPLEMENT(PRIntn) PL_strncmp(const char *a, const char *b, PRUint32 max) { - if( ((const char *)0 == a) || (const char *)0 == b ) - return (PRIntn)(a-b); + if( (const char *)0 == a ) + return ((const char *)0 == b) ? 0 : -1; + if( (const char *)0 == b ) + return 1; return (PRIntn)strncmp(a, b, (size_t)max); } |