Package: alpine
Version: 2.10+dfsg-1.1
Severity: normal
Tags: patch
Hi,
attached debdiff contains:
• a new patch adding MIME compliant (RFC2781 §4.3) handling of
UTF-16, UCS-2 and UCS-4 encoded messages (check for LE BOM,
use BE if none found), adds {UTF-16,UCS-{2,4}}{L,B}E charsets
that explicitly specify endianness, and disables using the
unspecified ones as display charset (because Unix uses other
rules to determine/guess endianness: if unspecified, just use
the host’s, which doesn’t match the MIME one)
• a new patch disabling charset conversion when displaying a
raw message (‘H’ command with enable-full-header-and-text
set in pinerc) and the body is base64 transfer-encoded, as
the charset then obviously occurs *after* decoding
‣ should probably do the same for quoted-printable, as it’s
also no valid c-t-e for a container type
• a change to debian/rules to make it conform to Policy by
allowing alpine to be built twice in a row (removing some
more generated files and reverting a rename); I think this
issue alone could warrant a higher severity tbh…
Please apply *and* forward upstream.
This patch is sponsored by tarent solutions GmbH
and triggered by Natureshadow’s discovery of similar
issues in an unnamed concurrent product.
-- System Information:
Debian Release: jessie/sid
APT prefers unstable
APT policy: (500, 'unstable'), (500, 'stable'), (100, 'experimental')
Architecture: i386 (i686)
Kernel: Linux 3.10-3-amd64 (SMP w/4 CPU cores)
Locale: LANG=C, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/lksh
Versions of packages alpine depends on:
ii libc6 2.17-93
ii libgssapi-krb5-2 1.11.3+dfsg-3
ii libkrb5-3 1.11.3+dfsg-3
ii libldap-2.4-2 2.4.31-1+nmu2+b1
ii libpam0g 1.1.3-9
ii libssl1.0.0 1.0.1e-3
ii libtinfo5 5.9+20130608-1
ii mlock 8:2007f~dfsg-2
Versions of packages alpine recommends:
pn alpine-doc <none>
Versions of packages alpine suggests:
ii aspell 0.60.7~20110707-1
ii postfix [mail-transport-agent] 2.10.2-1
-- no debconf information
diff -Nru alpine-2.10+dfsg/debian/changelog alpine-2.10+dfsg/debian/changelog
--- alpine-2.10+dfsg/debian/changelog 2013-05-21 09:16:34.000000000 +0200
+++ alpine-2.10+dfsg/debian/changelog 2013-10-18 17:09:34.000000000 +0200
@@ -1,3 +1,12 @@
+alpine (2.10+dfsg-1.1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Fix endian detection for UCS-2, UCS-4, UTF-16 encodings
+ * Unbreak building twice by deleting more generated files
+ * Fix display of base64 encoded raw messages
+
+ -- Thorsten Glaser <[email protected]> Fri, 18 Oct 2013 17:09:33 +0200
+
alpine (2.10+dfsg-1) unstable; urgency=low
* New upstream release.
diff -Nru alpine-2.10+dfsg/debian/patches/90_fix_utf16.patch alpine-2.10+dfsg/debian/patches/90_fix_utf16.patch
--- alpine-2.10+dfsg/debian/patches/90_fix_utf16.patch 1970-01-01 01:00:00.000000000 +0100
+++ alpine-2.10+dfsg/debian/patches/90_fix_utf16.patch 2013-10-18 16:48:46.000000000 +0200
@@ -0,0 +1,336 @@
+# DP: Fix handling of UTF-16, UCS-2, UCS-4 encoded eMails
+
+--- a/imap/src/c-client/utf8.c
++++ b/imap/src/c-client/utf8.c
+@@ -333,11 +333,23 @@ static const CHARSET utf8_csvalid[] = {
+ {"UNICODE-1-1-UTF-7",CT_UTF7,CF_UNSUPRT,
+ NIL,SC_UNICODE,"UTF-8"},
+ /* these should never appear in email */
+- {"UCS-2",CT_UCS2,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ {"UCS-2",CT_UCS2,CF_PRIMARY | CF_NOEMAIL,
+ NIL,SC_UNICODE,"UTF-8"},
+- {"UCS-4",CT_UCS4,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ {"UCS-2BE",CT_UCS2BE,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
+ NIL,SC_UNICODE,"UTF-8"},
+- {"UTF-16",CT_UTF16,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ {"UCS-2LE",CT_UCS2LE,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ NIL,SC_UNICODE,"UTF-8"},
++ {"UCS-4",CT_UCS4,CF_PRIMARY | CF_NOEMAIL,
++ NIL,SC_UNICODE,"UTF-8"},
++ {"UCS-4BE",CT_UCS4BE,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ NIL,SC_UNICODE,"UTF-8"},
++ {"UCS-4LE",CT_UCS4LE,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ NIL,SC_UNICODE,"UTF-8"},
++ {"UTF-16",CT_UTF16,CF_PRIMARY | CF_NOEMAIL,
++ NIL,SC_UNICODE,"UTF-8"},
++ {"UTF-16BE",CT_UTF16BE,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
++ NIL,SC_UNICODE,"UTF-8"},
++ {"UTF-16LE",CT_UTF16LE,CF_PRIMARY | CF_DISPLAY | CF_NOEMAIL,
+ NIL,SC_UNICODE,"UTF-8"},
+ NIL
+ };
+@@ -536,13 +548,34 @@ long utf8_text_cs (SIZEDTEXT *text,const
+ utf8_text_utf7 (text,ret,cv,de);
+ break;
+ case CT_UCS2: /* 2 byte 16-bit Unicode no table */
+- utf8_text_ucs2 (text,ret,cv,de);
++ if (text->data[0] == 0xFF && text->data[1] == 0xFE) {
++ case CT_UCS2LE:
++ utf8_text_ucs2le (text,ret,cv,de);
++ break;
++ }
++ /* FALLTHROUGH */
++ case CT_UCS2BE:
++ utf8_text_ucs2be (text,ret,cv,de);
+ break;
+ case CT_UCS4: /* 4 byte 32-bit Unicode no table */
+- utf8_text_ucs4 (text,ret,cv,de);
++ if (text->data[0] == 0xFF && text->data[1] == 0xFE && !text->data[2] && !text->data[3]) {
++ case CT_UCS4LE:
++ utf8_text_ucs4le (text,ret,cv,de);
++ break;
++ }
++ /* FALLTHROUGH */
++ case CT_UCS4BE:
++ utf8_text_ucs4be (text,ret,cv,de);
+ break;
+ case CT_UTF16: /* variable UTF-16 encoded Unicode no table */
+- utf8_text_utf16 (text,ret,cv,de);
++ if (text->data[0] == 0xFF && text->data[1] == 0xFE) {
++ case CT_UTF16LE:
++ utf8_text_utf16le (text,ret,cv,de);
++ break;
++ }
++ /* FALLTHROUGH */
++ case CT_UTF16BE:
++ utf8_text_utf16be (text,ret,cv,de);
+ break;
+ case CT_2022: /* variable ISO-2022 encoded no table*/
+ utf8_text_2022 (text,ret,cv,de);
+@@ -1191,12 +1224,22 @@ unsigned long ucs4_cs_get (CHARSET *cs,u
+ break;
+
+ case CT_UCS2: /* 2 byte 16-bit Unicode no table */
++ /* no endianness specified, user is an idiot but we cannot return error here */
++ case CT_UCS2BE:
+ ret = c << 8;
+ if (j--) c = *t++; /* get second octet */
+ else return U8G_ENDSTRI; /* empty string */
+ ret |= c;
+ break;
++ case CT_UCS2LE:
++ ret = c;
++ if (j--) c = *t++; /* get second octet */
++ else return U8G_ENDSTRI; /* empty string */
++ ret |= c << 8;
++ break;
+ case CT_UCS4: /* 4 byte 32-bit Unicode no table */
++ /* no endianness specified, user is an idiot but we cannot return error here */
++ case CT_UCS4BE:
+ if (c & 0x80) return U8G_NOTUTF8;
+ if (j < 3) return U8G_ENDSTRI;
+ j -= 3; /* count three octets */
+@@ -1205,7 +1248,18 @@ unsigned long ucs4_cs_get (CHARSET *cs,u
+ ret |= (*t++) << 8;
+ ret |= (*t++);
+ break;
++ case CT_UCS4LE:
++ if (c & 0x80) return U8G_NOTUTF8;
++ if (j < 3) return U8G_ENDSTRI;
++ j -= 3; /* count three octets */
++ ret = c;
++ ret |= (*t++) << 8;
++ ret |= (*t++) << 16;
++ ret |= (*t++) << 24;
++ break;
+ case CT_UTF16: /* variable UTF-16 encoded Unicode no table */
++ /* no endianness specified, user is an idiot but we cannot return error here */
++ case CT_UTF16BE:
+ ret = c << 8;
+ if (j--) c = *t++; /* get second octet */
+ else return U8G_ENDSTRI; /* empty string */
+@@ -1222,6 +1276,23 @@ unsigned long ucs4_cs_get (CHARSET *cs,u
+ (d & UTF16_MASK);
+ }
+ break;
++ case CT_UTF16LE:
++ ret = c;
++ if (j--) c = *t++; /* get second octet */
++ else return U8G_ENDSTRI; /* empty string */
++ ret |= c << 8;
++ /* surrogate? */
++ if ((ret >= UTF16_SURR) && (ret <= UTF16_MAXSURR)) {
++ /* invalid first surrogate */
++ if ((ret > UTF16_SURRHEND) || (j < 2)) return U8G_NOTUTF8;
++ j -= 2; /* count two octets */
++ d = *t++; /* first octet of second surrogate */
++ d |= (*t++) << 8; /* second octet of second surrogate */
++ if ((d < UTF16_SURRL) || (d > UTF16_SURRLEND)) return U8G_NOTUTF8;
++ ret = UTF16_BASE + ((ret & UTF16_MASK) << UTF16_SHIFT) +
++ (d & UTF16_MASK);
++ }
++ break;
+ default: /* unknown/unsupported character set type */
+ return U8G_NOTUTF8;
+ }
+@@ -1408,6 +1479,13 @@ const CHARSET *utf8_infercharset (SIZEDT
+ return NIL; /* definitely invalid */
+ }
+ }
++
++ else if (src->data[2] == 0xFE && src->data[3] == 0xFF && !src->data[0] && !src->data[1])
++ return utf8_charset ("UCS-4BE");
++ else if (src->data[0] == 0xFE && src->data[1] == 0xFF)
++ return utf8_charset ("UTF-16BE");
++ else if (src->data[0] == 0xFF && src->data[1] == 0xFE)
++ return (!src->data[2] && !src->data[3]) ? utf8_charset ("UCS-4LE") : utf8_charset ("UTF-16LE");
+ /* if possible UTF-8 and not ISO-2022-JP */
+ else if (!iso2022jp && (eightbit >= 0) && (src->data[i] & BIT8) &&
+ (eightbit = utf8_validate (src->data + i,src->size - i)) > 0)
+@@ -2109,7 +2187,7 @@ void utf8_text_utf8 (SIZEDTEXT *text,SIZ
+ * canonicalization function
+ */
+
+-void utf8_text_ucs2 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
++void utf8_text_ucs2be (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
+ {
+ unsigned long i;
+ unsigned char *s,*t;
+@@ -2128,6 +2206,25 @@ void utf8_text_ucs2 (SIZEDTEXT *text,SIZ
+ if (((unsigned long) (s - ret->data)) != ret->size)
+ fatal ("UCS-2 to UTF-8 botch");
+ }
++void utf8_text_ucs2le (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
++{
++ unsigned long i;
++ unsigned char *s,*t;
++ unsigned int c;
++ for (ret->size = 0, t = text->data, i = text->size / 2; i; --i) {
++ c = *t++;
++ c |= *t++ << 8;
++ UTF8_COUNT_BMP (ret->size,c,cv,de);
++ }
++ (s = ret->data = (unsigned char *) fs_get (ret->size + 1))[ret->size] = NIL;
++ for (t = text->data, i = text->size / 2; i; --i) {
++ c = *t++;
++ c |= *t++ << 8;
++ UTF8_WRITE_BMP (s,c,cv,de) /* convert UCS-2 to UTF-8 */
++ }
++ if (((unsigned long) (s - ret->data)) != ret->size)
++ fatal ("UCS-2 to UTF-8 botch");
++}
+
+
+ /* Convert UCS-4 sized text to UTF-8
+@@ -2136,7 +2233,7 @@ void utf8_text_ucs2 (SIZEDTEXT *text,SIZ
+ * canonicalization function
+ */
+
+-void utf8_text_ucs4 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
++void utf8_text_ucs4be (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
+ {
+ unsigned long i;
+ unsigned char *s,*t;
+@@ -2153,6 +2250,23 @@ void utf8_text_ucs4 (SIZEDTEXT *text,SIZ
+ if (((unsigned long) (s - ret->data)) != ret->size)
+ fatal ("UCS-4 to UTF-8 botch");
+ }
++void utf8_text_ucs4le (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
++{
++ unsigned long i;
++ unsigned char *s,*t;
++ unsigned long c;
++ for (ret->size = 0, t = text->data, i = text->size / 4; i; --i) {
++ c = *t++; c |= *t++ << 8; c |= *t++ << 16; c |= *t++ << 24;
++ UTF8_COUNT (ret->size,c,cv,de);
++ }
++ (s = ret->data = (unsigned char *) fs_get (ret->size + 1))[ret->size] = NIL;
++ for (t = text->data, i = text->size / 2; i; --i) {
++ c = *t++; c |= *t++ << 8; c |= *t++ << 16; c |= *t++ << 24;
++ UTF8_WRITE (s,c,cv,de) /* convert UCS-4 to UTF-8 */
++ }
++ if (((unsigned long) (s - ret->data)) != ret->size)
++ fatal ("UCS-4 to UTF-8 botch");
++}
+
+ /* Convert UTF-16 sized text to UTF-8
+ * Accepts: source sized text
+@@ -2160,7 +2274,7 @@ void utf8_text_ucs4 (SIZEDTEXT *text,SIZ
+ * canonicalization function
+ */
+
+-void utf8_text_utf16 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
++void utf8_text_utf16be (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
+ {
+ unsigned long i;
+ unsigned char *s,*t;
+@@ -2198,6 +2312,53 @@ void utf8_text_utf16 (SIZEDTEXT *text,SI
+ --i; /* swallowed another 16-bits */
+ /* invalid second surrogate */
+ if ((d < UTF16_SURRL) || (d > UTF16_SURRLEND)) c = UBOGON;
++ else c = UTF16_BASE + ((c & UTF16_MASK) << UTF16_SHIFT) +
++ (d & UTF16_MASK);
++ }
++ }
++ UTF8_WRITE (s,c,cv,de) /* convert UCS-4 to UTF-8 */
++ }
++ if (((unsigned long) (s - ret->data)) != ret->size)
++ fatal ("UTF-16 to UTF-8 botch");
++}
++void utf8_text_utf16le (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de)
++{
++ unsigned long i;
++ unsigned char *s,*t;
++ unsigned long c,d;
++ for (ret->size = 0, t = text->data, i = text->size / 2; i; --i) {
++ c = *t++;
++ c |= *t++ << 8;
++ /* possible surrogate? */
++ if ((c >= UTF16_SURR) && (c <= UTF16_MAXSURR)) {
++ /* invalid first surrogate */
++ if ((c > UTF16_SURRHEND) || !i) c = UBOGON;
++ else { /* get second surrogate */
++ d = *t++;
++ d |= *t++ << 8;
++ --i; /* swallowed another 16-bits */
++ /* invalid second surrogate */
++ if ((d < UTF16_SURRL) || (d > UTF16_SURRLEND)) c = UBOGON;
++ else c = UTF16_BASE + ((c & UTF16_MASK) << UTF16_SHIFT) +
++ (d & UTF16_MASK);
++ }
++ }
++ UTF8_COUNT (ret->size,c,cv,de);
++ }
++ (s = ret->data = (unsigned char *) fs_get (ret->size + 1))[ret->size] = NIL;
++ for (t = text->data, i = text->size / 2; i; --i) {
++ c = *t++;
++ c |= *t++ << 8;
++ /* possible surrogate? */
++ if ((c >= UTF16_SURR) && (c <= UTF16_MAXSURR)) {
++ /* invalid first surrogate */
++ if ((c > UTF16_SURRHEND) || !i) c = UBOGON;
++ else { /* get second surrogate */
++ d = *t++;
++ d |= *t++ << 8;
++ --i; /* swallowed another 16-bits */
++ /* invalid second surrogate */
++ if ((d < UTF16_SURRL) || (d > UTF16_SURRLEND)) c = UBOGON;
+ else c = UTF16_BASE + ((c & UTF16_MASK) << UTF16_SHIFT) +
+ (d & UTF16_MASK);
+ }
+--- a/imap/src/c-client/utf8.h
++++ b/imap/src/c-client/utf8.h
+@@ -491,20 +491,34 @@ struct utf8_eucparam {
+
+ #define CT_UNKNOWN 0 /* unknown 8-bit */
+ #define CT_ASCII 1 /* 7-bit ASCII no table */
+-#define CT_UCS2 2 /* 2 byte 16-bit Unicode no table */
+-#define CT_UCS4 3 /* 4 byte 32-bit Unicode no table */
+ #define CT_1BYTE0 10 /* 1 byte ISO 8859-1 no table */
+ #define CT_1BYTE 11 /* 1 byte ASCII + table 0x80-0xff */
+ #define CT_1BYTE8 12 /* 1 byte table 0x00 - 0xff */
+ #define CT_EUC 100 /* 2 byte ASCII + utf8_eucparam base/CS2/CS3 */
+ #define CT_DBYTE 101 /* 2 byte ASCII + utf8_eucparam */
+ #define CT_DBYTE2 102 /* 2 byte ASCII + utf8_eucparam plane1/2 */
+-#define CT_UTF16 1000 /* variable UTF-16 encoded Unicode no table */
+ #define CT_UTF8 1001 /* variable UTF-8 encoded Unicode no table */
+ #define CT_UTF7 1002 /* variable UTF-7 encoded Unicode no table */
+ #define CT_2022 10000 /* variable ISO-2022 encoded no table */
+ #define CT_SJIS 10001 /* 2 byte Shift-JIS encoded JIS no table */
+
++/*
++ * no endianness specified: RFC2781 §4.3 says to check BOM and
++ * interpret as BE if no LE BOM found; Unix says these are host
++ * endianness, but since we don't know that we !CF_DISPLAY these
++ */
++#define CT_UCS2 1010 /* 2 byte 16-bit Unicode no table */
++#define CT_UCS4 1020 /* 4 byte 32-bit Unicode no table */
++#define CT_UTF16 1030 /* variable UTF-16 encoded Unicode no table */
++/* big endian explicit */
++#define CT_UCS2BE 1011 /* 2 byte 16-bit Unicode no table */
++#define CT_UCS4BE 1021 /* 4 byte 32-bit Unicode no table */
++#define CT_UTF16BE 1031 /* variable UTF-16 encoded Unicode no table */
++/* little endian explicit */
++#define CT_UCS2LE 1012 /* 2 byte 16-bit Unicode no table */
++#define CT_UCS4LE 1022 /* 4 byte 32-bit Unicode no table */
++#define CT_UTF16LE 1032 /* variable UTF-16 encoded Unicode no table */
++
+
+ /* Character set flags */
+
+@@ -571,9 +585,12 @@ void utf8_text_sjis (SIZEDTEXT *text,SIZ
+ void utf8_text_2022 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
+ void utf8_text_utf7 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
+ void utf8_text_utf8 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
+-void utf8_text_ucs2 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
+-void utf8_text_ucs4 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
+-void utf8_text_utf16 (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
++void utf8_text_ucs2be (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
++void utf8_text_ucs4be (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
++void utf8_text_utf16be (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
++void utf8_text_ucs2le (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
++void utf8_text_ucs4le (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
++void utf8_text_utf16le (SIZEDTEXT *text,SIZEDTEXT *ret,ucs4cn_t cv,ucs4de_t de);
+ unsigned long utf8_size (unsigned long c);
+ unsigned char *utf8_put (unsigned char *s,unsigned long c);
+ unsigned long ucs4_titlecase (unsigned long c);
diff -Nru alpine-2.10+dfsg/debian/patches/91_fix_b64_rawview.patch alpine-2.10+dfsg/debian/patches/91_fix_b64_rawview.patch
--- alpine-2.10+dfsg/debian/patches/91_fix_b64_rawview.patch 1970-01-01 01:00:00.000000000 +0100
+++ alpine-2.10+dfsg/debian/patches/91_fix_b64_rawview.patch 2013-10-18 17:01:33.000000000 +0200
@@ -0,0 +1,13 @@
+# DP: do not transliterate raw base64 bodies
+
+--- a/pith/mailview.c
++++ b/pith/mailview.c
+@@ -255,7 +255,7 @@ format_body(long int msgno, BODY *body,
+ else
+ charset = ps_global->display_charmap;
+
+- if(strucmp(charset, "us-ascii") && strucmp(charset, "utf-8")){
++ if(body->encoding != ENCBASE64 && strucmp(charset, "us-ascii") && strucmp(charset, "utf-8")){
+ /* transliterate message text to UTF-8 */
+ gf_link_filter(gf_utf8, gf_utf8_opt(charset));
+ }
diff -Nru alpine-2.10+dfsg/debian/patches/series alpine-2.10+dfsg/debian/patches/series
--- alpine-2.10+dfsg/debian/patches/series 2013-05-20 03:37:58.000000000 +0200
+++ alpine-2.10+dfsg/debian/patches/series 2013-10-18 17:00:03.000000000 +0200
@@ -9,3 +9,5 @@
60_fix_string_error.patch
70_des56_rfc5751.patch
80_remove_phone_home.patch
+90_fix_utf16.patch
+91_fix_b64_rawview.patch
diff -Nru alpine-2.10+dfsg/debian/rules alpine-2.10+dfsg/debian/rules
--- alpine-2.10+dfsg/debian/rules 2013-05-20 01:13:50.000000000 +0200
+++ alpine-2.10+dfsg/debian/rules 2013-10-18 17:09:30.000000000 +0200
@@ -33,3 +33,8 @@
DEB_INSTALL_DOCS_ALL :=
DEB_INSTALL_DOCS_alpine := README
+clean::
+ test '!' -e doc/pico.alpine.1 || mv doc/pico.alpine.1 doc/pico.1
+ -rm -f regex/Makefile web/src/Makefile \
+ web/src/alpined.d/Makefile web/src/pubcookie/Makefile \
+ po/stamp-po pico/pico.alpine