diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | iconv/Makefile | 4 | ||||
-rw-r--r-- | iconv/gconv_simple.c | 20 | ||||
-rw-r--r-- | iconv/tst-iconv2.c | 100 |
4 files changed, 127 insertions, 12 deletions
@@ -1,3 +1,18 @@ +2001-01-05 Ulrich Drepper <drepper@redhat.com> + + * iconv/gconv_simple.c (internal_ics4_loop): Correct test for + overflowing output buffer. + (internal_ucs4_loop_unaligned): Likewise. + (ucs4_internal_loop): Likewise. + (ucs4_internal_loop_unaligned): Likewise. + (internal_ucs4le_loop): Likewise. + (internal_ucs4le_loop_unaligned): Likewise. + (ucs4le_internal_loop): Likewise. + (ucs4le_internal_loop_unaligned): Likewise. + Reported by Owen Taylor <otaylor@redhat.com>. + * iconv/Makefile (tests): Add tst-iconv2. + * iconv/tst-iconv2.c: New file. + 2001-01-04 H.J. Lu <hjl@gnu.org> * elf/dl-support.c (DL_FIND_AUXV): New. Defined if not defined. diff --git a/iconv/Makefile b/iconv/Makefile index 6af661c..46ce05b 100644 --- a/iconv/Makefile +++ b/iconv/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc. +# Copyright (C) 1997, 1998, 2000, 2001 Free Software Foundation, Inc. # This file is part of the GNU C Library. # The GNU C Library is free software; you can redistribute it and/or @@ -34,7 +34,7 @@ CFLAGS-gconv_db.c = -DSTATIC_GCONV CFLAGS-gconv_simple.c = -DSTATIC_GCONV endif -tests = tst-iconv1 +tests = tst-iconv1 tst-iconv2 distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c index ab9f46a..8064bd9 100644 --- a/iconv/gconv_simple.c +++ b/iconv/gconv_simple.c @@ -1,5 +1,5 @@ /* Simple transformations functions. - Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -90,7 +90,7 @@ internal_ucs4_loop (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; @@ -135,7 +135,7 @@ internal_ucs4_loop_unaligned (struct __gconv_step *step, # endif /* Determine the status. */ - if (*outptrp == outend) + if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; @@ -260,7 +260,7 @@ ucs4_internal_loop (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; @@ -328,7 +328,7 @@ ucs4_internal_loop_unaligned (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; @@ -444,7 +444,7 @@ internal_ucs4le_loop (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; @@ -489,9 +489,9 @@ internal_ucs4le_loop_unaligned (struct __gconv_step *step, # endif /* Determine the status. */ - if (*inptrp == inend) + if (*inptrp + 4 > inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; @@ -609,7 +609,7 @@ ucs4le_internal_loop (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; @@ -678,7 +678,7 @@ ucs4le_internal_loop_unaligned (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp == outend) + else if (*outptrp + 4 > outend) result = __GCONV_FULL_OUTPUT; else result = __GCONV_INCOMPLETE_INPUT; diff --git a/iconv/tst-iconv2.c b/iconv/tst-iconv2.c new file mode 100644 index 0000000..e688f99 --- /dev/null +++ b/iconv/tst-iconv2.c @@ -0,0 +1,100 @@ +/* Copyright (C) 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 2001. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include <errno.h> +#include <iconv.h> +#include <mcheck.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +int +main (void) +{ + char buf[3]; + const wchar_t wc[1] = L"a"; + iconv_t cd; + char *inptr; + size_t inlen; + char *outptr; + size_t outlen; + size_t n; + int e; + int result = 0; + + mtrace (); + + cd = iconv_open ("UCS4", "WCHAR_T"); + if (cd == (iconv_t) -1) + { + printf ("cannot convert from wchar_t to UCS4: %m\n"); + exit (1); + } + + inptr = (char *) wc; + inlen = sizeof (wchar_t); + outptr = buf; + outlen = 3; + + n = iconv (cd, &inptr, &inlen, &outptr, &outlen); + e = errno; + + if (n != (size_t) -1) + { + printf ("incorrect iconv() return value: %zd, expected -1\n", n); + result = 1; + } + + if (e != E2BIG) + { + printf ("incorrect error value: %s, expected %s\n", + strerror (e), strerror (E2BIG)); + result = 1; + } + + if (inptr != (char *) wc) + { + puts ("inptr changed"); + result = 1; + } + + if (inlen != sizeof (wchar_t)) + { + puts ("inlen changed"); + result = 1; + } + + if (outptr != buf) + { + puts ("outptr changed"); + result = 1; + } + + if (outlen != 3) + { + puts ("outlen changed"); + result = 1; + } + + iconv_close (cd); + + return result; +} |