diff options
Diffstat (limited to 'module/module.c')
-rw-r--r-- | module/module.c | 20 |
1 files changed, 18 insertions, 2 deletions
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; |