mirror of
https://github.com/moparisthebest/curl
synced 2025-01-09 04:58:00 -05:00
getpart: Fixed base64 encoded parts following commit e17c1b25bc
This commit is contained in:
parent
3b59696a93
commit
9a1755264f
@ -152,46 +152,27 @@ static int appenddata(char **dst_buf, /* dest buffer */
|
|||||||
char *src_buf, /* source buffer */
|
char *src_buf, /* source buffer */
|
||||||
int src_b64) /* != 0 if source is base64 encoded */
|
int src_b64) /* != 0 if source is base64 encoded */
|
||||||
{
|
{
|
||||||
size_t need_alloc, src_len;
|
size_t need_alloc = 0;
|
||||||
union {
|
size_t src_len = strlen(src_buf);
|
||||||
unsigned char *as_uchar;
|
|
||||||
char *as_char;
|
|
||||||
} buf64;
|
|
||||||
|
|
||||||
src_len = strlen(src_buf);
|
|
||||||
if(!src_len)
|
if(!src_len)
|
||||||
return GPE_OK;
|
return GPE_OK;
|
||||||
|
|
||||||
buf64.as_char = NULL;
|
need_alloc = src_len + *dst_len + 1;
|
||||||
|
|
||||||
if(src_b64) {
|
if(src_b64) {
|
||||||
/* base64 decode the given buffer */
|
if(src_buf[src_len - 1] == '\r')
|
||||||
int error = (int) Curl_base64_decode(src_buf, &buf64.as_uchar, &src_len);
|
src_len--;
|
||||||
if(error)
|
|
||||||
return GPE_OUT_OF_MEMORY;
|
|
||||||
src_buf = buf64.as_char;
|
|
||||||
if(!src_len || !src_buf) {
|
|
||||||
/*
|
|
||||||
** currently there is no way to tell apart an OOM condition in
|
|
||||||
** Curl_base64_decode() from zero length decoded data. For now,
|
|
||||||
** let's just assume it is an OOM condition, currently we have
|
|
||||||
** no input for this function that decodes to zero length data.
|
|
||||||
*/
|
|
||||||
if(buf64.as_char)
|
|
||||||
free(buf64.as_char);
|
|
||||||
return GPE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
need_alloc = src_len + *dst_len + 1;
|
if(src_buf[src_len - 1] == '\n')
|
||||||
|
src_len--;
|
||||||
|
}
|
||||||
|
|
||||||
/* enlarge destination buffer if required */
|
/* enlarge destination buffer if required */
|
||||||
if(need_alloc > *dst_alloc) {
|
if(need_alloc > *dst_alloc) {
|
||||||
size_t newsize = need_alloc * 2;
|
size_t newsize = need_alloc * 2;
|
||||||
char *newptr = realloc(*dst_buf, newsize);
|
char *newptr = realloc(*dst_buf, newsize);
|
||||||
if(!newptr) {
|
if(!newptr) {
|
||||||
if(buf64.as_char)
|
|
||||||
free(buf64.as_char);
|
|
||||||
return GPE_OUT_OF_MEMORY;
|
return GPE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
*dst_alloc = newsize;
|
*dst_alloc = newsize;
|
||||||
@ -203,8 +184,43 @@ static int appenddata(char **dst_buf, /* dest buffer */
|
|||||||
*dst_len += src_len;
|
*dst_len += src_len;
|
||||||
*(*dst_buf + *dst_len) = '\0';
|
*(*dst_buf + *dst_len) = '\0';
|
||||||
|
|
||||||
if(buf64.as_char)
|
return GPE_OK;
|
||||||
free(buf64.as_char);
|
}
|
||||||
|
|
||||||
|
static int decodedata(char **buf, /* dest buffer */
|
||||||
|
size_t *len) /* dest buffer data length */
|
||||||
|
{
|
||||||
|
int error = 0;
|
||||||
|
char *buf64 = NULL;
|
||||||
|
size_t src_len = 0;
|
||||||
|
|
||||||
|
if(!*len)
|
||||||
|
return GPE_OK;
|
||||||
|
|
||||||
|
/* base64 decode the given buffer */
|
||||||
|
error = (int) Curl_base64_decode(*buf, (unsigned char **) &buf64, &src_len);
|
||||||
|
if(error)
|
||||||
|
return GPE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
if(!src_len) {
|
||||||
|
/*
|
||||||
|
** currently there is no way to tell apart an OOM condition in
|
||||||
|
** Curl_base64_decode() from zero length decoded data. For now,
|
||||||
|
** let's just assume it is an OOM condition, currently we have
|
||||||
|
** no input for this function that decodes to zero length data.
|
||||||
|
*/
|
||||||
|
if(buf64)
|
||||||
|
free(buf64);
|
||||||
|
|
||||||
|
return GPE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* memcpy to support binary blobs */
|
||||||
|
memcpy(*buf, buf64, src_len);
|
||||||
|
*len = src_len;
|
||||||
|
*(*buf + src_len) = '\0';
|
||||||
|
|
||||||
|
free(buf64);
|
||||||
|
|
||||||
return GPE_OK;
|
return GPE_OK;
|
||||||
}
|
}
|
||||||
@ -308,6 +324,13 @@ int getpart(char **outbuf, size_t *outlen,
|
|||||||
if(in_wanted_part) {
|
if(in_wanted_part) {
|
||||||
/* end of wanted part */
|
/* end of wanted part */
|
||||||
in_wanted_part = 0;
|
in_wanted_part = 0;
|
||||||
|
|
||||||
|
/* Do we need to base64 decode the data? */
|
||||||
|
if(base64) {
|
||||||
|
error = decodedata(outbuf, outlen);
|
||||||
|
if(error)
|
||||||
|
return error;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -318,6 +341,13 @@ int getpart(char **outbuf, size_t *outlen,
|
|||||||
if(in_wanted_part) {
|
if(in_wanted_part) {
|
||||||
/* end of wanted part */
|
/* end of wanted part */
|
||||||
in_wanted_part = 0;
|
in_wanted_part = 0;
|
||||||
|
|
||||||
|
/* Do we need to base64 decode the data? */
|
||||||
|
if(base64) {
|
||||||
|
error = decodedata(outbuf, outlen);
|
||||||
|
if(error)
|
||||||
|
return error;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user