X-Original-To: alpine-aports@lists.alpinelinux.org Received: from mail-wj0-f193.google.com (mail-wj0-f193.google.com [209.85.210.193]) by lists.alpinelinux.org (Postfix) with ESMTP id 10F7F5C45AA for ; Wed, 14 Dec 2016 16:12:40 +0000 (GMT) Received: by mail-wj0-f193.google.com with SMTP id kp2so5638698wjc.0 for ; Wed, 14 Dec 2016 08:12:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=/UIc5fNuHcRpMbgD9Txs1T1zNxkYVvzFQKhKTWswjh8=; b=bCQe/qOaG5q+0hBtEriLifrR6dG1Dxtxeb+94kETqe/+2VPWt9QevhLJyGwyPbOKgq 0zQLiYgaOW83usWGcA0EsBXTHQFis/0KK8XvtnmDeC69y9/YQQsEvlShwi1r8dGswixg aUyxNptKQ46HsfrScsJonzA+HwXNLMWMrMaLd0sQsjhk8/m9cBWaM3chMo3cka/01lba L96qsFRkmxRUJips9g/JUopi6HwlUOnEDmWM22HXVAnwp7S767gtYJ3gqyr5gtoBVTIG g2bMTI33A43hqVRqmhKS5gEYOfZc9yUcKAFW0lP3BO7Lw28DCdU7LEkygT5CneVSIF1S usJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=/UIc5fNuHcRpMbgD9Txs1T1zNxkYVvzFQKhKTWswjh8=; b=t1Hqz+e7gsTy667woFNv0EOwwUv1zLqBzvBbkOCbjLta9k2qB0HV0G5wBBoqooAtOO eSPfZTNj9ONLZZ/tDsVWGxzU+xhFfnawyRk9JXUoDi6dLpknnwobR/pQmtRj3QCLruAY 9Lhn68ettCeC1rtOaHr3gJPCi18SOqHqFonE/bqd0iDZY3YMPRpmX5w5K1Cps9ficY2g Ezo0kRkQugKnztVQZG704fpO8tOsHUnpQvX/VLjIIlB05DZeQV929yGHhfW9Fu1gN25Z 9cOCtJISPgfGFwn0woYk8IyNOjdtBrfuK2LAI9nVJEJyZYwc0A9hU/RkMdORxILHbqO0 rTzA== X-Gm-Message-State: AKaTC033Saxw7kK8zJOS9cB77Py5K2ZolO5mT2no2f1JltbHn/aT+QGVDsh8el1/z6pKXA== X-Received: by 10.46.71.140 with SMTP id u134mr41199673lja.19.1481727631694; Wed, 14 Dec 2016 07:00:31 -0800 (PST) Received: from v3-1.util.wtbts.net ([83.145.235.199]) by smtp.gmail.com with ESMTPSA id 32sm1665236lft.5.2016.12.14.07.00.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 14 Dec 2016 07:00:30 -0800 (PST) From: Sergey Lukin To: alpine-aports@lists.alpinelinux.org Cc: Sergey Lukin Subject: [alpine-aports] [PATCH v3.1] main/squid: security upgrade - fixes #5216 Date: Wed, 14 Dec 2016 15:00:21 +0000 Message-Id: <1481727621-8035-1-git-send-email-sergej.lukin@gmail.com> X-Mailer: git-send-email 2.2.1 X-Mailinglist: alpine-aports Precedence: list List-Id: Alpine Development List-Unsubscribe: List-Post: List-Help: List-Subscribe: CVE-2016-2571, CVE-2016-2569, CVE-2016-2570 --- main/squid/APKBUILD | 23 ++- main/squid/squid-3.5-13990-CVE-2016-2571.patch | 47 ++++++ main/squid/squid-3.5-13991-CVE-2016-2569.patch | 223 +++++++++++++++++++++++++ main/squid/squid-3.5-13993-CVE-2016-2570.patch | 71 ++++++++ 4 files changed, 359 insertions(+), 5 deletions(-) create mode 100644 main/squid/squid-3.5-13990-CVE-2016-2571.patch create mode 100644 main/squid/squid-3.5-13991-CVE-2016-2569.patch create mode 100644 main/squid/squid-3.5-13993-CVE-2016-2570.patch diff --git a/main/squid/APKBUILD b/main/squid/APKBUILD index a749db7..7624771 100644 --- a/main/squid/APKBUILD +++ b/main/squid/APKBUILD @@ -1,8 +1,9 @@ # Contributor: Carlo Landmeter +# Contributor: Sergey Lukin # Maintainer: Natanael Copa pkgname=squid pkgver=3.4.14 -pkgrel=2 +pkgrel=3 pkgdesc="A full-featured Web proxy cache server." url="http://www.squid-cache.org" install="squid.pre-install squid.pre-upgrade" @@ -26,6 +27,9 @@ source="http://www.squid-cache.org/Versions/v3/${pkgver%.*}/squid-${pkgver}.tar. squid-3.4-13235.patch SQUID-2016_8.patch SQUID-2016_9.patch + squid-3.5-13990-CVE-2016-2571.patch + squid-3.5-13991-CVE-2016-2569.patch + squid-3.5-13993-CVE-2016-2570.patch squid.initd squid.confd @@ -35,9 +39,9 @@ source="http://www.squid-cache.org/Versions/v3/${pkgver%.*}/squid-${pkgver}.tar. pkgusers="squid" pkggroups="squid" -_builddir="$srcdir"/$pkgname-$pkgver +builddir="$srcdir"/$pkgname-$pkgver prepare() { - cd "$_builddir" + cd "$builddir" for i in $source; do case $i in *.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;; @@ -47,7 +51,7 @@ prepare() { } build() { - cd "$_builddir" + cd "$builddir" ./configure \ --build=$CBUILD \ @@ -91,7 +95,7 @@ build() { } package() { - cd "$_builddir" + cd "$builddir" make DESTDIR="$pkgdir" install install -m755 -D "$srcdir"/$pkgname.initd "$pkgdir"/etc/init.d/$pkgname @@ -120,6 +124,9 @@ aaa90395f61377c5d0efc6c662cbd643 urlgroup.patch e8cb42ff4fece3d34fb18dd9c9de9624 squid-3.4-13235.patch 5a04690517dbade66ea41aae0db9f3aa SQUID-2016_8.patch fa14289924dea81c3507879376456e66 SQUID-2016_9.patch +ffd171f39dd5c0db28f1979c99863472 squid-3.5-13990-CVE-2016-2571.patch +5dadf06e369f253e077310ded5ede674 squid-3.5-13991-CVE-2016-2569.patch +5be19e981eb0f2c02c2972882337ad7e squid-3.5-13993-CVE-2016-2570.patch 947b668332a205626c854d0aece0f3e0 squid.initd 73db59e6c1c242dbc748feeb116650e0 squid.confd 58823e0b86bc2dc71d270208b7b284b4 squid.logrotate" @@ -131,6 +138,9 @@ da44e0e017cc25deb3b221dd0fc7b535c30165cc4eab4752607ad210f60c36b3 squid-3.4-1323 9039b6632ba91e2c4f8df8b34b4daa9a80692722b0a1ddf8b42dd3c6e31882c1 squid-3.4-13235.patch 50e0b16ee5f7e5683563c3234695f74d1b18e8fcdcce097dc8eb442fc6606e18 SQUID-2016_8.patch 9f86e103766a08bb15b06755b6a5b13e5821e89a1472cc0de29b11900c3e6fd0 SQUID-2016_9.patch +9f1f95a1471881fe5dd8da3d473376cffbb0a0d484e639474f589d626bfa6dde squid-3.5-13990-CVE-2016-2571.patch +34448f24ed73b040ea6c7ef5c18054445ea309104dfdc43f68a4cce7f11362ed squid-3.5-13991-CVE-2016-2569.patch +405e3e8d2fbf0f675e17a16f0f6c024e470a01ead17c2b0626a98aee55917b87 squid-3.5-13993-CVE-2016-2570.patch 29eb267e6ebf9b409836b35ba37f263924f40c30cd0c24b91b1ddce380f2163b squid.initd 4012fc97d7ab653c8a73c4dac09751de80c847a90ee2483ddd41a04168cdeb2b squid.confd b6efdb3261c2e4b5074ef49160af8b96e65f934c7fd64b8954df48aa41cd9b67 squid.logrotate" @@ -142,6 +152,9 @@ b477397f205ba207502a42aae674c85cad85eec831158ea0834361d98ef09a0f103d7a847e101bdd 099df7c5cc803e03f3bd77ee20348834b82110a6f7a844512d90dbfb957f1b6da0168a5a31d00b18ab0ccce704a7f97655f1acc84440204b614dc2913d935da8 squid-3.4-13235.patch a0ca97c1cb1b04b6e94af55dd67c11f084a07106ad8bb1687d52762b906d8a79247cfde9de4abf1c65da1b0aefacfaae9166ad9c5f6183f5b5dd1ec3ab4ae81b SQUID-2016_8.patch af96a87ad673b38c974b8d9e49a235d65d4a480cae3859d1018bf5fec77c79dffbfa42454937eb309aef5a745a800edfc543ac3d5041d961a094af42a58f91b7 SQUID-2016_9.patch +f59e753fa2c416b57091eede4dfe04c5a6cf72443a0eb7d539b756b2a42d9ff20cfd2616353d256f4670d4c6d3833b3135e8967db5c28f1f5f1b252700dd419d squid-3.5-13990-CVE-2016-2571.patch +5874f00c02ced40b5e61ad5e3ef2cb30098f2e941258248779a4c227c819d9ea47be6d8ef143631a0834e99b2b04fa3db3d2e8eab81b329c8c14f7ae78ca3822 squid-3.5-13991-CVE-2016-2569.patch +501febe38a46e955b1225fddfcbd0e984b16ae94d6f1bff5414c3b5ab28f6c327138108732babcbdc3da8e5596e94aeccf449734c5782d0f5c1fbe97598ebe2f squid-3.5-13993-CVE-2016-2570.patch 3da7673cde48aac9d7f45b0c0208c2608dd66b3fa70f897b83cb3d0a4f9ba88f3e3706cbab65eb811e77a52643d8616350c84ab599d8e617212f934cb44ffc99 squid.initd 7292661de344e8a87d855c83afce49511685d2680effab3afab110e45144c0117935f3bf73ab893c9e6d43f7fb5ba013635e24f6da6daf0eeb895ef2e9b5baa9 squid.confd 89a703fa4f21b6c7c26e64a46fd52407e20f00c34146ade0bea0c4b63d050117c0f8e218f2256a1fbf6abb84f4ec9b0472c9a4092ff6e78f07c4f5a25d0892a5 squid.logrotate" diff --git a/main/squid/squid-3.5-13990-CVE-2016-2571.patch b/main/squid/squid-3.5-13990-CVE-2016-2571.patch new file mode 100644 index 0000000..675928c --- /dev/null +++ b/main/squid/squid-3.5-13990-CVE-2016-2571.patch @@ -0,0 +1,47 @@ +patch was modified for applying to squid-3.4.14 +------------------------------------------------------------ +revno: 13990 +revision-id: rousskov@measurement-factory.com-20160218041533-8tmtd45c3nky2gyy +parent: squid3@treenet.co.nz-20160215135848-ms0dmjsfouxcb8g2 +committer: Alex Rousskov +branch nick: 3.5 +timestamp: Wed 2016-02-17 21:15:33 -0700 +message: + Better handling of huge response headers. Fewer "BUG 3279" messages. + + When we failed to parse a response, do not store the fake half-baked + response (via a replaceHttpReply() call). Doing so leads to misleading + "BUG 3279: HTTP reply without Date" messages (at best). The fake + response is only meant for continueAfterParsingHeader(). + + Also removed a misleading XXX that may have caused Bug 4432 in v4.0 + (trunk r14548). +------------------------------------------------------------ +# Bazaar merge directive format 2 (Bazaar 0.90) +# revision_id: rousskov@measurement-factory.com-20160218041533-\ +# 8tmtd45c3nky2gyy +# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 +# testament_sha1: 0a7978c0442191d33a9472c6185692a78da6c0b0 +# timestamp: 2016-02-18 04:50:56 +0000 +# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 +# base_revision_id: squid3@treenet.co.nz-20160215135848-\ +# ms0dmjsfouxcb8g2 +# +# Begin patch +=== modified file 'src/http.cc' +--- a/src/http.cc ++++ b/src/http.cc +@@ -719,11 +719,8 @@ + if (!parsed && error > 0) { // unrecoverable parsing error + debugs(11, 3, "processReplyHeader: Non-HTTP-compliant header: '" << readBuf->content() << "'"); + flags.headers_parsed = true; +- // XXX: when sanityCheck is gone and Http::StatusLine is used to parse, +- // the sline should be already set the appropriate values during that parser stage + newrep->sline.set(Http::ProtocolVersion(1,1), error); +- HttpReply *vrep = setVirginReply(newrep); +- entry->replaceHttpReply(vrep); ++ setVirginReply(newrep); + ctx_exit(ctx); + return; + } + diff --git a/main/squid/squid-3.5-13991-CVE-2016-2569.patch b/main/squid/squid-3.5-13991-CVE-2016-2569.patch new file mode 100644 index 0000000..2f813ec --- /dev/null +++ b/main/squid/squid-3.5-13991-CVE-2016-2569.patch @@ -0,0 +1,223 @@ +patch was modified for applying to squid-3.4.14 +------------------------------------------------------------ +revno: 13991 +revision-id: rousskov@measurement-factory.com-20160219231541-syrgnvl1av8bbn8d +parent: rousskov@measurement-factory.com-20160218041533-8tmtd45c3nky2gyy +committer: Alex Rousskov +branch nick: 3.5 +timestamp: Fri 2016-02-19 16:15:41 -0700 +message: + Throw instead of asserting on some String overflows. + + Note that Client-caught exceptions result in HTTP 500 (Internal Server + Error) responses with X-Squid-Error set to "ERR_CANNOT_FORWARD 0". + + Also avoid stuck Client jobs on exceptions. + + Also unified String size limit checks. + + Essentially trunk r14552, which has a detailed commit message. +------------------------------------------------------------ +# Bazaar merge directive format 2 (Bazaar 0.90) +# revision_id: rousskov@measurement-factory.com-20160219231541-\ +# syrgnvl1av8bbn8d +# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 +# testament_sha1: 3a9c41e0584065e737250cf9f8eb9eea7a85e9ba +# timestamp: 2016-02-19 23:50:57 +0000 +# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 +# base_revision_id: rousskov@measurement-factory.com-20160218041533-\ +# 8tmtd45c3nky2gyy +# +# Begin patch +=== modified file 'src/SquidString.h' +--- a/src/SquidString.h ++++ b/src/SquidString.h +@@ -80,6 +80,13 @@ + _SQUID_INLINE_ int caseCmp(char const *, size_type count) const; + _SQUID_INLINE_ int caseCmp(String const &) const; + ++ /// Whether creating a totalLen-character string is safe (i.e., unlikely to assert). ++ /// Optional extras can be used for overflow-safe length addition. ++ /// Implementation has to add 1 because many String allocation methods do. ++ static bool CanGrowTo(size_type totalLen, const size_type extras = 0) { return SafeAdd(totalLen, extras) && SafeAdd(totalLen, 1); } ++ /// whether appending growthLen characters is safe (i.e., unlikely to assert) ++ bool canGrowBy(const size_type growthLen) const { return CanGrowTo(size(), growthLen); } ++ + String substr(size_type from, size_type to) const; + + _SQUID_INLINE_ void cut(size_type newLength); +@@ -95,10 +102,14 @@ + _SQUID_INLINE_ bool nilCmp(bool, bool, int &) const; + + /* never reference these directly! */ +- size_type size_; /* buffer size; 64K limit */ ++ size_type size_; /* buffer size; limited by SizeMax_ */ + + size_type len_; /* current length */ + ++ static const size_type SizeMax_ = 65535; ///< 64K limit protects some fixed-size buffers ++ /// returns true after increasing the first argument by extra if the sum does not exceed SizeMax_ ++ static bool SafeAdd(size_type &base, size_type extra) { if (extra <= SizeMax_ && base <= SizeMax_ - extra) { base += extra; return true; } return false; } ++ + char *buf_; + + _SQUID_INLINE_ void set(char const *loc, char const ch); + +=== modified file 'src/StrList.cc' +--- a/src/StrList.cc ++++ b/src/StrList.cc +@@ -11,20 +11,24 @@ + #include "squid.h" + #include "SquidString.h" + #include "StrList.h" ++#include "base/TextException.h" + + /** appends an item to the list */ + void + strListAdd(String * str, const char *item, char del) + { + assert(str && item); ++ const String::size_type itemSize = strlen(item); + if (str->size()) { + char buf[3]; + buf[0] = del; + buf[1] = ' '; + buf[2] = '\0'; ++ Must(str->canGrowBy(2)); + str->append(buf, 2); + } +- str->append(item, strlen(item)); ++ Must(str->canGrowBy(itemSize)); ++ str->append(item, itemSize); + } + + /** returns true iff "m" is a member of the list */ + +=== modified file 'src/String.cc' +--- a/src/String.cc ++++ b/src/String.cc +@@ -42,7 +42,7 @@ + String::setBuffer(char *aBuf, String::size_type aSize) + { + assert(undefined()); +- assert(aSize < 65536); ++ assert(aSize <= SizeMax_); + buf_ = aBuf; + size_ = aSize; + } +@@ -171,7 +171,7 @@ + } else { + // Create a temporary string and absorb it later. + String snew; +- assert(len_ + len < 65536); // otherwise snew.len_ overflows below ++ assert(canGrowBy(len)); // otherwise snew.len_ may overflow below + snew.len_ = len_ + len; + snew.allocBuffer(snew.len_ + 1); + + +=== modified file 'src/Server.cc' +--- a/src/Server.cc ++++ b/src/Server.cc +@@ -49,6 +49,7 @@ + startedAdaptation(false), + #endif + receivedWholeRequestBody(false), ++ doneWithFwd(NULL), + theVirginReply(NULL), + theFinalReply(NULL) + { +@@ -74,8 +75,6 @@ + HTTPMSGUNLOCK(theVirginReply); + HTTPMSGUNLOCK(theFinalReply); + +- fwd = NULL; // refcounted +- + if (responseBodyBuffer != NULL) { + delete responseBodyBuffer; + responseBodyBuffer = NULL; +@@ -93,6 +92,14 @@ + cleanAdaptation(); + #endif + ++ if (!doneWithServer()) ++ closeServer(); ++ ++ if (!doneWithFwd) { ++ doneWithFwd = "swanSong()"; ++ fwd->handleUnregisteredServerEnd(); ++ } ++ + BodyConsumer::swanSong(); + #if USE_ADAPTATION + Initiator::swanSong(); +@@ -218,6 +225,7 @@ + { + debugs(11,5, HERE << "completing forwarding for " << fwd); + assert(fwd != NULL); ++ doneWithFwd = "completeForwarding()"; + fwd->complete(); + } + + +=== modified file 'src/Server.h' +--- a/src/Server.h ++++ b/src/Server.h +@@ -176,6 +176,10 @@ + #endif + bool receivedWholeRequestBody; ///< handleRequestBodyProductionEnded called + ++ /// whether we should not be talking to FwdState; XXX: clear fwd instead ++ /// points to a string literal which is used only for debugging ++ const char *doneWithFwd; ++ + private: + void sendBodyIsTooLargeError(); + void maybePurgeOthers(); + +=== modified file 'src/ftp.cc' +--- a/src/ftp.cc ++++ b/src/ftp.cc +@@ -839,6 +839,7 @@ + { + debugs(9, 4, HERE); + ctrl.clear(); ++ doneWithFwd = "ctrlClosed()"; // assume FwdState is monitoring too + mustStop("FtpStateData::ctrlClosed"); + } + + +=== modified file 'src/http.cc' +--- a/src/http.cc ++++ b/src/http.cc +@@ -152,6 +152,7 @@ + HttpStateData::httpStateConnClosed(const CommCloseCbParams ¶ms) + { + debugs(11, 5, "httpStateFree: FD " << params.fd << ", httpState=" << params.data); ++ doneWithFwd = "httpStateConnClosed()"; // assume FwdState is monitoring too + mustStop("HttpStateData::httpStateConnClosed"); + } + +@@ -2407,21 +2409,11 @@ + ServerStateData::sentRequestBody(io); + } + +-// Quickly abort the transaction +-// TODO: destruction should be sufficient as the destructor should cleanup, +-// including canceling close handlers + void + HttpStateData::abortTransaction(const char *reason) + { + debugs(11,5, HERE << "aborting transaction for " << reason << + "; " << serverConnection << ", this " << this); +- +- if (Comm::IsConnOpen(serverConnection)) { +- serverConnection->close(); +- return; +- } +- +- fwd->handleUnregisteredServerEnd(); +- mustStop("HttpStateData::abortTransaction"); ++ mustStop(reason); + } + + diff --git a/main/squid/squid-3.5-13993-CVE-2016-2570.patch b/main/squid/squid-3.5-13993-CVE-2016-2570.patch new file mode 100644 index 0000000..5568dc3 --- /dev/null +++ b/main/squid/squid-3.5-13993-CVE-2016-2570.patch @@ -0,0 +1,71 @@ +patch was modified for applying to squid-3.4.14 +------------------------------------------------------------ +revno: 13993 +revision-id: squid3@treenet.co.nz-20160223154710-wcrkwwyohp2f263g +parent: squidadm@squid-cache.org-20160220001407-1ejhjctyaf86oame +fixes bug: http://bugs.squid-cache.org/show_bug.cgi?id=3870 +author: William Lima +committer: Amos Jeffries +branch nick: 3.5 +timestamp: Wed 2016-02-24 04:47:10 +1300 +message: + Bug 3870: assertion failed: String.cc: 'len_ + len <65536' in ESI::CustomParser + + The custom ESI parser used in absence of libxml2 or libexpat parsers was + restricted to handling 64KB buffers but under some conditions could expand + to over 64KB during the parse process. Hitting this assertion. + + TODO: the parser can now be redesigned to make use of Tokenizer and + CharacterSet parsing tools. But that is left for later work. +------------------------------------------------------------ +# Bazaar merge directive format 2 (Bazaar 0.90) +# revision_id: squid3@treenet.co.nz-20160223154710-wcrkwwyohp2f263g +# target_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 +# testament_sha1: d8513f84eb3af6881e9264e9e4a4b0b3c6302caf +# timestamp: 2016-02-23 15:50:48 +0000 +# source_branch: http://bzr.squid-cache.org/bzr/squid3/3.5 +# base_revision_id: squidadm@squid-cache.org-20160220001407-\ +# 1ejhjctyaf86oame +# +# Begin patch +=== modified file 'src/esi/CustomParser.cc' +--- a/src/esi/CustomParser.cc ++++ b/src/esi/CustomParser.cc +@@ -89,9 +89,11 @@ + } + + size_t openESITags (0); +- //erring on the safe side. Probably rawBuf would be ok too +- char const *currentPos = content.termedBuf(); +- size_t remainingCount = content.size(); ++ // TODO: convert to Tokenizer parse ++ // erring on the safe side for now. Probably rawContent would be ok too ++ // note that operations below do *X='\0' ... altering the 'const' buffer content. ++ char const *currentPos = content.c_str(); ++ SBuf::size_type remainingCount = content.length(); + char const *tag = NULL; + + while ((tag = findTag(currentPos, remainingCount))) { + +=== modified file 'src/esi/CustomParser.h' +--- a/src/esi/CustomParser.h ++++ b/src/esi/CustomParser.h +@@ -14,7 +14,7 @@ + /* inherits from */ + #include "esi/Parser.h" + +-/* for String variables */ ++#include "SBuf.h" + #include "SquidString.h" + + /** +@@ -46,7 +46,7 @@ + ESIParserClient *theClient; + String error; + /* cheap n dirty - buffer it all */ +- String content; ++ SBuf content; + /* TODO: make a class of this type code */ + ESITAG_t lastTag; + }; + -- 2.2.1 --- Unsubscribe: alpine-aports+unsubscribe@lists.alpinelinux.org Help: alpine-aports+help@lists.alpinelinux.org ---