From eb9dc2a22dbce7b03fb8efbdc67724ffd9b7d85d Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 20 Nov 2002 23:42:04 +0000 Subject: Update. * iconv/gconv_simple.c (internal_ucs4le_loop_unaligned): Return __GCONV_EMPTY_INPUT only if input is really empty. Otherwise __GCONV_INCOMPLETE_INPUT. (ucs4le_internal_loop): Likewise. (ucs4le_internal_loop_unaligned): Likewise. * iconvdata/unicode.c (PREPARE_LOOP): Likewise. * iconvdata/utf-16.c (PREPARE_LOOP): Likewise. * iconvdata/utf-32.c (PREPARE_LOOP): Likewise. * iconv/loop.c (LOOPFCT): First test for empty input then for full output buffer. --- ChangeLog | 12 ++++++++++++ iconv/gconv_simple.c | 29 +++++++++++++++++++---------- iconv/loop.c | 16 ++++++++-------- iconvdata/unicode.c | 3 ++- iconvdata/utf-16.c | 3 ++- iconvdata/utf-32.c | 3 ++- sysdeps/posix/getaddrinfo.c | 2 +- 7 files changed, 46 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index 185ce2201e..176144b6fb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,17 @@ 2002-11-20 Ulrich Drepper + * iconv/gconv_simple.c (internal_ucs4le_loop_unaligned): Return + __GCONV_EMPTY_INPUT only if input is really empty. Otherwise + __GCONV_INCOMPLETE_INPUT. + (ucs4le_internal_loop): Likewise. + (ucs4le_internal_loop_unaligned): Likewise. + * iconvdata/unicode.c (PREPARE_LOOP): Likewise. + * iconvdata/utf-16.c (PREPARE_LOOP): Likewise. + * iconvdata/utf-32.c (PREPARE_LOOP): Likewise. + + * iconv/loop.c (LOOPFCT): First test for empty input then for full + output buffer. + * inet/getnameinfo.c: Use extend_alloca where appropriate. * sysdeps/posix/getaddrinfo.c: Likewise. diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c index fbdac832e0..35346aa498 100644 --- a/iconv/gconv_simple.c +++ b/iconv/gconv_simple.c @@ -489,12 +489,15 @@ internal_ucs4le_loop_unaligned (struct __gconv_step *step, # endif /* Determine the status. */ - if (*inptrp + 4 > inend) + if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp + 4 > outend) - result = __GCONV_FULL_OUTPUT; - else + else if (*inptrp + 4 > inend) result = __GCONV_INCOMPLETE_INPUT; + else + { + assert (*outptrp + 4 > outend); + result = __GCONV_FULL_OUTPUT; + } return result; } @@ -609,10 +612,13 @@ ucs4le_internal_loop (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp + 4 > outend) - result = __GCONV_FULL_OUTPUT; - else + else if (*inptrp + 4 > inend) result = __GCONV_INCOMPLETE_INPUT; + else + { + assert (*outptrp + 4 > outend); + result = __GCONV_FULL_OUTPUT; + } return result; } @@ -678,10 +684,13 @@ ucs4le_internal_loop_unaligned (struct __gconv_step *step, /* Determine the status. */ if (*inptrp == inend) result = __GCONV_EMPTY_INPUT; - else if (*outptrp + 4 > outend) - result = __GCONV_FULL_OUTPUT; - else + else if (*inptrp + 4 > inend) result = __GCONV_INCOMPLETE_INPUT; + else + { + assert (*outptrp + 4 > outend); + result = __GCONV_FULL_OUTPUT; + } return result; } diff --git a/iconv/loop.c b/iconv/loop.c index 2fb73da7ea..deb0173930 100644 --- a/iconv/loop.c +++ b/iconv/loop.c @@ -282,6 +282,14 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step, /* `if' cases for MIN_NEEDED_OUTPUT ==/!= 1 is made to help the compiler generating better code. They will be optimized away since MIN_NEEDED_OUTPUT is always a constant. */ + if (MIN_NEEDED_INPUT > 1 + && __builtin_expect (inptr + MIN_NEEDED_INPUT > inend, 0)) + { + /* We don't have enough input for another complete input + character. */ + result = __GCONV_INCOMPLETE_INPUT; + break; + } if ((MIN_NEEDED_OUTPUT != 1 && __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0)) || (MIN_NEEDED_OUTPUT == 1 @@ -291,14 +299,6 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step, result = __GCONV_FULL_OUTPUT; break; } - if (MIN_NEEDED_INPUT > 1 - && __builtin_expect (inptr + MIN_NEEDED_INPUT > inend, 0)) - { - /* We don't have enough input for another complete input - character. */ - result = __GCONV_INCOMPLETE_INPUT; - break; - } /* Here comes the body the user provides. It can stop with RESULT set to GCONV_INCOMPLETE_INPUT (if the size of the diff --git a/iconvdata/unicode.c b/iconvdata/unicode.c index c88f75dd85..df452d2a1d 100644 --- a/iconvdata/unicode.c +++ b/iconvdata/unicode.c @@ -49,7 +49,8 @@ { \ /* We have to find out which byte order the file is encoded in. */ \ if (inptr + 2 > inend) \ - return __GCONV_EMPTY_INPUT; \ + return (inptr == inend \ + ? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \ \ if (get16u (inptr) == BOM) \ /* Simply ignore the BOM character. */ \ diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c index 642340611d..b8165088e1 100644 --- a/iconvdata/utf-16.c +++ b/iconvdata/utf-16.c @@ -51,7 +51,8 @@ { \ /* We have to find out which byte order the file is encoded in. */ \ if (inptr + 2 > inend) \ - return __GCONV_EMPTY_INPUT; \ + return (inptr == inend \ + ? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \ \ if (get16u (inptr) == BOM) \ /* Simply ignore the BOM character. */ \ diff --git a/iconvdata/utf-32.c b/iconvdata/utf-32.c index 01f4b881dc..cc02651374 100644 --- a/iconvdata/utf-32.c +++ b/iconvdata/utf-32.c @@ -49,7 +49,8 @@ { \ /* We have to find out which byte order the file is encoded in. */ \ if (inptr + 4 > inend) \ - return __GCONV_EMPTY_INPUT; \ + return (inptr == inend \ + ? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \ \ if (get32u (inptr) == BOM) \ /* Simply ignore the BOM character. */ \ diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 3ba4bde25e..4af40f92ad 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -270,7 +270,7 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp, int i, herrno; \ size_t tmpbuflen; \ struct hostent th; \ - char *tmpbuf = NULL; \ + char *tmpbuf = NULL; \ tmpbuflen = 512; \ no_data = 0; \ do { \ -- cgit 1.4.1