]> code.citadel.org Git - citadel.git/blobdiff - citadel/msgbase.c
* qp_encode_email_addrs(): don't use static buffers for recipient parts; alloc...
[citadel.git] / citadel / msgbase.c
index 98510111a8ff51f0d365914409b94594c236ad8a..1657661bf4e642d80d2ed6f976129326a8b0b63c 100644 (file)
@@ -1170,7 +1170,8 @@ struct CtdlMessage *CtdlFetchMessage(long msgnum, int with_body)
        if ( (ret->cm_fields['M'] == NULL) && (with_body) ) {
                dmsgtext = cdb_fetch(CDB_BIGMSGS, &msgnum, sizeof(long));
                if (dmsgtext != NULL) {
-                       ret->cm_fields['M'] = strdup(dmsgtext->ptr);
+                       ret->cm_fields['M'] = dmsgtext->ptr;
+                       dmsgtext->ptr = NULL;
                        cdb_free(dmsgtext);
                }
        }
@@ -1572,7 +1573,7 @@ int CtdlOutputMsg(long msg_num,           /* message number (local) to fetch */
 
 char *qp_encode_email_addrs(char *source)
 {
-       char user[256], node[256], name[256];
+       char *user, *node, *name;
        const char headerStr[] = "=?UTF-8?Q?";
        char *Encoded;
        char *EncodedName;
@@ -1637,6 +1638,10 @@ char *qp_encode_email_addrs(char *source)
 
        for (i = 0; i < nColons; i++)
                source[AddrPtr[i]++] = '\0';
+       /* TODO: if libidn, this might get larger*/
+       user = malloc(SourceLen + 1);
+       node = malloc(SourceLen + 1);
+       name = malloc(SourceLen + 1);
 
        nPtr = Encoded;
        *nPtr = '\0';
@@ -1680,6 +1685,10 @@ char *qp_encode_email_addrs(char *source)
        }
        for (i = 0; i < nColons; i++)
                source[--AddrPtr[i]] = ',';
+
+       free(user);
+       free(node);
+       free(name);
        free(AddrUtf8);
        free(AddrPtr);
        return Encoded;
@@ -1722,7 +1731,7 @@ int CtdlOutputPreLoadedMsg(
                int crlf,               /* Use CRLF newlines instead of LF? */
                int flags               /* should the bessage be exported clean? */
 ) {
-       int i, j, k;
+       int i, j, k, n;
        char buf[SIZ];
        cit_uint8_t ch, prev_ch;
        char allkeys[30];
@@ -1874,8 +1883,8 @@ int CtdlOutputPreLoadedMsg(
                }
 
                /* Now spew the header fields in the order we like them. */
-               safestrncpy(allkeys, FORDER, sizeof allkeys);
-               for (i=0; i<strlen(allkeys); ++i) {
+               n = safestrncpy(allkeys, FORDER, sizeof allkeys);
+               for (i=0; i<n; ++i) {
                        k = (int) allkeys[i];
                        if (k != 'M') {
                                if ( (TheMessage->cm_fields[k] != NULL)
@@ -2049,11 +2058,12 @@ START_TEXT:
                }
                else if (mode == MT_RFC822) {   /* unparsed RFC822 dump */
                        int eoh = 0;
+                       const char *StartOfText = StrBufNOTNULL;
 
                        char outbuf[1024];
                        int outlen = 0;
                        int nllen = strlen(nl);
-                       prev_ch = 0;
+                       prev_ch = '\0';
                        while (*mptr != '\0') {
                                if (*mptr == '\r') {
                                        /* do nothing */
@@ -2065,12 +2075,17 @@ START_TEXT:
                                                eoh = (*(mptr+1) == '\r') && (*(mptr+2) == '\n');
                                                if (!eoh)
                                                        eoh = *(mptr+1) == '\n';
+                                               if (eoh)
+                                               {
+                                                       StartOfText = mptr;
+                                                       StartOfText = strchr(StartOfText, '\n');
+                                                       StartOfText = strchr(StartOfText, '\n');
+                                               }
                                        }
-
-                                       if (
-                                               ((headers_only == HEADERS_NONE) && (eoh))
-                                          ||   ((headers_only == HEADERS_ONLY) && (!eoh))
-                                          ||   ((headers_only != HEADERS_NONE) && (headers_only != HEADERS_ONLY))
+                                       if (((headers_only == HEADERS_NONE) && (mptr >= StartOfText)) ||
+                                           ((headers_only == HEADERS_ONLY) && (mptr < StartOfText)) ||
+                                           ((headers_only != HEADERS_NONE) && 
+                                            (headers_only != HEADERS_ONLY))
                                        ) {
                                                if (*mptr == '\n') {
                                                        memcpy(&outbuf[outlen], nl, nllen);
@@ -2084,12 +2099,14 @@ START_TEXT:
                                }
                                if (flags & ESC_DOT)
                                {
-                                       if ((prev_ch == '\n') && (*mptr == '.') && ((*(mptr+1) == '\r') || (*(mptr+1) == '\n')))
+                                       if ((prev_ch == '\n') && 
+                                           (*mptr == '.') && 
+                                           ((*(mptr+1) == '\r') || (*(mptr+1) == '\n')))
                                        {
                                                outbuf[outlen++] = '.';
                                        }
+                                       prev_ch = *mptr;
                                }
-                               prev_ch = *mptr;
                                ++mptr;
                                if (outlen > 1000) {
                                        client_write(outbuf, outlen);
@@ -2220,7 +2237,6 @@ DONE:     /* now we're done */
 }
 
 
-
 /*
  * display a message (mode 0 - Citadel proprietary)
  */
@@ -2761,7 +2777,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,       /* message to save */
        char *hold_R, *hold_D;
        char *collected_addresses = NULL;
        struct addresses_to_be_filed *aptr = NULL;
-       char *saved_rfc822_version = NULL;
+       StrBuf *saved_rfc822_version = NULL;
        int qualified_for_journaling = 0;
        CitContext *CCC = CC;           /* CachedCitContext - performance boost */
        char bounce_to[1024] = "";
@@ -2912,15 +2928,11 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,     /* message to save */
                CtdlLogPrintf(CTDL_ALERT, "CCC->redirect_buffer is not NULL during message submission!\n");
                abort();
        }
-       CCC->redirect_buffer = malloc(SIZ);
-       CCC->redirect_len = 0;
-       CCC->redirect_alloc = SIZ;
+       CCC->redirect_buffer = NewStrBufPlain(NULL, SIZ);
        CtdlOutputPreLoadedMsg(msg, MT_RFC822, HEADERS_ALL, 0, 1, QP_EADDR);
-       smi.meta_rfc822_length = CCC->redirect_len;
+       smi.meta_rfc822_length = StrLength(CCC->redirect_buffer);
        saved_rfc822_version = CCC->redirect_buffer;
        CCC->redirect_buffer = NULL;
-       CCC->redirect_len = 0;
-       CCC->redirect_alloc = 0;
 
        PutMetaData(&smi);
 
@@ -3157,7 +3169,7 @@ long CtdlSubmitMsg(struct CtdlMessage *msg,       /* message to save */
                        JournalBackgroundSubmit(msg, saved_rfc822_version, recps);
                }
                else {
-                       free(saved_rfc822_version);
+                       FreeStrBuf(&saved_rfc822_version);
                }
        }