]> granicus.if.org Git - curl/commitdiff
Curl_base64_decode() now returns an allocated buffer
authorDaniel Stenberg <daniel@haxx.se>
Tue, 22 Feb 2005 12:10:30 +0000 (12:10 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 22 Feb 2005 12:10:30 +0000 (12:10 +0000)
lib/base64.c
lib/base64.h
lib/http_negotiate.c
lib/http_ntlm.c
lib/krb4.c
tests/server/getpart.c

index 7cb66c5c492d35cbb367645e16e7e112a435a7ce..54e4ed5d79f586646da8b85c12049cc18c3fe26a 100644 (file)
@@ -76,10 +76,10 @@ static void decodeQuantum(unsigned char *dest, const char *src)
 /*
  * Curl_base64_decode()
  *
- * Given a base64 string at src, decode it into the memory pointed to by
- * dest. Returns the length of the decoded data.
+ * Given a base64 string at src, decode it and return an allocated memory in
+ * the *outptr. Returns the length of the decoded data.
  */
-size_t Curl_base64_decode(const char *src, char *dest)
+size_t Curl_base64_decode(const char *src, unsigned char **outptr)
 {
   int length = 0;
   int equalsTerm = 0;
@@ -87,6 +87,9 @@ size_t Curl_base64_decode(const char *src, char *dest)
   int numQuantums;
   unsigned char lastQuantum[3];
   size_t rawlen=0;
+  unsigned char *newstr;
+
+  *outptr = NULL;
 
   while((src[length] != '=') && src[length])
     length++;
@@ -97,15 +100,22 @@ size_t Curl_base64_decode(const char *src, char *dest)
 
   rawlen = (numQuantums * 3) - equalsTerm;
 
+  newstr = malloc(rawlen+1);
+  if(!newstr)
+    return 0;
+
+  *outptr = newstr;
+
   for(i = 0; i < numQuantums - 1; i++) {
-    decodeQuantum((unsigned char *)dest, src);
-    dest += 3; src += 4;
+    decodeQuantum((unsigned char *)newstr, src);
+    newstr += 3; src += 4;
   }
 
   decodeQuantum(lastQuantum, src);
   for(i = 0; i < 3 - equalsTerm; i++)
-    dest[i] = lastQuantum[i];
+    newstr[i] = lastQuantum[i];
 
+  newstr[i] = 0; /* zero terminate */
   return rawlen;
 }
 
index 4f49f72d4e333f9845a89994db2bcc0e48e1cd21..af8a59dc1d47a9b3bd07a71bd3a5d8c7bf223105 100644 (file)
@@ -23,5 +23,5 @@
  * $Id$
  ***************************************************************************/
 size_t Curl_base64_encode(const char *input, size_t size, char **str);
-size_t Curl_base64_decode(const char *source, char *dest);
+size_t Curl_base64_decode(const char *source, unsigned char **outptr);
 #endif
index 43f1da44bf63a2e81701b95f0b4c292aef3e3102..68f76991338b7af7aa0d38d490ede87ef7ef1976 100644 (file)
@@ -166,12 +166,7 @@ int Curl_input_negotiate(struct connectdata *conn, char *header)
 
   len = strlen(header);
   if (len > 0) {
-    int rawlen;
-    input_token.length = (len+3)/4 * 3;
-    input_token.value = malloc(input_token.length);
-    if (input_token.value == NULL)
-      return ENOMEM;
-    rawlen = Curl_base64_decode(header, input_token.value);
+    int rawlen = Curl_base64_decode(header, &input_token.value);
     if (rawlen < 0)
       return -1;
     input_token.length = rawlen;
index 62f1e7ef2ecfcb5edf0c0bbfd0226e711afd1589..63a1126f9372a556d9468fa88dfcbaf17fbea2e2 100644 (file)
@@ -123,17 +123,17 @@ CURLntlm Curl_input_ntlm(struct connectdata *conn,
          32 (48) start of data block
       */
       size_t size;
-      unsigned char *buffer = (unsigned char *)malloc(strlen(header));
-      if (buffer == NULL)
+      unsigned char *buffer;
+      size = Curl_base64_decode(header, &buffer);
+      if(!buffer)
         return CURLNTLM_BAD;
 
-      size = Curl_base64_decode(header, (char *)buffer);
-
       ntlm->state = NTLMSTATE_TYPE2; /* we got a type-2 */
 
       if(size >= 48)
         /* the nonce of interest is index [24 .. 31], 8 bytes */
         memcpy(ntlm->nonce, &buffer[24], 8);
+      /* FIX: add an else here! */
 
       /* at index decimal 20, there's a 32bit NTLM flag field */
 
index 37da95df36ddff4c9ec908094aceae3c8674e3df..7b04828ab50d51714ff20e5644c158064c3f8fec 100644 (file)
@@ -199,6 +199,7 @@ krb4_auth(void *app_data, struct connectdata *conn)
 {
   int ret;
   char *p;
+  unsigned char *ptr;
   int len;
   KTEXT_ST adat;
   MSG_DAT msg_data;
@@ -275,11 +276,17 @@ krb4_auth(void *app_data, struct connectdata *conn)
     return AUTH_ERROR;
   }
   p += 5;
-  len = Curl_base64_decode(p, (char *)adat.dat);
-  if(len < 0) {
+  len = Curl_base64_decode(p, &ptr);
+  if(len > sizeof(adat.dat)-1) {
+    free(ptr);
+    len=0;
+  }
+  if(!len || !ptr) {
     Curl_failf(data, "Failed to decode base64 from server");
     return AUTH_ERROR;
   }
+  memcpy((char *)adat.dat, ptr, len);
+  free(ptr);
   adat.length = len;
   ret = krb_rd_safe(adat.dat, adat.length, &d->key,
                     (struct sockaddr_in *)hisctladdr,
@@ -321,6 +328,7 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
   ssize_t nread;
   int save;
   CURLcode result;
+  unsigned char *ptr;
 
   save = Curl_set_command_prot(conn, prot_private);
 
@@ -346,12 +354,18 @@ CURLcode Curl_krb_kauth(struct connectdata *conn)
   }
 
   p += 2;
-  tmp = Curl_base64_decode(p, (char *)tkt.dat);
-  if(tmp < 0) {
+  tmp = Curl_base64_decode(p, &ptr);
+  if(len > sizeof(tkt.dat)-1) {
+    free(ptr);
+    len=0;
+  }
+  if(!len || !ptr) {
     Curl_failf(conn->data, "Failed to decode base64 in reply.\n");
     Curl_set_command_prot(conn, save);
     return CURLE_FTP_WEIRD_SERVER_REPLY;
   }
+  memcpy((char *)tkt.dat, ptr, tmp);
+  free(ptr);
   tkt.length = tmp;
   tktcopy.length = tkt.length;
 
index 45576fafd8c9fcaab0d19821c723ae86fad807ea..fa0f9cf527ef0c1a18e33f3e4bdda1c44426e3c5 100644 (file)
@@ -61,11 +61,11 @@ char *appendstring(char *string, /* original string */
 {
   size_t len = strlen(buffer);
   size_t needed_len = len + *stringlen + 1;
-  char buf64[256]; /* big enough? */
+  unsigned char *buf64=NULL;
 
   if(base64) {
     /* decode the given buffer first */
-    len = Curl_base64_decode(buffer, buf64); /* updated len */
+    len = Curl_base64_decode(buffer, &buf64); /* updated len */
     buffer = buf64;
     needed_len = len + *stringlen + 1; /* recalculate */
   }
@@ -87,6 +87,9 @@ char *appendstring(char *string, /* original string */
   *stringlen += len;
   string[*stringlen]=0;
 
+  if(buf64)
+    free(buf64);
+
   return string;
 }