* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* KIND, either express or implied.
*
***************************************************************************/
-
-#define CURL_NO_OLDIES
-
-#include "setup.h"
+#include "server_setup.h"
#include "getpart.h"
versions instead */
#include "curlx.h" /* from the private lib dir */
-/* just to please base64.h we create a fake struct */
+/* just to please curl_base64.h we create a fake struct */
struct SessionHandle {
int fake;
};
#ifdef DEBUG_GETPART
#define show(x) printf x
#else
-#define show(x)
+#define show(x) Curl_nop_stmt
#endif
#if defined(_MSC_VER) && defined(_DLL)
curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc;
curl_strdup_callback Curl_cstrdup = (curl_strdup_callback)strdup;
curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc;
+#if defined(WIN32) && defined(UNICODE)
+curl_wcsdup_callback Curl_cwcsdup = (curl_wcsdup_callback)_wcsdup;
+#endif
#if defined(_MSC_VER) && defined(_DLL)
# pragma warning(default:4232) /* MSVC extension, dllimport identity */
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 */
- src_len = Curl_base64_decode(src_buf, &buf64.as_uchar);
- 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;
*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;
+ unsigned char *buf64 = NULL;
+ size_t src_len = 0;
+
+ if(!*len)
+ return GPE_OK;
+
+ /* base64 decode the given buffer */
+ error = (int) Curl_base64_decode(*buf, &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;
}
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;
}
}
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;
}
}