summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--module/module.c20
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;