From: Bruno Haible Date: Sun, 26 Apr 2009 10:24:08 +0000 (+0200) Subject: Avoid test failures on AIX and OSF/1. X-Git-Tag: v0.1~5979 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=a5bd4a560247e63db562041f9d136ba83a8b95fb;p=gnulib.git Avoid test failures on AIX and OSF/1. --- diff --git a/ChangeLog b/ChangeLog index 2d4f282f0..5d76bf7f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 2009-04-26 Bruno Haible + Avoid test failures on AIX and OSF/1. + * lib/uniconv/u8-conv-from-enc.c (u8_conv_from_encoding): Avoid calling + malloc(0). + * lib/uniconv/u8-conv-to-enc.c (u8_conv_to_encoding): Likewise. + * lib/unilbrk/ulc-possible-linebreaks.c (ulc_possible_linebreaks): + Likewise. + * lib/unilbrk/ulc-width-linebreaks.c (ulc_width_linebreaks): Likewise. + * lib/uniwbrk/ulc-wordbreaks.c (ulc_wordbreaks): Likewise. + * lib/uniconv/u-conv-to-enc.h (FUNC): Likewise. Fix memory leak. + * lib/unistr/u-cpy-alloc.h (FUNC): Call malloc(1) instead of malloc(0). + * doc/posix-functions/malloc.texi: Document the portability problem + related to malloc(0). + +2009-04-26 Bruno Haible + * modules/unistr/u8-cpy-alloc (Depends-on): Add malloc-posix. * modules/unistr/u16-cpy-alloc (Depends-on): Likewise. * modules/unistr/u32-cpy-alloc (Depends-on): Likewise. diff --git a/doc/posix-functions/malloc.texi b/doc/posix-functions/malloc.texi index a8ab87949..bd2a8cf5d 100644 --- a/doc/posix-functions/malloc.texi +++ b/doc/posix-functions/malloc.texi @@ -16,7 +16,10 @@ mingw. Portability problems not fixed by Gnulib: @itemize +@code{malloc (0)} always returns a NULL pointer on some platforms: +AIX 5.1, OSF/1 5.1. @end itemize Extension: Gnulib provides a module @samp{malloc} that substitutes a -@code{malloc} implementation that behaves more like the glibc implementation. +@code{malloc} implementation that behaves more like the glibc implementation, +regarding the result of @code{malloc (0)}. diff --git a/lib/uniconv/u-conv-to-enc.h b/lib/uniconv/u-conv-to-enc.h index 68ff81484..144ea4017 100644 --- a/lib/uniconv/u-conv-to-enc.h +++ b/lib/uniconv/u-conv-to-enc.h @@ -1,5 +1,5 @@ /* Conversion from UTF-16/UTF-32 to legacy encodings. - Copyright (C) 2002, 2006-2008 Free Software Foundation, Inc. + Copyright (C) 2002, 2006-2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -25,7 +25,7 @@ FUNC (const char *tocode, size_t *scaled_offsets; int retval; - if (offsets != NULL) + if (offsets != NULL && srclen > 0) { scaled_offsets = (size_t *) malloc (srclen * sizeof (UNIT) * sizeof (size_t)); @@ -70,7 +70,7 @@ FUNC (const char *tocode, return -1; utf8_srclen = tmpbufsize; - if (offsets != NULL) + if (offsets != NULL && utf8_srclen > 0) { scaled_offsets = (size_t *) malloc (utf8_srclen * sizeof (size_t)); if (scaled_offsets == NULL) @@ -88,12 +88,11 @@ FUNC (const char *tocode, scaled_offsets, resultp, lengthp); if (retval < 0) { + int saved_errno = errno; + free (scaled_offsets); if (utf8_src != tmpbuf) - { - int saved_errno = errno; - free (utf8_src); - errno = saved_errno; - } + free (utf8_src); + errno = saved_errno; return -1; } if (offsets != NULL) diff --git a/lib/uniconv/u8-conv-from-enc.c b/lib/uniconv/u8-conv-from-enc.c index bcd0cd081..09eba1e51 100644 --- a/lib/uniconv/u8-conv-from-enc.c +++ b/lib/uniconv/u8-conv-from-enc.c @@ -1,5 +1,5 @@ /* Conversion to UTF-8 from legacy encodings. - Copyright (C) 2002, 2006-2007 Free Software Foundation, Inc. + Copyright (C) 2002, 2006-2007, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -65,7 +65,7 @@ u8_conv_from_encoding (const char *fromcode, } /* Memory allocation. */ - if (*resultp != NULL && *lengthp >= srclen) + if ((*resultp != NULL && *lengthp >= srclen) || srclen == 0) result = *resultp; else { diff --git a/lib/uniconv/u8-conv-to-enc.c b/lib/uniconv/u8-conv-to-enc.c index bc2cc09c9..85404d4be 100644 --- a/lib/uniconv/u8-conv-to-enc.c +++ b/lib/uniconv/u8-conv-to-enc.c @@ -1,5 +1,5 @@ /* Conversion from UTF-8 to legacy encodings. - Copyright (C) 2002, 2006-2007 Free Software Foundation, Inc. + Copyright (C) 2002, 2006-2007, 2009 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published @@ -50,7 +50,7 @@ u8_conv_to_encoding (const char *tocode, #endif /* Memory allocation. */ - if (*resultp != NULL && *lengthp >= srclen) + if ((*resultp != NULL && *lengthp >= srclen) || srclen == 0) result = *resultp; else { diff --git a/lib/unilbrk/ulc-possible-linebreaks.c b/lib/unilbrk/ulc-possible-linebreaks.c index 74cd42a67..2032154d0 100644 --- a/lib/unilbrk/ulc-possible-linebreaks.c +++ b/lib/unilbrk/ulc-possible-linebreaks.c @@ -1,5 +1,5 @@ /* Line breaking of strings. - Copyright (C) 2001-2003, 2006-2008 Free Software Foundation, Inc. + Copyright (C) 2001-2003, 2006-2009 Free Software Foundation, Inc. Written by Bruno Haible , 2001. This program is free software: you can redistribute it and/or modify it @@ -62,9 +62,9 @@ ulc_possible_linebreaks (const char *s, size_t n, const char *encoding, s, n, offsets, &t, &m) == 0) { - char *q = (char *) malloc (m); + char *q = (char *) (m > 0 ? malloc (m) : NULL); - if (q != NULL) + if (m == 0 || q != NULL) { size_t i; diff --git a/lib/unilbrk/ulc-width-linebreaks.c b/lib/unilbrk/ulc-width-linebreaks.c index 5340a4deb..71354aeca 100644 --- a/lib/unilbrk/ulc-width-linebreaks.c +++ b/lib/unilbrk/ulc-width-linebreaks.c @@ -1,5 +1,5 @@ /* Line breaking of strings. - Copyright (C) 2001-2003, 2006-2008 Free Software Foundation, Inc. + Copyright (C) 2001-2003, 2006-2009 Free Software Foundation, Inc. Written by Bruno Haible , 2001. This program is free software: you can redistribute it and/or modify it @@ -64,9 +64,10 @@ ulc_width_linebreaks (const char *s, size_t n, s, n, offsets, &t, &m) == 0) { - char *memory = (char *) malloc (m + (o != NULL ? m : 0)); + char *memory = + (char *) (m > 0 ? malloc (m + (o != NULL ? m : 0)) : NULL); - if (memory != NULL) + if (m == 0 || memory != NULL) { char *q = (char *) memory; char *o8 = (o != NULL ? (char *) (q + m) : NULL); diff --git a/lib/unistr/u-cpy-alloc.h b/lib/unistr/u-cpy-alloc.h index 7e18a189d..dace3e2e6 100644 --- a/lib/unistr/u-cpy-alloc.h +++ b/lib/unistr/u-cpy-alloc.h @@ -1,5 +1,5 @@ /* Copy piece of UTF-8/UTF-16/UTF-32 string. - Copyright (C) 1999, 2002, 2006-2007 Free Software Foundation, Inc. + Copyright (C) 1999, 2002, 2006-2007, 2009 Free Software Foundation, Inc. Written by Bruno Haible , 2002. This program is free software: you can redistribute it and/or modify it @@ -23,7 +23,7 @@ FUNC (const UNIT *s, size_t n) { UNIT *dest; - dest = (UNIT *) malloc (n * sizeof (UNIT)); + dest = (UNIT *) malloc (n > 0 ? n * sizeof (UNIT) : 1); if (dest != NULL) { #if 0 diff --git a/lib/uniwbrk/ulc-wordbreaks.c b/lib/uniwbrk/ulc-wordbreaks.c index 85e4efd47..b97b13de2 100644 --- a/lib/uniwbrk/ulc-wordbreaks.c +++ b/lib/uniwbrk/ulc-wordbreaks.c @@ -64,9 +64,9 @@ ulc_wordbreaks (const char *s, size_t n, char *p) s, n, offsets, &t, &m) == 0) { - char *q = (char *) malloc (m); + char *q = (char *) (m > 0 ? malloc (m) : NULL); - if (q != NULL) + if (m == 0 || q != NULL) { size_t i;