clean up various bits of lint, and one outstanding bug:

+ properly terminate base64-encoded output, fixes a bug whereby if the input
  length was divisible by 3, a bad base64 encoding would ensue
This commit is contained in:
agc 2010-09-10 04:57:17 +00:00
parent 5472a32d66
commit 2f6667e4d4
1 changed files with 18 additions and 10 deletions

View File

@ -246,6 +246,7 @@ b64encode(const char *in, const size_t insize, void *vp, size_t outsize, int lin
int blocksout; int blocksout;
int wordlen; int wordlen;
wordlen = 0;
for (blocksout = 0, inp = in, outp = out; (size_t)(inp - in) < insize && (size_t)(outp - out) < outsize;) { for (blocksout = 0, inp = in, outp = out; (size_t)(inp - in) < insize && (size_t)(outp - out) < outsize;) {
for (wordlen = 0, i = 0; i < sizeof(wordin); i++) { for (wordlen = 0, i = 0; i < sizeof(wordin); i++) {
wordin[i] = (uint8_t) *inp++; wordin[i] = (uint8_t) *inp++;
@ -262,13 +263,20 @@ b64encode(const char *in, const size_t insize, void *vp, size_t outsize, int lin
} }
blocksout++; blocksout++;
} }
if (blocksout >= (int)(linesize / sizeof(wordout)) || if (linesize > 0) {
(size_t)(inp - in) >= insize) { if (blocksout >= (int)(linesize / sizeof(wordout)) ||
if (blocksout) { (size_t)(inp - in) >= insize) {
*outp++ = '\r'; if (blocksout) {
*outp++ = '\n'; *outp++ = '\r';
*outp++ = '\n';
}
blocksout = 0;
} }
blocksout = 0; }
}
if (wordlen == 3 && (size_t)(outp - out) < outsize - 4) {
for (i = 0 ; i < 4 ; i++) {
*outp++ = '=';
} }
} }
return (int)(outp - out); return (int)(outp - out);
@ -296,16 +304,16 @@ int
b64decode(const char *in, const size_t insize, void *vp, size_t outsize) b64decode(const char *in, const size_t insize, void *vp, size_t outsize)
{ {
const char *inp; const char *inp;
unsigned wordlen;
unsigned i;
uint8_t wordout[3]; uint8_t wordout[3];
uint8_t wordin[4]; uint8_t wordin[4];
uint8_t v; uint8_t v;
char *out = vp; char *out = vp;
char *outp; char *outp;
int wordlen;
int i;
for (inp = in, outp = out ; (size_t)(inp - in) < insize && (size_t)(outp - out) < outsize ; ) { for (inp = in, outp = out ; (size_t)(inp - in) < insize && (size_t)(outp - out) < outsize ; ) {
for (wordlen = 0, i = 0 ; i < 4 && (size_t)(inp - in) < insize ; i++) { for (wordlen = 0, i = 0 ; i < sizeof(wordin) && (size_t)(inp - in) < insize ; i++) {
/* get a single character */ /* get a single character */
for (v = 0; (size_t)(inp - in) < insize && v == 0 ; ) { for (v = 0; (size_t)(inp - in) < insize && v == 0 ; ) {
if (*inp == '\r' && *(inp + 1) == '\n') { if (*inp == '\r' && *(inp + 1) == '\n') {
@ -318,7 +326,7 @@ b64decode(const char *in, const size_t insize, void *vp, size_t outsize)
} }
} }
} }
/* perhaps 0 pad */ /* perhaps 0x0 pad */
if ((size_t)(inp - in) < insize) { if ((size_t)(inp - in) < insize) {
wordlen += 1; wordlen += 1;
if (v) { if (v) {