From af8e8e3c0a0fbf632e8ec2b64b57307a39ce8da8 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Wed, 19 Nov 2008 23:24:33 +0000 Subject: Make handling of EILSEQ resynchronise stream if we've been asked to ignore errors. Some kind of handling for failure to read from input file. svn path=/trunk/iconv/; revision=5748 --- module/module.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'module') diff --git a/module/module.c b/module/module.c index beaf762..f50d64a 100644 --- a/module/module.c +++ b/module/module.c @@ -371,10 +371,14 @@ _kernel_oserror *do_iconv(int argc, const char *args) size_t outlen = sizeof(output); /* Fill input buffer */ - fread(input + leftover, 1, inlen - leftover, inf); + size_t read = fread(input + leftover, 1, + inlen - leftover, inf); + /** \todo Do we want better error handling? */ + if (read < inlen - leftover) + break; /* Convert text */ - size_t read = iconv(cd, &in, &inlen, &out, &outlen); + read = iconv(cd, &in, &inlen, &out, &outlen); if (read == (size_t) -1) { switch (errno) { case EILSEQ: @@ -390,6 +394,18 @@ _kernel_oserror *do_iconv(int argc, const char *args) fclose(inf); return NULL; } + + /* Resynchronise after junk input */ + while (inlen > 0) { + read = iconv(cd, &in, &inlen, + &out, &outlen); + if (read != (size_t) -1 || + errno != EILSEQ) + break; + + in++; + inlen--; + } break; default: break; -- cgit v1.2.3