aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--iconv/gconv_simple.c29
-rw-r--r--iconv/loop.c16
-rw-r--r--iconvdata/unicode.c3
-rw-r--r--iconvdata/utf-16.c3
-rw-r--r--iconvdata/utf-32.c3
-rw-r--r--sysdeps/posix/getaddrinfo.c2
7 files changed, 46 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 185ce22..176144b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
2002-11-20 Ulrich Drepper <drepper@redhat.com>
+ * 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 fbdac83..35346aa 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 2fb73da..deb0173 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 c88f75d..df452d2 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 6423406..b816508 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 01f4b88..cc02651 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 3ba4bde..4af40f9 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 { \