From 0c68700b9eab611daa7c051014e1f312898ec552 Mon Sep 17 00:00:00 2001 From: Rob Swindell <rob@synchro.net> Date: Thu, 10 Dec 2020 01:29:59 -0800 Subject: [PATCH] Include comment headers in smb_getmsgtxt() returned buffer even when GETMSGTXT_PLAIN mode flag is used and the message contains a MIME-encoded plain-text portion. Obviously the GETMSGTXT_NO_HFIELDS exception still applies. The fixed problem was when forwarding a MIME-encoded email, the forwarding information (and user comment, if supplied) could be suppressed/lost. --- src/smblib/smbtxt.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/smblib/smbtxt.c b/src/smblib/smbtxt.c index 60794b9197..4b65c9c429 100644 --- a/src/smblib/smbtxt.c +++ b/src/smblib/smbtxt.c @@ -45,6 +45,7 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) { char* buf; + char* preamble; char* lzhbuf; char* p; char* str; @@ -107,6 +108,7 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) buf[l] = 0; } } + preamble = strdup(buf); for(i=0;i<(uint)msg->hdr.total_dfields;i++) { if(msg->dfield[i].length<=sizeof(xlat)) @@ -146,6 +148,7 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) ,"%s malloc failure of %ld bytes for LZH buffer" , __FUNCTION__, length); free(buf); + free(preamble); return(NULL); } if(smb_fread(smb,lzhbuf,length,smb->sdt_fp) != length) { @@ -154,6 +157,7 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) , __FUNCTION__, length); free(lzhbuf); free(buf); + free(preamble); return(NULL); } lzhlen=*(int32_t*)lzhbuf; @@ -163,6 +167,7 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) , __FUNCTION__, l+lzhlen+3L); free(lzhbuf); free(buf); + free(preamble); return(NULL); } buf=p; @@ -176,6 +181,7 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) ,"%s realloc failure of %ld bytes for text buffer" , __FUNCTION__, l+length+3L); free(buf); + free(preamble); return(NULL); } buf=p; @@ -196,9 +202,18 @@ char* SMBCALL smb_getmsgtxt(smb_t* smb, smbmsg_t* msg, ulong mode) if(mode&GETMSGTXT_PLAIN) { char* plaintext = smb_getplaintext(msg, buf); - if(plaintext != NULL) - return plaintext; + if(plaintext != NULL) { + buf = malloc(strlen(preamble) + strlen(plaintext) + 1); + if(buf == NULL) + buf = plaintext; + else { + strcpy(buf, preamble); + strcat(buf, plaintext); + free(plaintext); + } + } } + free(preamble); return(buf); } -- GitLab