Commit 9a175526 authored by Steve Holme's avatar Steve Holme
Browse files

getpart: Fixed base64 encoded parts following commit e17c1b25

parent 3b59696a
Loading
Loading
Loading
Loading
+59 −29
Original line number Diff line number Diff line
@@ -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;
        }
      }