aboutsummaryrefslogtreecommitdiff
path: root/iconv
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-04-14 20:21:59 +0000
committerUlrich Drepper <drepper@redhat.com>1998-04-14 20:21:59 +0000
commit7919ea1578f7b9e51935fb3430ae36d180c97590 (patch)
tree732b5ff8a1258caf95c1f66b7fd5d11bbf6e6bf6 /iconv
parentaa802e964f8d45d993f6c3171faa83e422f21957 (diff)
downloadglibc-7919ea1578f7b9e51935fb3430ae36d180c97590.tar
glibc-7919ea1578f7b9e51935fb3430ae36d180c97590.tar.gz
glibc-7919ea1578f7b9e51935fb3430ae36d180c97590.tar.bz2
glibc-7919ea1578f7b9e51935fb3430ae36d180c97590.zip
Update.
1998-04-14 18:22 Ulrich Drepper <drepper@cygnus.com> * iconv/gconv_builtin.c (__gconv_get_builtin_trans): Initialize counter element of step. * iconv/gconv_dl.c: Don't mark get_sym as internal function. * iconv/gconv_simple.c (__gconv_transform_ucs4_ascii): Correct loop termination test. (__gconv_transform_ucs4_utf8): Likewise. Remove unnecessary variable ACTUALLY. (__gconv_transform_utf8_ucs4): Correct test for empty input.
Diffstat (limited to 'iconv')
-rw-r--r--iconv/gconv_builtin.c2
-rw-r--r--iconv/gconv_dl.c1
-rw-r--r--iconv/gconv_simple.c32
3 files changed, 19 insertions, 16 deletions
diff --git a/iconv/gconv_builtin.c b/iconv/gconv_builtin.c
index d913579ecc..6b14804da3 100644
--- a/iconv/gconv_builtin.c
+++ b/iconv/gconv_builtin.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <limits.h>
#include <string.h>
#include <gconv_int.h>
@@ -63,5 +64,6 @@ __gconv_get_builtin_trans (const char *name, struct gconv_step *step)
step->fct = map[cnt].fct;
step->init_fct = map[cnt].init;
step->end_fct = map[cnt].end;
+ step->counter = INT_MAX;
step->shlib_handle = NULL;
}
diff --git a/iconv/gconv_dl.c b/iconv/gconv_dl.c
index 9e80158f43..8375040d84 100644
--- a/iconv/gconv_dl.c
+++ b/iconv/gconv_dl.c
@@ -97,7 +97,6 @@ struct get_sym_args
};
static void
-internal_function
get_sym (void *a)
{
struct get_sym_args *args = (struct get_sym_args *) a;
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index aea0e8f021..21f3caee92 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -239,7 +239,7 @@ __gconv_transform_ucs4_ascii (struct gconv_step *step,
size_t cnt = 0;
while (data->outbufavail < data->outbufsize
- && cnt + sizeof (wchar_t) <= *inlen)
+ && cnt + sizeof (wchar_t) + 3 < *inlen)
{
if (*newinbuf < L'\0' || *newinbuf > L'\x7f')
{
@@ -348,11 +348,10 @@ __gconv_transform_ucs4_utf8 (struct gconv_step *step,
do
{
const wchar_t *newinbuf = (const wchar_t *) inbuf;
- size_t actually = 0;
size_t cnt = 0;
while (data->outbufavail < data->outbufsize
- && cnt * sizeof (wchar_t) <= *inlen)
+ && cnt * sizeof (wchar_t) + 3 < *inlen)
{
wchar_t wc = newinbuf[cnt];
@@ -364,11 +363,8 @@ __gconv_transform_ucs4_utf8 (struct gconv_step *step,
}
if (wc < 0x80)
- {
- /* It's an one byte sequence. */
- data->outbuf[data->outbufavail++] = (char) wc;
- ++actually;
- }
+ /* It's an one byte sequence. */
+ data->outbuf[data->outbufavail++] = (char) wc;
else
{
size_t step;
@@ -384,7 +380,6 @@ __gconv_transform_ucs4_utf8 (struct gconv_step *step,
start = data->outbufavail;
data->outbufavail += step;
- actually += step;
data->outbuf[start] = encoding_byte[step - 2];
--step;
do
@@ -400,11 +395,9 @@ __gconv_transform_ucs4_utf8 (struct gconv_step *step,
}
/* Remember how much we converted. */
- do_write += cnt * sizeof (wchar_t);
+ do_write += cnt;
*inlen -= cnt * sizeof (wchar_t);
- data->outbufavail += actually;
-
/* Check whether an illegal character appeared. */
if (result != GCONV_OK)
break;
@@ -444,7 +437,7 @@ __gconv_transform_ucs4_utf8 (struct gconv_step *step,
}
if (written != NULL && data->is_last)
- *written = do_write / sizeof (wchar_t);
+ *written = do_write;
return result;
}
@@ -484,6 +477,7 @@ __gconv_transform_utf8_ucs4 (struct gconv_step *step,
else
{
int save_errno = errno;
+ int extra = 0;
do_write = 0;
result = GCONV_OK;
@@ -546,8 +540,16 @@ __gconv_transform_utf8_ucs4 (struct gconv_step *step,
break;
}
+ if (cnt + count > *inlen)
+ {
+ /* We don't have enough input. */
+ --cnt;
+ extra = count;
+ break;
+ }
+
/* Read the possible remaining bytes. */
- while (cnt < *inbuf && count > 0)
+ while (count > 0)
{
byte = inbuf[cnt++];
--count;
@@ -586,7 +588,7 @@ __gconv_transform_utf8_ucs4 (struct gconv_step *step,
break;
}
- if (*inlen == 0 && !__mbsinit (data->statep))
+ if (*inlen < extra)
{
/* We have an incomplete character at the end. */
result = GCONV_INCOMPLETE_INPUT;