1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00
* 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.
This commit is contained in:
Ulrich Drepper
2002-11-20 23:42:04 +00:00
parent 218d76e034
commit eb9dc2a22d
7 changed files with 46 additions and 22 deletions

View File

@@ -1,5 +1,17 @@
2002-11-20 Ulrich Drepper <drepper@redhat.com> 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. * inet/getnameinfo.c: Use extend_alloca where appropriate.
* sysdeps/posix/getaddrinfo.c: Likewise. * sysdeps/posix/getaddrinfo.c: Likewise.

View File

@@ -489,12 +489,15 @@ internal_ucs4le_loop_unaligned (struct __gconv_step *step,
# endif # endif
/* Determine the status. */ /* Determine the status. */
if (*inptrp + 4 > inend) if (*inptrp == inend)
result = __GCONV_EMPTY_INPUT; result = __GCONV_EMPTY_INPUT;
else if (*outptrp + 4 > outend) else if (*inptrp + 4 > inend)
result = __GCONV_FULL_OUTPUT;
else
result = __GCONV_INCOMPLETE_INPUT; result = __GCONV_INCOMPLETE_INPUT;
else
{
assert (*outptrp + 4 > outend);
result = __GCONV_FULL_OUTPUT;
}
return result; return result;
} }
@@ -609,10 +612,13 @@ ucs4le_internal_loop (struct __gconv_step *step,
/* Determine the status. */ /* Determine the status. */
if (*inptrp == inend) if (*inptrp == inend)
result = __GCONV_EMPTY_INPUT; result = __GCONV_EMPTY_INPUT;
else if (*outptrp + 4 > outend) else if (*inptrp + 4 > inend)
result = __GCONV_FULL_OUTPUT;
else
result = __GCONV_INCOMPLETE_INPUT; result = __GCONV_INCOMPLETE_INPUT;
else
{
assert (*outptrp + 4 > outend);
result = __GCONV_FULL_OUTPUT;
}
return result; return result;
} }
@@ -678,10 +684,13 @@ ucs4le_internal_loop_unaligned (struct __gconv_step *step,
/* Determine the status. */ /* Determine the status. */
if (*inptrp == inend) if (*inptrp == inend)
result = __GCONV_EMPTY_INPUT; result = __GCONV_EMPTY_INPUT;
else if (*outptrp + 4 > outend) else if (*inptrp + 4 > inend)
result = __GCONV_FULL_OUTPUT;
else
result = __GCONV_INCOMPLETE_INPUT; result = __GCONV_INCOMPLETE_INPUT;
else
{
assert (*outptrp + 4 > outend);
result = __GCONV_FULL_OUTPUT;
}
return result; return result;
} }

View File

@@ -282,6 +282,14 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step,
/* `if' cases for MIN_NEEDED_OUTPUT ==/!= 1 is made to help the /* `if' cases for MIN_NEEDED_OUTPUT ==/!= 1 is made to help the
compiler generating better code. They will be optimized away compiler generating better code. They will be optimized away
since MIN_NEEDED_OUTPUT is always a constant. */ 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 if ((MIN_NEEDED_OUTPUT != 1
&& __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0)) && __builtin_expect (outptr + MIN_NEEDED_OUTPUT > outend, 0))
|| (MIN_NEEDED_OUTPUT == 1 || (MIN_NEEDED_OUTPUT == 1
@@ -291,14 +299,6 @@ FCTNAME (LOOPFCT) (struct __gconv_step *step,
result = __GCONV_FULL_OUTPUT; result = __GCONV_FULL_OUTPUT;
break; 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 /* Here comes the body the user provides. It can stop with
RESULT set to GCONV_INCOMPLETE_INPUT (if the size of the RESULT set to GCONV_INCOMPLETE_INPUT (if the size of the

View File

@@ -49,7 +49,8 @@
{ \ { \
/* We have to find out which byte order the file is encoded in. */ \ /* We have to find out which byte order the file is encoded in. */ \
if (inptr + 2 > inend) \ if (inptr + 2 > inend) \
return __GCONV_EMPTY_INPUT; \ return (inptr == inend \
? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \
\ \
if (get16u (inptr) == BOM) \ if (get16u (inptr) == BOM) \
/* Simply ignore the BOM character. */ \ /* Simply ignore the BOM character. */ \

View File

@@ -51,7 +51,8 @@
{ \ { \
/* We have to find out which byte order the file is encoded in. */ \ /* We have to find out which byte order the file is encoded in. */ \
if (inptr + 2 > inend) \ if (inptr + 2 > inend) \
return __GCONV_EMPTY_INPUT; \ return (inptr == inend \
? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \
\ \
if (get16u (inptr) == BOM) \ if (get16u (inptr) == BOM) \
/* Simply ignore the BOM character. */ \ /* Simply ignore the BOM character. */ \

View File

@@ -49,7 +49,8 @@
{ \ { \
/* We have to find out which byte order the file is encoded in. */ \ /* We have to find out which byte order the file is encoded in. */ \
if (inptr + 4 > inend) \ if (inptr + 4 > inend) \
return __GCONV_EMPTY_INPUT; \ return (inptr == inend \
? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT); \
\ \
if (get32u (inptr) == BOM) \ if (get32u (inptr) == BOM) \
/* Simply ignore the BOM character. */ \ /* Simply ignore the BOM character. */ \

View File

@@ -270,7 +270,7 @@ gaih_inet_serv (const char *servicename, const struct gaih_typeproto *tp,
int i, herrno; \ int i, herrno; \
size_t tmpbuflen; \ size_t tmpbuflen; \
struct hostent th; \ struct hostent th; \
char *tmpbuf = NULL; \ char *tmpbuf = NULL; \
tmpbuflen = 512; \ tmpbuflen = 512; \
no_data = 0; \ no_data = 0; \
do { \ do { \