From: Ken Hornstein Date: Thu, 27 Feb 2014 03:58:26 +0000 (-0500) Subject: Re-do length calculation for parameter output, and adapt test for new code. X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/1d334fe1eb8b461a8e2adeac44f49a1d23429b2d?ds=inline;hp=e6a9609ee92dd8d01ae2524ea193bbcd88b5be73 Re-do length calculation for parameter output, and adapt test for new code. --- diff --git a/test/mhbuild/test-ext-params b/test/mhbuild/test-ext-params index e81ef47a..5e4a681b 100755 --- a/test/mhbuild/test-ext-params +++ b/test/mhbuild/test-ext-params @@ -89,8 +89,8 @@ This is a test message ------- =_aaaaaaaaaa0 Content-Type: image/jpeg Content-Disposition: attachment; - filename*0="This is an example of a rather long filename that is lon"; - filename*1="ger than would fit on a normal line.jpg" + filename*0="This is an example of a rather long filename that is lo"; + filename*1="nger than would fit on a normal line.jpg" Content-Transfer-Encoding: base64 /9g= @@ -131,8 +131,9 @@ This is a test message ------- =_aaaaaaaaaa0 Content-Type: image/jpeg Content-Disposition: attachment; - filename*0="This is an example of a rather long filename that is lon"; - filename*1="ger than would fit on a normal line.jpg" + filename*0*=UTF-8''This%20is%20an%20%C3%ABxample%20of%20a%20rather; + filename*1=" long filename that is longer than would fit on a norma"; + filename*2="l line.jpg" Content-Transfer-Encoding: base64 /9g= diff --git a/uip/mhparse.c b/uip/mhparse.c index 50510856..5bbaf449 100644 --- a/uip/mhparse.c +++ b/uip/mhparse.c @@ -3618,17 +3618,17 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont, * section. * - There are 8-bit characters within N bytes of our section start. * N is calculated based on the number of bytes it would take to - * reach CPERLIN - 1. Specifically: + * reach CPERLIN. Specifically: * 8 (starting tab) + * strlen(param name) + * 4 ('* for section marker, '=', opening/closing '"') * strlen (index) * is the number of bytes used by everything that isn't part of the - * value. So that gets subtracted from CPERLIN - 1. + * value. So that gets subtracted from CPERLIN. */ snprintf(indexchar, sizeof(indexchar), "%d", index); - maxfit = CPERLIN - (13 + len + strlen(indexchar)); + maxfit = CPERLIN - (12 + len + strlen(indexchar)); if ((eightbit && index == 0) || contains8bit(start, start + maxfit)) { *encode = 1; } @@ -3655,11 +3655,15 @@ param_len(PM pm, int index, size_t valueoff, int *encode, int *cont, pm->pm_lang = getcpy(NULL); /* Default to a blank lang tag */ len++; /* For the encoding marker */ + maxfit--; if (index == 0) { - len += strlen(pm->pm_charset) + strlen(pm->pm_lang) + 2; + int enclen = strlen(pm->pm_charset) + strlen(pm->pm_lang) + 2; + len += enclen; + maxfit-= enclen; } else { /* - * We know we definitely need to include an index. + * We know we definitely need to include an index. maxfit already + * includes the section marker. */ len += strlen(indexchar); }