X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flinebreak.c;h=09f110cf190a09a15515e250e6246f2699cab502;hb=a6eeca796a39134d0f4ccfee9a29c65312fc0f47;hp=2274d160ae6da17a21966f4dc765d2ef5f3f525c;hpb=4e682a5704d85c7dcb6ce71049ab25061a7b76c8;p=gnulib.git diff --git a/lib/linebreak.c b/lib/linebreak.c index 2274d160a..09f110cf1 100644 --- a/lib/linebreak.c +++ b/lib/linebreak.c @@ -1,5 +1,5 @@ /* linebreak.c - line breaking of Unicode strings - Copyright (C) 2001-2003 Free Software Foundation, Inc. + Copyright (C) 2001-2003, 2006 Free Software Foundation, Inc. Written by Bruno Haible , 2001. This program is free software; you can redistribute it and/or modify @@ -13,12 +13,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +along with this program; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include /* Specification. */ #include "linebreak.h" @@ -26,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "c-ctype.h" +#include "xsize.h" #include "utf8-ucs4.h" @@ -1023,7 +1022,7 @@ u8_width_linebreaks (const unsigned char *s, size_t n, /* No line break for the moment, may be turned into UC_BREAK_POSSIBLE later, via last_p. */ } - + *p = UC_BREAK_PROHIBITED; w = uc_width (uc, encoding); @@ -1107,7 +1106,7 @@ u16_width_linebreaks (const unsigned short *s, size_t n, /* No line break for the moment, may be turned into UC_BREAK_POSSIBLE later, via last_p. */ } - + *p = UC_BREAK_PROHIBITED; w = uc_width (uc, encoding); @@ -1190,7 +1189,7 @@ u32_width_linebreaks (const unsigned int *s, size_t n, /* No line break for the moment, may be turned into UC_BREAK_POSSIBLE later, via last_p. */ } - + *p = UC_BREAK_PROHIBITED; w = uc_width (uc, encoding); @@ -1379,11 +1378,11 @@ iconv_string_length (iconv_t cd, const char *s, size_t n) char *outptr = tmpbuf; size_t outsize = TMPBUFSIZE; size_t res = iconv (cd, (ICONV_CONST char **) &inptr, &insize, &outptr, &outsize); - if (res == (size_t)(-1)) + if (res == (size_t)(-1) && errno != E2BIG) return (size_t)(-1); count += outptr - tmpbuf; } - /* Avoid glibc-2.1 bug and Solaris 2.7-2.9 bug. */ + /* Avoid glibc-2.1 bug and Solaris 7 through 9 bug. */ #if defined _LIBICONV_VERSION \ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun) { @@ -1448,7 +1447,7 @@ iconv_string_keeping_offsets (iconv_t cd, const char *s, size_t n, if (res == (size_t)(-1)) abort (); } - /* Avoid glibc-2.1 bug and Solaris 2.7 bug. */ + /* Avoid glibc-2.1 bug and Solaris 7 bug. */ #if defined _LIBICONV_VERSION \ || !((__GLIBC__ - 0 == 2 && __GLIBC_MINOR__ - 0 <= 1) || defined __sun) if (iconv (cd, NULL, NULL, &outptr, &outsize) == (size_t)(-1)) @@ -1498,7 +1497,7 @@ mbs_possible_linebreaks (const char *s, size_t n, const char *encoding, to_utf8 = (iconv_t)(-1); else # endif - /* Avoid Solaris 2.9 bug with GB2312, EUC-TW, BIG5, BIG5-HKSCS, GBK, + /* Avoid Solaris 9 bug with GB2312, EUC-TW, BIG5, BIG5-HKSCS, GBK, GB18030. */ # if defined __sun && !defined _LIBICONV_VERSION if ( STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) @@ -1519,7 +1518,9 @@ mbs_possible_linebreaks (const char *s, size_t n, const char *encoding, { /* Convert the string to UTF-8 and build a translation table from offsets into s to offsets into the translated string. */ - char *memory = malloc (n * sizeof (size_t) + m + m); + size_t memory_size = xsum3 (xtimes (n, sizeof (size_t)), m, m); + char *memory = + (size_in_bounds_p (memory_size) ? malloc (memory_size) : NULL); if (memory != NULL) { size_t *offtable = (size_t *) memory; @@ -1591,7 +1592,7 @@ mbs_width_linebreaks (const char *s, size_t n, to_utf8 = (iconv_t)(-1); else # endif - /* Avoid Solaris 2.9 bug with GB2312, EUC-TW, BIG5, BIG5-HKSCS, GBK, + /* Avoid Solaris 9 bug with GB2312, EUC-TW, BIG5, BIG5-HKSCS, GBK, GB18030. */ # if defined __sun && !defined _LIBICONV_VERSION if ( STREQ (encoding, "GB2312", 'G', 'B', '2', '3', '1', '2', 0, 0, 0) @@ -1612,7 +1613,12 @@ mbs_width_linebreaks (const char *s, size_t n, { /* Convert the string to UTF-8 and build a translation table from offsets into s to offsets into the translated string. */ - char *memory = malloc (n * sizeof (size_t) + m + m + (o != NULL ? m : 0)); + size_t memory_size = + xsum4 (xtimes (n, sizeof (size_t)), m, m, + (o != NULL ? m : 0)); + char *memory = + (char *) + (size_in_bounds_p (memory_size) ? malloc (memory_size) : NULL); if (memory != NULL) { size_t *offtable = (size_t *) memory;