summary refs log tree commit diff
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 185ce2201e..176144b6fb 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 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 {								\