From: chris mikkelson Date: Fri, 12 Mar 2010 22:18:01 +0000 (-0600) Subject: Rewrite base64 processing loop, and handle errors. X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=6211099e6bd4b5799422fa2f1078d17704fb0a4b;p=liburl Rewrite base64 processing loop, and handle errors. --- diff --git a/base64.c b/base64.c index 4252292..c428d6b 100644 --- a/base64.c +++ b/base64.c @@ -32,6 +32,7 @@ base64_init(void) struct b64_state { unsigned u; int v; + int error; }; static struct b64_state * @@ -54,22 +55,19 @@ b64_decode(struct b64_state *b64s, char *s, int len, char *p; unsigned u, v; int l; - *outlen = 0; - l = 0; + *outlen = 0; u = b64s->u; v = b64s->v; - b64s->u = b64s->v = 0; for (p = s; p < s + len;) { - if (*p == '\r' || *p == '\n') continue; - if (size < 3) return (int)(p - s); + if (*p == '\r' || *p == '\n') { + p++; + continue; + } + if (size < 3) goto done; for (; v < 4; v++) { - if (p == s + len) { - b64s->u = u; - b64s->v = v; - return len; - } + if (p >= s + len) goto done; l = i64[(unsigned int)*p++]; if (l < 0) return -1; u <<= 6; @@ -88,6 +86,8 @@ b64_decode(struct b64_state *b64s, char *s, int len, } v = 0; } +done: b64s->v = v; + b64s->u = u; return p - s; } @@ -129,11 +129,12 @@ base64_process(msgproc *m, char *buf, size_t len) struct b64_state *b64s = (struct b64_state *)msgproc_getpriv(m); msgproc *next = msgproc_next(m); + if (b64s->error) return; while (len > 0) { ret = b64_decode(b64s, buf, len, tmp, sizeof(tmp), &tmplen); if (ret < 1) { - /* TODO: handle errors in *b64s; skip all - text after error, or recover? */ + b64s->error = 1; + break; } msgproc_process(next, tmp, tmplen); buf += ret; len -= ret;