]> code.citadel.org Git - citadel.git/blobdiff - webcit/cookie_conversion.c
* Brought over yet another new version of the MIME parser from Citadel
[citadel.git] / webcit / cookie_conversion.c
index 22bdb58a0d9e799b4a5155eb3856878ddb8a0a63..d0bec8b521ef4a10bbc0f603276625536d3b02c2 100644 (file)
@@ -24,7 +24,7 @@
 #define FALSE 0
 
 typedef unsigned char byte;          /* Byte type */
-static byte dtable[256];             /* base64 encode / decode table */
+static byte dtable[SIZ];             /* base64 encode / decode table */
 
 /*
  * decode_base64() and encode_base64() are adaptations of code by
@@ -90,10 +90,13 @@ void encode_base64(char *dest, char *source)
 }
 
 
-
-void decode_base64(char *dest, char *source)
+/* 
+ * Convert base64-encoded to binary.  Returns the length of the decoded data.
+ * It will stop after reading 'length' bytes.
+ */
+int decode_base64(char *dest, char *source, size_t length)
 {
-    int i;
+    int i, c;
     int dpos = 0;
     int spos = 0;
 
@@ -118,13 +121,16 @@ void decode_base64(char *dest, char *source)
        byte a[4], b[4], o[3];
 
        for (i = 0; i < 4; i++) {
-           int c = source[spos++];
+           if (spos >= length) {
+               return(dpos);
+           }
+           c = source[spos++];
 
            if (c == 0) {
                if (i > 0) {
-                   return;
+                   return(dpos);
                }
-               return;
+               return(dpos);
            }
            if (dtable[c] & 0x80) {
                /* Ignoring errors: discard invalid character. */
@@ -143,21 +149,19 @@ void decode_base64(char *dest, char *source)
        if (i>=3) dest[dpos++] = o[2];
        dest[dpos] = 0;
        if (i < 3) {
-           return;
+           return(dpos);
        }
     }
 }
 
 
 
-
-
 /*
  * Pack all session info into one easy-to-digest cookie.  Healthy and delicious!
  */
 void stuff_to_cookie(char *cookie, int session, char *user, char *pass, char *room)
 {
-       char buf[256];
+       char buf[SIZ];
 
        sprintf(buf, "%d|%s|%s|%s", session, user, pass, room);
        encode_base64(cookie, buf);
@@ -169,9 +173,9 @@ void stuff_to_cookie(char *cookie, int session, char *user, char *pass, char *ro
  */
 void cookie_to_stuff(char *cookie, int *session, char *user, char *pass, char *room)
 {
-       char buf[256];
+       char buf[SIZ];
 
-       decode_base64(buf, cookie);
+       decode_base64(buf, cookie, strlen(cookie));
 
        if (session != NULL)
                *session = extract_int(buf, 0);