From 98413e8d04b07ed772d0fc94e649e313a35de61e Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Mon, 27 Nov 2017 02:55:21 +0000 Subject: [PATCH] Fix decode of multi-line quoted-printable "plain text". If base64 decode fails, return the full (MIME) text. --- src/smblib/smbtxt.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/smblib/smbtxt.c b/src/smblib/smbtxt.c index e52bb39ba4..79964b4aba 100644 --- a/src/smblib/smbtxt.c +++ b/src/smblib/smbtxt.c @@ -216,7 +216,7 @@ char* qp_decode(char* buf) *dest++='\n'; break; } - if(*p==' ' || (*p>='!' && *p<='~' && *p!='=') || *p=='\t') + if(*p==' ' || (*p>='!' && *p<='~' && *p!='=') || *p=='\t'|| *p=='\r'|| *p=='\n') *dest++=*p; else if(*p=='=') { p++; @@ -390,8 +390,14 @@ char* SMBCALL smb_getplaintext(smbmsg_t* msg, char* buf) memmove(buf, txt, strlen(txt)+1); if(xfer_encoding == CONTENT_TRANFER_ENCODING_QUOTED_PRINTABLE) qp_decode(buf); - else if(xfer_encoding == CONTENT_TRANFER_ENCODING_BASE64) - b64_decode(buf, strlen(buf), buf, strlen(buf)); + else if(xfer_encoding == CONTENT_TRANFER_ENCODING_BASE64) { + char* decoded = strdup(buf); + if(decoded == NULL) + return buf; + if(b64_decode(decoded, strlen(decoded), buf, strlen(buf)) > 0) + strcpy(buf, decoded); + free(decoded); + } } return buf; @@ -418,7 +424,10 @@ uint8_t* SMBCALL smb_getattachment(smbmsg_t* msg, char* buf, char* filename, uin txt = mime_getcontent(buf, content_type, /* match-type: */NULL, 0, &xfer_encoding, /* attachment: */filename); if(txt != NULL && xfer_encoding == CONTENT_TRANFER_ENCODING_BASE64) { memmove(buf, txt, strlen(txt)+1); - *filelen = b64_decode(buf, strlen(buf), buf, strlen(buf)); + int result = b64_decode(buf, strlen(buf), buf, strlen(buf)); + if(result < 1) + return NULL; + *filelen = result; return buf; } -- GitLab