base64: Post basic validation tidy up

Due to the length checks introduced in commit e17c1b25bc there is no
need to allow for extra space in the output buffer for a non-padded last
quantum.
This commit is contained in:
Steve Holme
2013-11-30 19:09:09 +00:00
parent dc68120e63
commit 4d10f48629

View File

@@ -115,14 +115,13 @@ CURLcode Curl_base64_decode(const char *src,
return CURLE_BAD_CONTENT_ENCODING; return CURLE_BAD_CONTENT_ENCODING;
/* Calculate the number of quantums */ /* Calculate the number of quantums */
numQuantums = (length + equalsTerm) / 4; numQuantums = srcLen / 4;
/* Calculate the size of the decoded string */ /* Calculate the size of the decoded string */
rawlen = (numQuantums * 3) - equalsTerm; rawlen = (numQuantums * 3) - equalsTerm;
/* The buffer must be large enough to make room for the last quantum /* Allocate our buffer including room for a zero terminator */
(which may be partially thrown out) and the zero terminator. */ newstr = malloc(rawlen + 1);
newstr = malloc(rawlen+4);
if(!newstr) if(!newstr)
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
@@ -135,16 +134,16 @@ CURLcode Curl_base64_decode(const char *src,
newstr += 3; src += 4; newstr += 3; src += 4;
} }
/* This final decode may actually read slightly past the end of the buffer /* Decode the last quantum */
if the input string is missing pad bytes. This will almost always be
harmless. */
decodeQuantum(lastQuantum, src); decodeQuantum(lastQuantum, src);
for(i = 0; i < 3 - equalsTerm; i++) for(i = 0; i < 3 - equalsTerm; i++)
newstr[i] = lastQuantum[i]; newstr[i] = lastQuantum[i];
newstr[i] = '\0'; /* zero terminate */ /* Zero terminate */
newstr[i] = '\0';
*outlen = rawlen; /* return size of decoded data */ /* Return the size of decoded data */
*outlen = rawlen;
return CURLE_OK; return CURLE_OK;
} }