Mercurial > hg > octave-lyh > gnulib-hg
changeset 6355:bbcddcd96f1f
Avoid integer overflow on exotic platforms.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Tue, 11 Oct 2005 12:47:44 +0000 |
parents | ec955d9e0ccd |
children | 998625a579ed |
files | lib/ChangeLog lib/strcasecmp.c lib/strncasecmp.c |
diffstat | 3 files changed, 26 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -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. @@ -2803,7 +2811,7 @@ 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>
--- a/lib/strcasecmp.c +++ b/lib/strcasecmp.c @@ -25,6 +25,7 @@ #include "strcase.h" #include <ctype.h> +#include <limits.h> #if HAVE_MBRTOWC # include "mbuiter.h" @@ -93,6 +94,12 @@ } 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); } }
--- a/lib/strncasecmp.c +++ b/lib/strncasecmp.c @@ -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 @@ } 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); }