Index: nspr/nspr/lib/libc/src/strcmp.c
===================================================================
--- nspr.orig/nspr/lib/libc/src/strcmp.c
+++ nspr/nspr/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);
 }
Index: nspr/nspr/lib/tests/string.c
===================================================================
--- nspr.orig/nspr/lib/tests/string.c
+++ nspr/nspr/lib/tests/string.c
@@ -873,6 +873,8 @@ PRBool test_011(void)
           { (const char *)0, (const char *)0, 0 },
           { (const char *)0, "word", -1 },
           { "word", (const char *)0, 1 },
+          { (const char *)0, (const char *)-1, -1 },
+          { (const char *)-1, (const char *)0, 1 },
           { "word", "word", 0 },
           { "aZYXVUT", "bZYXVUT", -1 },
           { "aZYXVUT", "bAAAAAA", -1 },
@@ -928,8 +930,12 @@ PRBool test_011(void)
         }
 
         printf("FAIL %d: %s-%s -> %d, not %d\n", i,
-               array[i].one ? array[i].one : "(null)",
-               array[i].two ? array[i].two : "(null)",
+               array[i].one ? (array[i].one == (const char *)-1 ? "(highptr)"
+                                                                : array[i].one)
+                            : "(null)",
+               array[i].two ? (array[i].two == (const char *)-1 ? "(highptr)"
+                                                                : array[i].two)
+                            : "(null)",
                rv, array[i].sign);
         return PR_FALSE;
     }
@@ -958,6 +964,10 @@ PRBool test_012(void)
           { "word", (const char *)0, 0, 1 },
           { "word", (const char *)0, 1, 1 },
           { "word", (const char *)0, 4, 1 },
+          { (const char *)0, (const char *)-1, 0, -1 },
+          { (const char *)0, (const char *)-1, 1, -1 },
+          { (const char *)-1, (const char *)0, 0, 1 },
+          { (const char *)-1, (const char *)0, 1, 1 },
           { "word", "word", 0, 0 },
           { "word", "word", 1, 0 },
           { "word", "word", 3, 0 },
@@ -1073,8 +1083,12 @@ PRBool test_012(void)
         }
 
         printf("FAIL %d: %s-%s/%ld -> %d, not %d\n", i,
-               array[i].one ? array[i].one : "(null)",
-               array[i].two ? array[i].two : "(null)",
+               array[i].one ? (array[i].one == (const char *)-1 ? "(highptr)"
+                                                                : array[i].one)
+                            : "(null)",
+               array[i].two ? (array[i].two == (const char *)-1 ? "(highptr)"
+                                                                : array[i].two)
+                            : "(null)",
                array[i].max, rv, array[i].sign);
         return PR_FALSE;
     }
@@ -1096,6 +1110,8 @@ PRBool test_013(void)
           { (const char *)0, (const char *)0, 0 },
           { (const char *)0, "word", -1 },
           { "word", (const char *)0, 1 },
+          { (const char *)0, (const char *)-1, -1 },
+          { (const char *)-1, (const char *)0, 1 },
           { "word", "word", 0 },
           { "aZYXVUT", "bZYXVUT", -1 },
           { "aZYXVUT", "bAAAAAA", -1 },
@@ -1151,8 +1167,12 @@ PRBool test_013(void)
         }
 
         printf("FAIL %d: %s-%s -> %d, not %d\n", i,
-               array[i].one ? array[i].one : "(null)",
-               array[i].two ? array[i].two : "(null)",
+               array[i].one ? (array[i].one == (const char *)-1 ? "(highptr)"
+                                                                : array[i].one)
+                            : "(null)",
+               array[i].two ? (array[i].two == (const char *)-1 ? "(highptr)"
+                                                                : array[i].two)
+                            : "(null)",
                rv, array[i].sign);
         return PR_FALSE;
     }
@@ -1181,6 +1201,10 @@ PRBool test_014(void)
           { "word", (const char *)0, 0, 1 },
           { "word", (const char *)0, 1, 1 },
           { "word", (const char *)0, 4, 1 },
+          { (const char *)0, (const char *)-1, 0, -1 },
+          { (const char *)0, (const char *)-1, 1, -1 },
+          { (const char *)-1, (const char *)0, 0, 1 },
+          { (const char *)-1, (const char *)0, 1, 1 },
           { "word", "word", 0, 0 },
           { "word", "word", 1, 0 },
           { "word", "word", 3, 0 },
@@ -1295,8 +1319,12 @@ PRBool test_014(void)
         }
 
         printf("FAIL %d: %s-%s/%ld -> %d, not %d\n", i,
-               array[i].one ? array[i].one : "(null)",
-               array[i].two ? array[i].two : "(null)",
+               array[i].one ? (array[i].one == (const char *)-1 ? "(highptr)"
+                                                                : array[i].one)
+                            : "(null)",
+               array[i].two ? (array[i].two == (const char *)-1 ? "(highptr)"
+                                                                : array[i].two)
+                            : "(null)",
                array[i].max, rv, array[i].sign);
         return PR_FALSE;
     }
Index: nspr/nspr/lib/libc/src/strcase.c
===================================================================
--- nspr.orig/nspr/lib/libc/src/strcase.c
+++ nspr/nspr/lib/libc/src/strcase.c
@@ -48,8 +48,10 @@ PL_strcasecmp(const char *a, const char
     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
     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) )
     {
