diff options
author | Nicolás Reynolds <fauno@endefensadelsl.org> | 2014-02-07 03:24:01 +0000 |
---|---|---|
committer | Nicolás Reynolds <fauno@endefensadelsl.org> | 2014-02-07 03:24:01 +0000 |
commit | b4f09e0a566f01cd9a250e2f44423169c70adc94 (patch) | |
tree | d407e83c47735fe0d24a6be03937a1d84f41c1cf /core/s-nail | |
parent | ae5e27e4900c0c38025462f59e0524aef7aa630b (diff) |
Fri Feb 7 03:21:50 UTC 2014
Diffstat (limited to 'core/s-nail')
-rw-r--r-- | core/s-nail/PKGBUILD | 9 | ||||
-rw-r--r-- | core/s-nail/mimeheader.patch | 147 |
2 files changed, 153 insertions, 3 deletions
diff --git a/core/s-nail/PKGBUILD b/core/s-nail/PKGBUILD index 21c91e6ca..4f8597e81 100644 --- a/core/s-nail/PKGBUILD +++ b/core/s-nail/PKGBUILD @@ -1,4 +1,4 @@ -# $Id: PKGBUILD 205003 2014-02-02 20:56:12Z bisson $ +# $Id: PKGBUILD 205499 2014-02-06 08:39:31Z bisson $ # Maintainer: Gaetan Bisson <bisson@archlinux.org> # Contributor: Stéphane Gaudreault <stephane@archlinux.org> # Contributor: Sergej Pupykin <pupykin.s@arch@gmail.com> @@ -6,7 +6,7 @@ pkgname=s-nail pkgver=14.5.2 -pkgrel=2 +pkgrel=3 pkgdesc='Mail processing system with a command syntax reminiscent of ed' url='http://sdaoden.users.sourceforge.net/code.html#s-nail' license=('custom:BSD') @@ -14,8 +14,10 @@ arch=('i686' 'x86_64') depends=('openssl') optdepends=('smtp-forwarder: for sending mail') source=("http://downloads.sourceforge.net/project/${pkgname}/${pkgname}-${pkgver//./_}.tar.xz" + 'mimeheader.patch' 'sort.patch') sha1sums=('26ad43f5f41b429d5f13a3ce73a3dff75325950c' + 'e72ed84f584ebc50eb9d04779b8b754afa446bf4' '909da731e590d1d2877ed38bed667440a02d1259') groups=('base') @@ -26,7 +28,8 @@ conflicts=('mailx' 'mailx-heirloom' 'heirloom-mailx') prepare() { cd "${srcdir}/${pkgname}-${pkgver}" - patch -p1 -i ../sort.patch # http://sourceforge.net/mailarchive/message.php?msg_id=31906477 + patch -p1 -i ../mimeheader.patch + patch -p1 -i ../sort.patch } build() { diff --git a/core/s-nail/mimeheader.patch b/core/s-nail/mimeheader.patch new file mode 100644 index 000000000..2f7163b36 --- /dev/null +++ b/core/s-nail/mimeheader.patch @@ -0,0 +1,147 @@ +s-nail-14_5_2-mimeheader.patch, 2014-02-05: + +Apply: + $ cd s-nail-14.5.2 + $ patch -bu < s-nail-14_5_2-mimeheader.patch + +Description: + mime_fromhdr(): fix my rewrite again.. + + My hasty rewrite [0f9ad93] (mime_fromhdr(): partial rewrite using + n_iconv_str(), 2013-03-12), just about ninety (90) minutes before + the release of S-nail v14.1 already caused the bugfix [b608c6b] + (mime_fromhdr(): never return NULL output.., 2013-03-14), which + was the sole reason for the release of S-nail v14.2. + + Well, about a year later, after tens of thousands of mails, + including multibyte ones, i wrote myself a message that has shown + that the rewrite was still buggy -- the header + + Subject: ehm, .getElementById("blink") needs <span + =?US-ASCII?Q?id=3D"blink">,?= not =?US-ASCII?Q?class=3D"id"?= + + cannot be viewed correctly, the ", not" will be lost. + The reason is now understood and this changeset should fix + mime_fromhdr() so that it'll do what it is assumed to do in the + current codebase, unless i'm terribly mistaken. + + Because i bickered some time in private, i WANT to add that the + real problem is that the codebase is weird INSOFAR as that i still + don't really understand the WAY it works, because THAT IS SICK. + I.e., in my brain i assume this function effectively is + rfc_2047_decode(), meant to decode encoded words as specified in + RFC 2047, but that's simply not true, and FOR QUITE SOME TIME, + because of the embedded newlines that may be in the data and need + to passed through for at least the case that we send data to the + display. I slowly get around that schizophrenic codebase while + also converting it to a straight one, but that will take years. + Until then we need to strip whitespace in between multiple + adjacent encoded words, while passing through newlines and + whitespace that follows newlines, regardless of whatever. + I hope this will do it until we are sane. +--- + mime.c | 63 +++++++++++++++++++++++++++++++++++++++------------------------ + 1 file changed, 39 insertions(+), 24 deletions(-) + +diff --git a/mime.c b/mime.c +index ccb0061..6ee55cc 100644 +--- a/mime.c ++++ b/mime.c +@@ -863,20 +863,26 @@ jclear: + goto jleave; + } + +-/* +- * Convert header fields from RFC 1522 format +- * TODO mime_fromhdr(): NO error handling, fat; REWRITE **ASAP** +- */ + FL void + mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags) + { +- /* TODO mime_fromhdr(): is called with strings that contain newlines; +- * TODO this is the usual newline problem all around the codebase; +- * TODO i.e., if we strip it, then the display misses it ;} */ ++ /* TODO mime_fromhdr(): is called with strings that contain newlines; ++ * TODO this is the usual newline problem all around the codebase; ++ * TODO i.e., if we strip it, then the display misses it ;> ++ * TODO this is why it is so messy and why S-nail v14.2 plus additional ++ * TODO patch for v14.5.2 (and maybe even v14.5.3 subminor) occurred, and ++ * TODO why our display reflects what is contained in the message: the 1:1 ++ * TODO relationship of message content and display! ++ * TODO instead a header line should be decoded to what it is (a single ++ * TODO line that is) and it should be objective to the backend wether ++ * TODO it'll be folded to fit onto the display or not, e.g., for search ++ * TODO purposes etc. then the only condition we have to honour in here ++ * TODO is that whitespace in between multiple adjacent MIME encoded words ++ * TODO á la RFC 2047 is discarded; i.e.: this function should deal with ++ * TODO RFC 2047 and be renamed: mime_fromhdr() -> mime_rfc2047_decode() */ + struct str cin, cout; + char *p, *op, *upper, *cs, *cbeg; +- int convert; +- size_t lastoutl = (size_t)-1; ++ ui32_t convert, lastenc, lastoutl; + #ifdef HAVE_ICONV + char const *tcs; + iconv_t fhicd = (iconv_t)-1; +@@ -894,6 +900,7 @@ mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags) + #endif + p = in->s; + upper = p + in->l; ++ lastenc = lastoutl = 0; + + while (p < upper) { + op = p; +@@ -949,8 +956,7 @@ mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags) + --cout.l; + } else + (void)qp_decode(&cout, &cin, NULL); +- if (lastoutl != (size_t)-1) +- out->l = lastoutl; ++ out->l = lastenc; + #ifdef HAVE_ICONV + if ((flags & TD_ICONV) && fhicd != (iconv_t)-1) { + cin.s = NULL, cin.l = 0; /* XXX string pool ! */ +@@ -966,21 +972,30 @@ mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags) + #ifdef HAVE_ICONV + } + #endif +- lastoutl = out->l; ++ lastenc = lastoutl = out->l; + free(cout.s); +- } else { +-jnotmime: +- p = op; +- convert = 1; +- while ((op = p + convert) < upper && +- (op[0] != '=' || op[1] != '?')) +- ++convert; +- out = n_str_add_buf(out, p, convert); +- p += convert; +- if (! blankchar(p[-1])) +- lastoutl = (size_t)-1; +- } ++ } else ++jnotmime: { ++ bool_t onlyws; ++ ++ p = op; ++ onlyws = (lastenc > 0); ++ for (;;) { ++ if (++op == upper) ++ break; ++ if (op[0] == '=' && (PTRCMP(op + 1, ==, upper) || op[1] == '?')) ++ break; ++ if (onlyws && !blankchar(*op)) ++ onlyws = FAL0; ++ } ++ ++ out = n_str_add_buf(out, p, PTR2SIZE(op - p)); ++ p = op; ++ if (!onlyws || lastoutl != lastenc) ++ lastenc = out->l; ++ lastoutl = out->l; + } ++ } + out->s[out->l] = '\0'; + + if (flags & TD_ISPR) { |