X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Flinebreak.c;h=efb6cb06bacfa992110a44c2270e40314e934fd9;hb=3cfbdb16d1cd2d66132179bb1549e0b3ffdec814;hp=c0ae08281718d2ff4b650a47bf4b79fc40a060ef;hpb=63dc1736288bf425917b06b2c7ad4931db9442f1;p=gnulib.git diff --git a/lib/linebreak.c b/lib/linebreak.c index c0ae08281..efb6cb06b 100644 --- a/lib/linebreak.c +++ b/lib/linebreak.c @@ -14,7 +14,7 @@ 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. */ +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include @@ -26,6 +26,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 +1024,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 +1108,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 +1191,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); @@ -1383,7 +1384,7 @@ iconv_string_length (iconv_t cd, const char *s, size_t n) 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 +1449,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 +1499,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 +1520,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 +1594,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 +1615,11 @@ 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 = + (size_in_bounds_p (memory_size) ? malloc (memory_size) : NULL); if (memory != NULL) { size_t *offtable = (size_t *) memory;