Avoid integer overflow on exotic platforms.
authorBruno Haible <bruno@clisp.org>
Tue, 11 Oct 2005 12:47:44 +0000 (12:47 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 11 Oct 2005 12:47:44 +0000 (12:47 +0000)
lib/ChangeLog
lib/strcasecmp.c
lib/strncasecmp.c

index d51d99e..9b0ed2c 100644 (file)
@@ -1,3 +1,11 @@
+2005-10-11  Bruno Haible  <bruno@clisp.org>
+
+       * strcasecmp.c: Include limits.h.
+       (strcasecmp): Avoid integer overflow on exotic platforms.
+       * strncasecmp.c: Include limits.h.
+       (strncasecmp): Avoid integer overflow on exotic platforms.
+       Reported by Paul Eggert.
+
 2005-10-06  Simon Josefsson  <jas@extundo.com>
 
        * hmac-md5.c: New file.
 
 2004-09-08  Bruno Haible  <bruno@clisp.org>
 
-       * stdint_.h.in: New file, taken from GNU clisp.
+       * stdint_.h: New file, taken from GNU clisp.
 
 2004-09-08  Oskar Liljeblad  <oskar@osk.mine.nu>
 
index 71f2eca..c1bac0a 100644 (file)
@@ -25,6 +25,7 @@
 #include "strcase.h"
 
 #include <ctype.h>
+#include <limits.h>
 
 #if HAVE_MBRTOWC
 # include "mbuiter.h"
@@ -93,6 +94,12 @@ strcasecmp (const char *s1, const char *s2)
        }
       while (c1 == c2);
 
-      return c1 - c2;
+      if (UCHAR_MAX <= INT_MAX)
+       return c1 - c2;
+      else
+       /* On machines where 'char' and 'int' are types of the same size, the
+          difference of two 'unsigned char' values - including the sign bit -
+          doesn't fit in an 'int'.  */
+       return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
     }
 }
index 72ead01..0209c39 100644 (file)
@@ -1,5 +1,5 @@
 /* strncasecmp.c -- case insensitive string comparator
-   Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 #include "strcase.h"
 
 #include <ctype.h>
+#include <limits.h>
 
 #define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
 
@@ -54,5 +55,11 @@ strncasecmp (const char *s1, const char *s2, size_t n)
     }
   while (c1 == c2);
 
-  return c1 - c2;
+  if (UCHAR_MAX <= INT_MAX)
+    return c1 - c2;
+  else
+    /* On machines where 'char' and 'int' are types of the same size, the
+       difference of two 'unsigned char' values - including the sign bit -
+       doesn't fit in an 'int'.  */
+    return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
 }