mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -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 */
|
||||
int src_b64) /* != 0 if source is base64 encoded */
|
||||
{
|
||||
size_t need_alloc, src_len;
|
||||
union {
|
||||
unsigned char *as_uchar;
|
||||
char *as_char;
|
||||
} buf64;
|
||||
size_t need_alloc = 0;
|
||||
size_t src_len = strlen(src_buf);
|
||||
|
||||
src_len = strlen(src_buf);
|
||||
if(!src_len)
|
||||
return GPE_OK;
|
||||
|
||||
buf64.as_char = NULL;
|
||||
need_alloc = src_len + *dst_len + 1;
|
||||
|
||||
if(src_b64) {
|
||||
/* base64 decode the given buffer */
|
||||
int error = (int) Curl_base64_decode(src_buf, &buf64.as_uchar, &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;
|
||||
}
|
||||
}
|
||||
if(src_buf[src_len - 1] == '\r')
|
||||
src_len--;
|
||||
|
||||
need_alloc = src_len + *dst_len + 1;
|
||||
if(src_buf[src_len - 1] == '\n')
|
||||
src_len--;
|
||||
}
|
||||
|
||||
/* enlarge destination buffer if required */
|
||||
if(need_alloc > *dst_alloc) {
|
||||
size_t newsize = need_alloc * 2;
|
||||
char *newptr = realloc(*dst_buf, newsize);
|
||||
if(!newptr) {
|
||||
if(buf64.as_char)
|
||||
free(buf64.as_char);
|
||||
return GPE_OUT_OF_MEMORY;
|
||||
}
|
||||
*dst_alloc = newsize;
|
||||
@ -203,8 +184,43 @@ static int appenddata(char **dst_buf, /* dest buffer */
|
||||
*dst_len += src_len;
|
||||
*(*dst_buf + *dst_len) = '\0';
|
||||
|
||||
if(buf64.as_char)
|
||||
free(buf64.as_char);
|
||||
return GPE_OK;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
@ -308,6 +324,13 @@ int getpart(char **outbuf, size_t *outlen,
|
||||
if(in_wanted_part) {
|
||||
/* end of wanted part */
|
||||
in_wanted_part = 0;
|
||||
|
||||
/* Do we need to base64 decode the data? */
|
||||
if(base64) {
|
||||
error = decodedata(outbuf, outlen);
|
||||
if(error)
|
||||
return error;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -318,6 +341,13 @@ int getpart(char **outbuf, size_t *outlen,
|
||||
if(in_wanted_part) {
|
||||
/* end of wanted part */
|
||||
in_wanted_part = 0;
|
||||
|
||||
/* Do we need to base64 decode the data? */
|
||||
if(base64) {
|
||||
error = decodedata(outbuf, outlen);
|
||||
if(error)
|
||||
return error;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user