diff --git a/system/icu/APKBUILD b/system/icu/APKBUILD
index 4165246a3688a458547b31ab99f7e106efaea9b9..0466983161f647abd7ef3c8183784a953c76518f 100644
--- a/system/icu/APKBUILD
+++ b/system/icu/APKBUILD
@@ -6,7 +6,7 @@ pkgver=65.1
 # convert x.y.z to x_y_z
 _ver=$(printf '%s' "$pkgver" | tr . _)
 
-pkgrel=0
+pkgrel=1
 pkgdesc="International Components for Unicode"
 url="http://site.icu-project.org/"
 arch="all"
@@ -17,6 +17,7 @@ makedepends=""
 subpackages="$pkgname-static $pkgname-dev $pkgname-doc $pkgname-libs"
 source="https://github.com/unicode-org/icu/releases/download/release-$(printf '%s' "$pkgver" | tr . -)/${pkgname}4c-$_ver-src.tgz
 	icu-60.2-always-use-utf8.patch
+	CVE-2020-10531.patch
 	"
 
 # secfixes:
@@ -27,6 +28,9 @@ source="https://github.com/unicode-org/icu/releases/download/release-$(printf '%
 #   58.2-r2:
 #     - CVE-2017-7867
 #     - CVE-2017-7868
+#   65.1-r1:
+#     - CVE-2020-10531
+
 builddir="$srcdir"/icu/source
 
 prepare() {
@@ -73,4 +77,5 @@ static() {
 }
 
 sha512sums="8f1ef33e1f4abc9a8ee870331c59f01b473d6da1251a19ce403f822f3e3871096f0791855d39c8f20c612fc49cda2c62c06864aa32ddab2dbd186d2b21ce9139  icu4c-65_1-src.tgz
-f86c62422f38f6485c58d4766e629bab69e4b0e00fa910854e40e7db1ace299152eaefa99ae2fbab7465e65d3156cbea7124612defa60680db58ab5c34d6262f  icu-60.2-always-use-utf8.patch"
+f86c62422f38f6485c58d4766e629bab69e4b0e00fa910854e40e7db1ace299152eaefa99ae2fbab7465e65d3156cbea7124612defa60680db58ab5c34d6262f  icu-60.2-always-use-utf8.patch
+2901235a24b1973516e495473188b077eb0486714ac47f702f226a3406176e913672159978b67548a1316284ecc716e06158b05c190ddfa83ad576a7a3539d72  CVE-2020-10531.patch"
diff --git a/system/icu/CVE-2017-7867-7868.patch b/system/icu/CVE-2017-7867-7868.patch
deleted file mode 100644
index df18283c2baa90294b15f99d10a45012322a9ab4..0000000000000000000000000000000000000000
--- a/system/icu/CVE-2017-7867-7868.patch
+++ /dev/null
@@ -1,155 +0,0 @@
-Index: source/common/utext.cpp
-===================================================================
---- source/common/utext.cpp	(revision 39670)
-+++ source/common/utext.cpp	(revision 39671)
-@@ -848,7 +848,13 @@
- 
- // Chunk size.
--//     Must be less than 85, because of byte mapping from UChar indexes to native indexes.
--//     Worst case is three native bytes to one UChar.  (Supplemenaries are 4 native bytes
--//     to two UChars.)
-+//     Must be less than 42  (256/6), because of byte mapping from UChar indexes to native indexes.
-+//     Worst case there are six UTF-8 bytes per UChar.
-+//         obsolete 6 byte form fd + 5 trails maps to fffd
-+//         obsolete 5 byte form fc + 4 trails maps to fffd
-+//         non-shortest 4 byte forms maps to fffd
-+//         normal supplementaries map to a pair of utf-16, two utf8 bytes per utf-16 unit
-+//     mapToUChars array size must allow for the worst case, 6.
-+//     This could be brought down to 4, by treating fd and fc as pure illegal,
-+//     rather than obsolete lead bytes. But that is not compatible with the utf-8 access macros.
- //
- enum { UTF8_TEXT_CHUNK_SIZE=32 };
-@@ -890,5 +896,5 @@
-                                                      //    one for a supplementary starting in the last normal position,
-                                                      //    and one for an entry for the buffer limit position.
--    uint8_t   mapToUChars[UTF8_TEXT_CHUNK_SIZE*3+6]; // Map native offset from bufNativeStart to
-+    uint8_t   mapToUChars[UTF8_TEXT_CHUNK_SIZE*6+6]; // Map native offset from bufNativeStart to
-                                                      //   correspoding offset in filled part of buf.
-     int32_t   align;
-@@ -1033,4 +1039,5 @@
-             u8b = (UTF8Buf *)ut->p;   // the current buffer
-             mapIndex = ix - u8b->toUCharsMapStart;
-+            U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
-             ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
-             return TRUE;
-@@ -1299,4 +1306,8 @@
-         //   If index is at the end, there is no character there to look at.
-         if (ix != ut->b) {
-+            // Note: this function will only move the index back if it is on a trail byte
-+            //       and there is a preceding lead byte and the sequence from the lead 
-+            //       through this trail could be part of a valid UTF-8 sequence
-+            //       Otherwise the index remains unchanged.
-             U8_SET_CP_START(s8, 0, ix);
-         }
-@@ -1312,5 +1323,8 @@
-         uint8_t *mapToNative = u8b->mapToNative;
-         uint8_t *mapToUChars = u8b->mapToUChars;
--        int32_t  toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1);
-+        int32_t  toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1;
-+        // Note that toUCharsMapStart can be negative. Happens when the remaining
-+        // text from current position to the beginning is less than the buffer size.
-+        // + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry.
-         int32_t  destIx = UTF8_TEXT_CHUNK_SIZE+2;   // Start in the overflow region
-                                                     //   at end of buffer to leave room
-@@ -1339,4 +1353,5 @@
-                 // Special case ASCII range for speed.
-                 buf[destIx] = (UChar)c;
-+                U_ASSERT(toUCharsMapStart <= srcIx);
-                 mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx;
-                 mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart);
-@@ -1368,4 +1383,5 @@
-                     mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx;
-                 } while (sIx >= srcIx);
-+                U_ASSERT(toUCharsMapStart <= (srcIx+1));
- 
-                 // Set native indexing limit to be the current position.
-@@ -1542,4 +1558,5 @@
-     U_ASSERT(index<=ut->chunkNativeLimit);
-     int32_t mapIndex = index - u8b->toUCharsMapStart;
-+    U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
-     int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
-     U_ASSERT(offset>=0 && offset<=ut->chunkLength);
-Index: source/test/intltest/utxttest.cpp
-===================================================================
---- source/test/intltest/utxttest.cpp	(revision 39670)
-+++ source/test/intltest/utxttest.cpp	(revision 39671)
-@@ -68,4 +68,6 @@
-         case 7: name = "Ticket12130";
-             if (exec) Ticket12130(); break;
-+        case 8: name = "Ticket12888";
-+            if (exec) Ticket12888(); break;
-         default: name = "";          break;
-     }
-@@ -1584,2 +1586,62 @@
-     utext_close(&ut);
- }
-+
-+// Ticket 12888: bad handling of illegal utf-8 containing many instances of the archaic, now illegal,
-+//               six byte utf-8 forms. Original implementation had an assumption that
-+//               there would be at most three utf-8 bytes per UTF-16 code unit.
-+//               The five and six byte sequences map to a single replacement character.
-+
-+void UTextTest::Ticket12888() {
-+    const char *badString = 
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80"
-+            "\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80\xfd\x80\x80\x80\x80\x80";
-+
-+    UErrorCode status = U_ZERO_ERROR;
-+    LocalUTextPointer ut(utext_openUTF8(NULL, badString, -1, &status));
-+    TEST_SUCCESS(status);
-+    for (;;) {
-+        UChar32 c = utext_next32(ut.getAlias());
-+        if (c == U_SENTINEL) {
-+            break;
-+        }
-+    }
-+    int32_t endIdx = utext_getNativeIndex(ut.getAlias());
-+    if (endIdx != (int32_t)strlen(badString)) {
-+        errln("%s:%d expected=%d, actual=%d", __FILE__, __LINE__, strlen(badString), endIdx);
-+        return;
-+    }
-+
-+    for (int32_t prevIndex = endIdx; prevIndex>0;) {
-+        UChar32 c = utext_previous32(ut.getAlias());
-+        int32_t currentIndex = utext_getNativeIndex(ut.getAlias());
-+        if (c != 0xfffd) {
-+            errln("%s:%d (expected, actual, index) = (%d, %d, %d)\n",
-+                    __FILE__, __LINE__, 0xfffd, c, currentIndex);
-+            break;
-+        }
-+        if (currentIndex != prevIndex - 6) {
-+            errln("%s:%d: wrong index. Expected, actual = %d, %d",
-+                    __FILE__, __LINE__, prevIndex - 6, currentIndex);
-+            break;
-+        }
-+        prevIndex = currentIndex;
-+    }
-+}
-Index: source/test/intltest/utxttest.h
-===================================================================
---- source/test/intltest/utxttest.h	(revision 39670)
-+++ source/test/intltest/utxttest.h	(revision 39671)
-@@ -39,4 +39,5 @@
-     void Ticket10983();
-     void Ticket12130();
-+    void Ticket12888();
- 
- private:
diff --git a/system/icu/CVE-2020-10531.patch b/system/icu/CVE-2020-10531.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f456b06ec15736128f0397992530969139e450f7
--- /dev/null
+++ b/system/icu/CVE-2020-10531.patch
@@ -0,0 +1,118 @@
+From b7d08bc04a4296982fcef8b6b8a354a9e4e7afca Mon Sep 17 00:00:00 2001
+From: Frank Tang <ftang@chromium.org>
+Date: Sat, 1 Feb 2020 02:39:04 +0000
+Subject: [PATCH] ICU-20958 Prevent SEGV_MAPERR in append
+
+See #971
+---
+ source/common/unistr.cpp          |  6 ++-
+ source/test/intltest/ustrtest.cpp | 62 +++++++++++++++++++++++++
+ source/test/intltest/ustrtest.h   |  1 +
+ 3 files changed, 68 insertions(+), 1 deletion(-)
+
+diff --git source/common/unistr.cpp source/common/unistr.cpp
+index 901bb3358ba..077b4d6ef20 100644
+--- source/common/unistr.cpp
++++ source/common/unistr.cpp
+@@ -1563,7 +1563,11 @@ UnicodeString::doAppend(const UChar *srcChars, int32_t srcStart, int32_t srcLeng
+   }
+ 
+   int32_t oldLength = length();
+-  int32_t newLength = oldLength + srcLength;
++  int32_t newLength;
++  if (uprv_add32_overflow(oldLength, srcLength, &newLength)) {
++    setToBogus();
++    return *this;
++  }
+ 
+   // Check for append onto ourself
+   const UChar* oldArray = getArrayStart();
+diff --git source/test/intltest/ustrtest.cpp source/test/intltest/ustrtest.cpp
+index b6515ea813c..ad38bdf53a3 100644
+--- source/test/intltest/ustrtest.cpp
++++ source/test/intltest/ustrtest.cpp
+@@ -67,6 +67,7 @@ void UnicodeStringTest::runIndexedTest( int32_t index, UBool exec, const char* &
+     TESTCASE_AUTO(TestWCharPointers);
+     TESTCASE_AUTO(TestNullPointers);
+     TESTCASE_AUTO(TestUnicodeStringInsertAppendToSelf);
++    TESTCASE_AUTO(TestLargeAppend);
+     TESTCASE_AUTO_END;
+ }
+ 
+@@ -2310,3 +2311,64 @@ void UnicodeStringTest::TestUnicodeStringInsertAppendToSelf() {
+     str.insert(2, sub);
+     assertEquals("", u"abbcdcde", str);
+ }
++
++void UnicodeStringTest::TestLargeAppend() {
++    if(quick) return;
++
++    IcuTestErrorCode status(*this, "TestLargeAppend");
++    // Make a large UnicodeString
++    int32_t len = 0xAFFFFFF;
++    UnicodeString str;
++    char16_t *buf = str.getBuffer(len);
++    // A fast way to set buffer to valid Unicode.
++    // 4E4E is a valid unicode character
++    uprv_memset(buf, 0x4e, len * 2);
++    str.releaseBuffer(len);
++    UnicodeString dest;
++    // Append it 16 times
++    // 0xAFFFFFF times 16 is 0xA4FFFFF1,
++    // which is greater than INT32_MAX, which is 0x7FFFFFFF.
++    int64_t total = 0;
++    for (int32_t i = 0; i < 16; i++) {
++        dest.append(str);
++        total += len;
++        if (total <= INT32_MAX) {
++            assertFalse("dest is not bogus", dest.isBogus());
++        } else {
++            assertTrue("dest should be bogus", dest.isBogus());
++        }
++    }
++    dest.remove();
++    total = 0;
++    for (int32_t i = 0; i < 16; i++) {
++        dest.append(str);
++        total += len;
++        if (total + len <= INT32_MAX) {
++            assertFalse("dest is not bogus", dest.isBogus());
++        } else if (total <= INT32_MAX) {
++            // Check that a string of exactly the maximum size works
++            UnicodeString str2;
++            int32_t remain = INT32_MAX - total;
++            char16_t *buf2 = str2.getBuffer(remain);
++            if (buf2 == nullptr) {
++                // if somehow memory allocation fail, return the test
++                return;
++            }
++            uprv_memset(buf2, 0x4e, remain * 2);
++            str2.releaseBuffer(remain);
++            dest.append(str2);
++            total += remain;
++            assertEquals("When a string of exactly the maximum size works", (int64_t)INT32_MAX, total);
++            assertEquals("When a string of exactly the maximum size works", INT32_MAX, dest.length());
++            assertFalse("dest is not bogus", dest.isBogus());
++
++            // Check that a string size+1 goes bogus
++            str2.truncate(1);
++            dest.append(str2);
++            total++;
++            assertTrue("dest should be bogus", dest.isBogus());
++        } else {
++            assertTrue("dest should be bogus", dest.isBogus());
++        }
++    }
++}
+diff --git source/test/intltest/ustrtest.h source/test/intltest/ustrtest.h
+index 218befdcc68..4a356a92c7a 100644
+--- source/test/intltest/ustrtest.h
++++ source/test/intltest/ustrtest.h
+@@ -97,6 +97,7 @@ class UnicodeStringTest: public IntlTest {
+     void TestWCharPointers();
+     void TestNullPointers();
+     void TestUnicodeStringInsertAppendToSelf();
++    void TestLargeAppend();
+ };
+ 
+ #endif
diff --git a/system/pcre2/APKBUILD b/system/pcre2/APKBUILD
index 7bca0e45023d1a014d621289b7c4a62bf34dc3e4..4120d0a7b30a59a196db4f27f463db813bd9159d 100644
--- a/system/pcre2/APKBUILD
+++ b/system/pcre2/APKBUILD
@@ -2,7 +2,7 @@
 # Maintainer: 
 pkgname=pcre2
 pkgver=10.33
-pkgrel=0
+pkgrel=1
 pkgdesc="Perl-compatible regular expression library"
 url="https://pcre.org"
 arch="all"
@@ -12,7 +12,13 @@ depends_dev="libedit-dev zlib-dev"
 makedepends="$depends_dev"
 subpackages="$pkgname-dev $pkgname-doc $pkgname-tools
 	libpcre2-16:_libpcre libpcre2-32:_libpcre"
-source="https://ftp.pcre.org/pub/pcre/$pkgname-$pkgver.tar.gz"
+source="https://ftp.pcre.org/pub/pcre/$pkgname-$pkgver.tar.gz
+	CVE-2019-20454.patch
+	"
+
+# secfixes:
+#   10.33-r1:
+#     - CVE-2019-20454
 
 case "$CARCH" in
 	s390x) _enable_jit="";;
@@ -62,4 +68,5 @@ tools() {
 	mv "$pkgdir"/usr/bin "$subpkgdir"/usr/
 }
 
-sha512sums="649983c7725e2fd2451ba89243b4c08c408fc279b7be3b2d225045cced3b0667ff6da4c9dd37510eb9e5aed6478aff54c2dbd1d92f4d0f1174579df9ec2c1882  pcre2-10.33.tar.gz"
+sha512sums="649983c7725e2fd2451ba89243b4c08c408fc279b7be3b2d225045cced3b0667ff6da4c9dd37510eb9e5aed6478aff54c2dbd1d92f4d0f1174579df9ec2c1882  pcre2-10.33.tar.gz
+07c43ccf130c1ed2b4f97036671f92e9c1d0100fd32c053b448e5dbdf976543c12f74568e37b661db7fbd603e815f5683a59cb2a9f9c307505dca3cb36db8120  CVE-2019-20454.patch"
diff --git a/system/pcre2/CVE-2019-20454.patch b/system/pcre2/CVE-2019-20454.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bdec87294f43ca005cab7907937a07c76d957b6f
--- /dev/null
+++ b/system/pcre2/CVE-2019-20454.patch
@@ -0,0 +1,50 @@
+Revision: 1091
+Author: ph10
+Date: Mon May 13 16:26:17 2019 UTC
+URL: https://vcs.pcre.org/pcre2?view=revision&revision=1091
+
+Fix crash when \X is used without UTF in JIT.
+
+--- a/testdata/testinput4	2019/05/11 11:43:39	1090
++++ b/testdata/testinput4	2019/05/13 16:26:17	1091
+@@ -2480,4 +2480,7 @@
+ /^(?'אABC'...)(?&אABC)/utf
+     123123123456
+ 
++/\X*/
++    \xF3aaa\xE4\xEA\xEB\xFEa
++
+ # End of testinput4
+--- a/testdata/testoutput4	2019/05/11 11:43:39	1090
++++ b/testdata/testoutput4	2019/05/13 16:26:17	1091
+@@ -4012,4 +4012,8 @@
+  0: 123123
+  1: 123
+ 
++/\X*/
++    \xF3aaa\xE4\xEA\xEB\xFEa
++ 0: \xf3aaa\xe4\xea\xeb\xfea
++
+ # End of testinput4
+
+Revision: 1092
+Author: ph10
+Date: Mon May 13 16:38:18 2019 UTC
+URL: https://vcs.pcre.org/pcre2?view=revision&revision=1092
+
+Forgot this file in previous commit. Fixes JIT non-UTF bug.
+
+--- a/src/pcre2_jit_compile.c	2019/05/13 16:26:17	1091
++++ b/src/pcre2_jit_compile.c	2019/05/13 16:38:18	1092
+@@ -8571,7 +8571,10 @@
+ PCRE2_SPTR bptr;
+ uint32_t c;
+ 
+-GETCHARINC(c, cc);
++/* Patch by PH */
++/* GETCHARINC(c, cc); */
++
++c = *cc++;
+ #if PCRE2_CODE_UNIT_WIDTH == 32
+ if (c >= 0x110000)
+   return NULL;
diff --git a/system/python3/APKBUILD b/system/python3/APKBUILD
index b8c72f3a72092c28cad27b314535f15bc6882019..e875d3941aa4afb3579a3a3cafa9f5e993932b15 100644
--- a/system/python3/APKBUILD
+++ b/system/python3/APKBUILD
@@ -1,7 +1,7 @@
 # Contributor: Kiyoshi Aman <adelie@aerdan.vulpine.house>
 # Maintainer: A. Wilcox <awilfox@adelielinux.org>
 pkgname=python3
-pkgver=3.6.9
+pkgver=3.6.10
 _basever="${pkgver%.*}"
 pkgrel=2
 pkgdesc="A high-level scripting language"
@@ -40,8 +40,7 @@ makedepends="expat-dev openssl-dev zlib-dev ncurses-dev bzip2-dev xz-dev
 source="https://www.python.org/ftp/python/$pkgver/Python-$pkgver.tar.xz
 	musl-find_library.patch
 	fix-xattrs-glibc.patch
-	CVE-2019-16056.patch
-	CVE-2019-16935.patch
+	CVE-2019-18348.patch
 	"
 builddir="$srcdir/Python-$pkgver"
 
@@ -63,6 +62,8 @@ builddir="$srcdir/Python-$pkgver"
 #     - CVE-2019-16056
 #   3.6.9-r2:
 #     - CVE-2019-16935
+#   3.6.10-r0:
+#     - CVE-2019-18348
 
 prepare() {
 	default_prepare
@@ -153,11 +154,14 @@ EOF
 }
 
 package() {
+	export XDG_CACHE_HOME="$(mktemp -d)"
 	make -j1 DESTDIR="$pkgdir" EXTRA_CFLAGS="$CFLAGS" install maninstall
 	install -Dm644 LICENSE "$pkgdir"/usr/share/licenses/$pkgname/LICENSE
 	# those are provided by python3-tkinter
 	rm -r "$pkgdir"/usr/bin/idle* "$pkgdir"/usr/lib/python*/idlelib \
 		"$pkgdir"/usr/lib/python*/tkinter
+
+	rm -rf "$XDG_CACHE_HOME"
 }
 
 dev() {
@@ -189,8 +193,7 @@ wininst() {
 		"$subpkgdir"/usr/lib/python$_basever/distutils/command
 }
 
-sha512sums="05de9c6f44d96a52bfce10ede4312de892573edaf8bece65926d19973a3a800d65eed7a857af945f69efcfb25efa3788e7a54016b03d80b611eb51c3ea074819  Python-3.6.9.tar.xz
+sha512sums="26147099e1f1a0ffc85febad26e18e991f019599a150887ea0b925e34663fad8e03b3c2a941e2770c1a63960695e173ef32709572c9361e7f2cb862ccf75b28a  Python-3.6.10.tar.xz
 ab8eaa2858d5109049b1f9f553198d40e0ef8d78211ad6455f7b491af525bffb16738fed60fc84e960c4889568d25753b9e4a1494834fea48291b33f07000ec2  musl-find_library.patch
 37b6ee5d0d5de43799316aa111423ba5a666c17dc7f81b04c330f59c1d1565540eac4c585abe2199bbed52ebe7426001edb1c53bd0a17486a2a8e052d0f494ad  fix-xattrs-glibc.patch
-1f1eb61355eb7832bef8e9c3915895cc3b2966a30c809371430b4416260452cd39c48ba593b2259574867bd1e8fea98efbc45c4b0bd95aeb0690c8514b380ea0  CVE-2019-16056.patch
-7f94d887c81f79d90afd4a9621547c13cbdd0232250f62a686b26a63160a4d286a6db9b342d06b9b63af64f994835b489c37bab499a2093c3c2585dc7a04d8a1  CVE-2019-16935.patch"
+7a15409165feb60358455b711f978b7b1c4dea9ad53aa7b5be07c1f70262988e592e7a630f83125f37051bbed14d14b66d2acd775234a163ff5b048621b9a59c  CVE-2019-18348.patch"
diff --git a/system/python3/CVE-2019-16056.patch b/system/python3/CVE-2019-16056.patch
deleted file mode 100644
index b2f5ce82696531b51718015e9975b69ca732bf3f..0000000000000000000000000000000000000000
--- a/system/python3/CVE-2019-16056.patch
+++ /dev/null
@@ -1,131 +0,0 @@
-From 13a19139b5e76175bc95294d54afc9425e4f36c9 Mon Sep 17 00:00:00 2001
-From: "Miss Islington (bot)"
- <31488909+miss-islington@users.noreply.github.com>
-Date: Fri, 9 Aug 2019 08:22:19 -0700
-Subject: [PATCH] bpo-34155: Dont parse domains containing @ (GH-13079)
- (GH-14826)
-
-Before:
-
-        >>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses
-        (Address(display_name='', username='a', domain='malicious.org'),)
-
-        >>> parseaddr('a@malicious.org@important.com')
-        ('', 'a@malicious.org')
-
-    After:
-
-        >>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses
-        (Address(display_name='', username='', domain=''),)
-
-        >>> parseaddr('a@malicious.org@important.com')
-        ('', 'a@')
-
-https://bugs.python.org/issue34155
-(cherry picked from commit 8cb65d1381b027f0b09ee36bfed7f35bb4dec9a9)
-
-Co-authored-by: jpic <jpic@users.noreply.github.com>
----
- Lib/email/_header_value_parser.py                  |  2 ++
- Lib/email/_parseaddr.py                            | 11 ++++++++++-
- Lib/test/test_email/test__header_value_parser.py   | 10 ++++++++++
- Lib/test/test_email/test_email.py                  | 14 ++++++++++++++
- .../2019-05-04-13-33-37.bpo-34155.MJll68.rst       |  1 +
- 5 files changed, 37 insertions(+), 1 deletion(-)
- create mode 100644 Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
-
-diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py
-index 737951e4b1b1..bc9c9b6241d4 100644
---- a/Lib/email/_header_value_parser.py
-+++ b/Lib/email/_header_value_parser.py
-@@ -1561,6 +1561,8 @@ def get_domain(value):
-         token, value = get_dot_atom(value)
-     except errors.HeaderParseError:
-         token, value = get_atom(value)
-+    if value and value[0] == '@':
-+        raise errors.HeaderParseError('Invalid Domain')
-     if leader is not None:
-         token[:0] = [leader]
-     domain.append(token)
-diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
-index cdfa3729adc7..41ff6f8c000d 100644
---- a/Lib/email/_parseaddr.py
-+++ b/Lib/email/_parseaddr.py
-@@ -379,7 +379,12 @@ def getaddrspec(self):
-         aslist.append('@')
-         self.pos += 1
-         self.gotonext()
--        return EMPTYSTRING.join(aslist) + self.getdomain()
-+        domain = self.getdomain()
-+        if not domain:
-+            # Invalid domain, return an empty address instead of returning a
-+            # local part to denote failed parsing.
-+            return EMPTYSTRING
-+        return EMPTYSTRING.join(aslist) + domain
- 
-     def getdomain(self):
-         """Get the complete domain name from an address."""
-@@ -394,6 +399,10 @@ def getdomain(self):
-             elif self.field[self.pos] == '.':
-                 self.pos += 1
-                 sdlist.append('.')
-+            elif self.field[self.pos] == '@':
-+                # bpo-34155: Don't parse domains with two `@` like
-+                # `a@malicious.org@important.com`.
-+                return EMPTYSTRING
-             elif self.field[self.pos] in self.atomends:
-                 break
-             else:
-diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py
-index a2c900fa7fd2..02ef3e1006c6 100644
---- a/Lib/test/test_email/test__header_value_parser.py
-+++ b/Lib/test/test_email/test__header_value_parser.py
-@@ -1418,6 +1418,16 @@ def test_get_addr_spec_dot_atom(self):
-         self.assertEqual(addr_spec.domain, 'example.com')
-         self.assertEqual(addr_spec.addr_spec, 'star.a.star@example.com')
- 
-+    def test_get_addr_spec_multiple_domains(self):
-+        with self.assertRaises(errors.HeaderParseError):
-+            parser.get_addr_spec('star@a.star@example.com')
-+
-+        with self.assertRaises(errors.HeaderParseError):
-+            parser.get_addr_spec('star@a@example.com')
-+
-+        with self.assertRaises(errors.HeaderParseError):
-+            parser.get_addr_spec('star@172.17.0.1@example.com')
-+
-     # get_obs_route
- 
-     def test_get_obs_route_simple(self):
-diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
-index f97ccc6711cc..68d052279987 100644
---- a/Lib/test/test_email/test_email.py
-+++ b/Lib/test/test_email/test_email.py
-@@ -3035,6 +3035,20 @@ def test_parseaddr_empty(self):
-         self.assertEqual(utils.parseaddr('<>'), ('', ''))
-         self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '')
- 
-+    def test_parseaddr_multiple_domains(self):
-+        self.assertEqual(
-+            utils.parseaddr('a@b@c'),
-+            ('', '')
-+        )
-+        self.assertEqual(
-+            utils.parseaddr('a@b.c@c'),
-+            ('', '')
-+        )
-+        self.assertEqual(
-+            utils.parseaddr('a@172.17.0.1@c'),
-+            ('', '')
-+        )
-+
-     def test_noquote_dump(self):
-         self.assertEqual(
-             utils.formataddr(('A Silly Person', 'person@dom.ain')),
-diff --git a/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
-new file mode 100644
-index 000000000000..50292e29ed1d
---- /dev/null
-+++ b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
-@@ -0,0 +1 @@
-+Fix parsing of invalid email addresses with more than one ``@`` (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email address. Patch by maxking & jpic.
diff --git a/system/python3/CVE-2019-16935.patch b/system/python3/CVE-2019-16935.patch
deleted file mode 100644
index 567eb90fca3dbeb604e9201777f1852d1a96c609..0000000000000000000000000000000000000000
--- a/system/python3/CVE-2019-16935.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 1698cacfb924d1df452e78d11a4bf81ae7777389 Mon Sep 17 00:00:00 2001
-From: Victor Stinner <vstinner@redhat.com>
-Date: Sat, 28 Sep 2019 09:33:00 +0200
-Subject: [PATCH] bpo-38243, xmlrpc.server: Escape the server_title (GH-16373)
- (GH-16441)
-
-Escape the server title of xmlrpc.server.DocXMLRPCServer
-when rendering the document page as HTML.
-
-(cherry picked from commit e8650a4f8c7fb76f570d4ca9c1fbe44e91c8dfaa)
----
- Lib/test/test_docxmlrpc.py                       | 16 ++++++++++++++++
- Lib/xmlrpc/server.py                             |  3 ++-
- .../2019-09-25-13-21-09.bpo-38243.1pfz24.rst     |  3 +++
- 3 files changed, 21 insertions(+), 1 deletion(-)
- create mode 100644 Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
-
-diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py
-index 00903337c07c2..d2adb21af0fb3 100644
---- a/Lib/test/test_docxmlrpc.py
-+++ b/Lib/test/test_docxmlrpc.py
-@@ -1,5 +1,6 @@
- from xmlrpc.server import DocXMLRPCServer
- import http.client
-+import re
- import sys
- from test import support
- threading = support.import_module('threading')
-@@ -193,6 +194,21 @@ def test_annotations(self):
-              b'method_annotation</strong></a>(x: bytes)</dt></dl>'),
-             response.read())
- 
-+    def test_server_title_escape(self):
-+        # bpo-38243: Ensure that the server title and documentation
-+        # are escaped for HTML.
-+        self.serv.set_server_title('test_title<script>')
-+        self.serv.set_server_documentation('test_documentation<script>')
-+        self.assertEqual('test_title<script>', self.serv.server_title)
-+        self.assertEqual('test_documentation<script>',
-+                self.serv.server_documentation)
-+
-+        generated = self.serv.generate_html_documentation()
-+        title = re.search(r'<title>(.+?)</title>', generated).group()
-+        documentation = re.search(r'<p><tt>(.+?)</tt></p>', generated).group()
-+        self.assertEqual('<title>Python: test_title&lt;script&gt;</title>', title)
-+        self.assertEqual('<p><tt>test_documentation&lt;script&gt;</tt></p>', documentation)
-+
- 
- if __name__ == '__main__':
-     unittest.main()
-diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py
-index 3e0dca027f068..efe593748968c 100644
---- a/Lib/xmlrpc/server.py
-+++ b/Lib/xmlrpc/server.py
-@@ -106,6 +106,7 @@ def export_add(self, x, y):
- 
- from xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode
- from http.server import BaseHTTPRequestHandler
-+import html
- import http.server
- import socketserver
- import sys
-@@ -904,7 +905,7 @@ def generate_html_documentation(self):
-                                 methods
-                             )
- 
--        return documenter.page(self.server_title, documentation)
-+        return documenter.page(html.escape(self.server_title), documentation)
- 
- class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
-     """XML-RPC and documentation request handler class.
-diff --git a/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst b/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
-new file mode 100644
-index 0000000000000..98d7be129573a
---- /dev/null
-+++ b/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
-@@ -0,0 +1,3 @@
-+Escape the server title of :class:`xmlrpc.server.DocXMLRPCServer`
-+when rendering the document page as HTML.
-+(Contributed by Dong-hee Na in :issue:`38243`.)
diff --git a/system/python3/CVE-2019-18348.patch b/system/python3/CVE-2019-18348.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9ebb963a84b7e8ae87d6b415ba522825357d73de
--- /dev/null
+++ b/system/python3/CVE-2019-18348.patch
@@ -0,0 +1,147 @@
+From 83fc70159b24f5b11a5ef87c9b05c2cf4c7faeba Mon Sep 17 00:00:00 2001
+From: "Miss Islington (bot)"
+ <31488909+miss-islington@users.noreply.github.com>
+Date: Sat, 14 Mar 2020 15:35:52 -0700
+Subject: [PATCH] bpo-38576: Disallow control characters in hostnames in
+ http.client (GH-18995) (GH-19002)
+
+Add host validation for control characters for more CVE-2019-18348 protection.
+(cherry picked from commit 9165addc22d05e776a54319a8531ebd0b2fe01ef)
+
+Co-authored-by: Ashwin Ramaswami <aramaswamis@gmail.com>
+---
+ Lib/http/client.py                            | 10 ++++++
+ Lib/test/test_httplib.py                      | 13 ++++++-
+ Lib/test/test_urllib.py                       | 36 +++++++++++++++++--
+ .../2020-03-14-14-57-44.bpo-38576.OowwQn.rst  |  1 +
+ 4 files changed, 57 insertions(+), 3 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/Security/2020-03-14-14-57-44.bpo-38576.OowwQn.rst
+
+diff --git a/Lib/http/client.py b/Lib/http/client.py
+index d4821f1a96e07..c0ac7db6f40a0 100644
+--- a/Lib/http/client.py
++++ b/Lib/http/client.py
+@@ -858,6 +858,8 @@ def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
+ 
+         (self.host, self.port) = self._get_hostport(host, port)
+ 
++        self._validate_host(self.host)
++
+         # This is stored as an instance variable to allow unit
+         # tests to replace it with a suitable mockup
+         self._create_connection = socket.create_connection
+@@ -1215,6 +1217,14 @@ def _validate_path(self, url):
+             raise InvalidURL(f"URL can't contain control characters. {url!r} "
+                              f"(found at least {match.group()!r})")
+ 
++    def _validate_host(self, host):
++        """Validate a host so it doesn't contain control characters."""
++        # Prevent CVE-2019-18348.
++        match = _contains_disallowed_url_pchar_re.search(host)
++        if match:
++            raise InvalidURL(f"URL can't contain control characters. {host!r} "
++                             f"(found at least {match.group()!r})")
++
+     def putheader(self, header, *values):
+         """Send a request header line to the server.
+ 
+diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
+index 14d42d483773c..fcd9231666ede 100644
+--- a/Lib/test/test_httplib.py
++++ b/Lib/test/test_httplib.py
+@@ -1132,7 +1132,7 @@ def run_server():
+         thread.join()
+         self.assertEqual(result, b"proxied data\n")
+ 
+-    def test_putrequest_override_validation(self):
++    def test_putrequest_override_domain_validation(self):
+         """
+         It should be possible to override the default validation
+         behavior in putrequest (bpo-38216).
+@@ -1145,6 +1145,17 @@ def _validate_path(self, url):
+         conn.sock = FakeSocket('')
+         conn.putrequest('GET', '/\x00')
+ 
++    def test_putrequest_override_host_validation(self):
++        class UnsafeHTTPConnection(client.HTTPConnection):
++            def _validate_host(self, url):
++                pass
++
++        conn = UnsafeHTTPConnection('example.com\r\n')
++        conn.sock = FakeSocket('')
++        # set skip_host so a ValueError is not raised upon adding the
++        # invalid URL as the value of the "Host:" header
++        conn.putrequest('GET', '/', skip_host=1)
++
+     def test_putrequest_override_encoding(self):
+         """
+         It should be possible to override the default encoding
+diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py
+index 0061a5297cb35..ddf425fd8d4b5 100644
+--- a/Lib/test/test_urllib.py
++++ b/Lib/test/test_urllib.py
+@@ -331,7 +331,7 @@ def test_willclose(self):
+             self.unfakehttp()
+ 
+     @unittest.skipUnless(ssl, "ssl module required")
+-    def test_url_with_control_char_rejected(self):
++    def test_url_path_with_control_char_rejected(self):
+         for char_no in list(range(0, 0x21)) + [0x7f]:
+             char = chr(char_no)
+             schemeless_url = f"//localhost:7777/test{char}/"
+@@ -358,7 +358,7 @@ def test_url_with_control_char_rejected(self):
+                 self.unfakehttp()
+ 
+     @unittest.skipUnless(ssl, "ssl module required")
+-    def test_url_with_newline_header_injection_rejected(self):
++    def test_url_path_with_newline_header_injection_rejected(self):
+         self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.")
+         host = "localhost:7777?a=1 HTTP/1.1\r\nX-injected: header\r\nTEST: 123"
+         schemeless_url = "//" + host + ":8080/test/?test=a"
+@@ -383,6 +383,38 @@ def test_url_with_newline_header_injection_rejected(self):
+         finally:
+             self.unfakehttp()
+ 
++    @unittest.skipUnless(ssl, "ssl module required")
++    def test_url_host_with_control_char_rejected(self):
++        for char_no in list(range(0, 0x21)) + [0x7f]:
++            char = chr(char_no)
++            schemeless_url = f"//localhost{char}/test/"
++            self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.")
++            try:
++                escaped_char_repr = repr(char).replace('\\', r'\\')
++                InvalidURL = http.client.InvalidURL
++                with self.assertRaisesRegex(
++                    InvalidURL, f"contain control.*{escaped_char_repr}"):
++                    urlopen(f"http:{schemeless_url}")
++                with self.assertRaisesRegex(InvalidURL, f"contain control.*{escaped_char_repr}"):
++                    urlopen(f"https:{schemeless_url}")
++            finally:
++                self.unfakehttp()
++
++    @unittest.skipUnless(ssl, "ssl module required")
++    def test_url_host_with_newline_header_injection_rejected(self):
++        self.fakehttp(b"HTTP/1.1 200 OK\r\n\r\nHello.")
++        host = "localhost\r\nX-injected: header\r\n"
++        schemeless_url = "//" + host + ":8080/test/?test=a"
++        try:
++            InvalidURL = http.client.InvalidURL
++            with self.assertRaisesRegex(
++                InvalidURL, r"contain control.*\\r"):
++                urlopen(f"http:{schemeless_url}")
++            with self.assertRaisesRegex(InvalidURL, r"contain control.*\\n"):
++                urlopen(f"https:{schemeless_url}")
++        finally:
++            self.unfakehttp()
++
+     def test_read_0_9(self):
+         # "0.9" response accepted (but not "simple responses" without
+         # a status line)
+diff --git a/Misc/NEWS.d/next/Security/2020-03-14-14-57-44.bpo-38576.OowwQn.rst b/Misc/NEWS.d/next/Security/2020-03-14-14-57-44.bpo-38576.OowwQn.rst
+new file mode 100644
+index 0000000000000..34b8af28988fa
+--- /dev/null
++++ b/Misc/NEWS.d/next/Security/2020-03-14-14-57-44.bpo-38576.OowwQn.rst
+@@ -0,0 +1 @@
++Disallow control characters in hostnames in http.client, addressing CVE-2019-18348. Such potentially malicious header injection URLs now cause a InvalidURL to be raised.
+\ No newline at end of file
diff --git a/system/sqlite/APKBUILD b/system/sqlite/APKBUILD
index 0a3e367c1a79d65e8c8bd21a2780181f5e285ed5..e8db13ba07587bd69d6ea758d693381c50afeb84 100644
--- a/system/sqlite/APKBUILD
+++ b/system/sqlite/APKBUILD
@@ -1,20 +1,37 @@
 # Contributor: Łukasz Jendrysik <scadu@yandex.com>
 # Maintainer: A. Wilcox <awilfox@adelielinux.org>
 pkgname=sqlite
-pkgver=3.30.1
+pkgver=3.31.1
 _pkgver=${pkgver%.*}0${pkgver#*.*.}00
 _pkgver=${_pkgver%.*}${_pkgver#*.}
 pkgrel=0
 pkgdesc="C library that implements an SQL database engine"
 url="https://sqlite.org/"
 arch="all"
+options="!check"  # Test suite requires tcl - circular dependency
 license="Public-Domain"
 depends=""
 makedepends="libedit-dev zlib-dev"
-source="https://sqlite.org/2019/$pkgname-autoconf-$_pkgver.tar.gz"
+source="https://sqlite.org/2020/$pkgname-autoconf-$_pkgver.tar.gz"
 subpackages="$pkgname-doc $pkgname-dev $pkgname-libs"
 builddir="$srcdir/$pkgname-autoconf-$_pkgver"
 
+# secfixes:
+#   3.31.1-r0:
+#     - CVE-2019-19242
+#     - CVE-2019-19244
+#     - CVE-2019-19317
+#     - CVE-2019-19603
+#     - CVE-2019-19645
+#     - CVE-2019-19646
+#     - CVE-2019-19880
+#     - CVE-2019-19923
+#     - CVE-2019-19924
+#     - CVE-2019-19925
+#     - CVE-2019-19926
+#     - CVE-2019-19959
+#     - CVE-2019-20218
+
 build() {
 	local _amalgamation="-DSQLITE_ENABLE_FTS4 \
 	-DSQLITE_ENABLE_FTS3 \
@@ -61,4 +78,4 @@ libs() {
 	mv "$pkgdir"/usr/lib "$subpkgdir"/usr/
 }
 
-sha512sums="9ec0283c417fb0323b0e43550af2a49e9a63988e4212c27ea62cc9da3534caa6faf5bdc7e051b6772c4ce61560a433b3d3288b68e05e9ba8495f61a3bcebda3e  sqlite-autoconf-3300100.tar.gz"
+sha512sums="d85250ba5f78f0c918880f663741709aba662192f04888b2324a0df17affdf5b8540e8428c6c7315119806e7adad758ea281c9b403c0ad94ac6a9bd1b93fd617  sqlite-autoconf-3310100.tar.gz"
diff --git a/user/libvncserver/APKBUILD b/user/libvncserver/APKBUILD
index 2b42311c22da541218248d2a7d31eb01a7e233b1..7058ad208d9c5f891cf10a696fc16e44d642d7bf 100644
--- a/user/libvncserver/APKBUILD
+++ b/user/libvncserver/APKBUILD
@@ -3,7 +3,7 @@
 # Maintainer: A. Wilcox <awilfox@adelielinux.org>
 pkgname=libvncserver
 pkgver=0.9.12
-pkgrel=0
+pkgrel=1
 pkgdesc="Library to make writing a vnc server easy"
 url="https://libvnc.github.io/"
 arch="all"
@@ -15,7 +15,10 @@ depends_dev="libgcrypt-dev libjpeg-turbo-dev gnutls-dev libpng-dev
 makedepends="$depends_dev cmake"
 subpackages="$pkgname-dev"
 source="https://github.com/LibVNC/libvncserver/archive/LibVNCServer-$pkgver.tar.gz
-	CVE-2018-15127.patch"
+	CVE-2018-15127.patch
+	CVE-2019-15681.patch
+	CVE-2019-15690.patch
+	"
 builddir="$srcdir"/libvncserver-LibVNCServer-$pkgver
 
 # secfixes:
@@ -24,6 +27,9 @@ builddir="$srcdir"/libvncserver-LibVNCServer-$pkgver
 #     - CVE-2016-9942
 #   0.9.12-r0:
 #     - CVE-2018-15127
+#   0.9.12-r1:
+#     - CVE-2019-15681
+#     - CVE-2019-15690
 
 build() {
 	if [ "$CBUILD" != "$CHOST" ]; then
@@ -49,4 +55,6 @@ package() {
 }
 
 sha512sums="60ff1cc93a937d6f8f97449bc58b763095846207112f7b1b3c43eb2d74448b595d6da949903a764bd484ee54e38ff6277e882adbe965dd6d26ba15ef6ff6fcb8  LibVNCServer-0.9.12.tar.gz
-8b5b6742e6c3a181c60652484b15ec42cc0a3acc1e82cef38e82b61f43f1de456d09731976f4e5dfab44abf3e551e22aaf4300cb8418cd8e136d705fcb2a7dbe  CVE-2018-15127.patch"
+8b5b6742e6c3a181c60652484b15ec42cc0a3acc1e82cef38e82b61f43f1de456d09731976f4e5dfab44abf3e551e22aaf4300cb8418cd8e136d705fcb2a7dbe  CVE-2018-15127.patch
+5ecb5a26813f3f07440ef6c54eebaca4e9b4f7c1cf2ba13375e3b23b950a9b818d068d4eef5532d7ea4d7ae084c4356af7257c45426101ff51afe2b7da338a1f  CVE-2019-15681.patch
+52f62a65c3e91b7c7a11b5ad6e1432d697e1314bf6c938b5cb0c9cc8bdffbf1c25612c33e05282c11d59c6523e208b882f963fca8bcd34a5c72dd476427e7542  CVE-2019-15690.patch"
diff --git a/user/libvncserver/CVE-2019-15681.patch b/user/libvncserver/CVE-2019-15681.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e328d87920dc5896116d5288062e9f7338825e18
--- /dev/null
+++ b/user/libvncserver/CVE-2019-15681.patch
@@ -0,0 +1,23 @@
+From d01e1bb4246323ba6fcee3b82ef1faa9b1dac82a Mon Sep 17 00:00:00 2001
+From: Christian Beier <dontmind@freeshell.org>
+Date: Mon, 19 Aug 2019 22:32:25 +0200
+Subject: [PATCH] rfbserver: don't leak stack memory to the remote
+
+Thanks go to Pavel Cheremushkin of Kaspersky for reporting.
+---
+ libvncserver/rfbserver.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/libvncserver/rfbserver.c b/libvncserver/rfbserver.c
+index 3bacc891..310e5487 100644
+--- a/libvncserver/rfbserver.c
++++ b/libvncserver/rfbserver.c
+@@ -3724,6 +3724,8 @@ rfbSendServerCutText(rfbScreenInfoPtr rfbScreen,char *str, int len)
+     rfbServerCutTextMsg sct;
+     rfbClientIteratorPtr iterator;
+ 
++    memset((char *)&sct, 0, sizeof(sct));
++
+     iterator = rfbGetClientIterator(rfbScreen);
+     while ((cl = rfbClientIteratorNext(iterator)) != NULL) {
+         sct.type = rfbServerCutText;
diff --git a/user/libvncserver/CVE-2019-15690.patch b/user/libvncserver/CVE-2019-15690.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7fe36e45466566099524e93e3e84b4487c094a2b
--- /dev/null
+++ b/user/libvncserver/CVE-2019-15690.patch
@@ -0,0 +1,36 @@
+From 54220248886b5001fbbb9fa73c4e1a2cb9413fed Mon Sep 17 00:00:00 2001
+From: Christian Beier <dontmind@freeshell.org>
+Date: Sun, 17 Nov 2019 17:18:35 +0100
+Subject: [PATCH] libvncclient/cursor: limit width/height input values
+
+Avoids a possible heap overflow reported by Pavel Cheremushkin
+<Pavel.Cheremushkin@kaspersky.com>.
+
+re #275
+---
+ libvncclient/cursor.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/libvncclient/cursor.c b/libvncclient/cursor.c
+index 67f45726..40ffb3b0 100644
+--- a/libvncclient/cursor.c
++++ b/libvncclient/cursor.c
+@@ -28,6 +28,8 @@
+ #define OPER_SAVE     0
+ #define OPER_RESTORE  1
+ 
++#define MAX_CURSOR_SIZE 1024
++
+ #define RGB24_TO_PIXEL(bpp,r,g,b)                                       \
+    ((((uint##bpp##_t)(r) & 0xFF) * client->format.redMax + 127) / 255             \
+     << client->format.redShift |                                              \
+@@ -54,6 +56,9 @@ rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int h
+   if (width * height == 0)
+     return TRUE;
+ 
++  if (width >= MAX_CURSOR_SIZE || height >= MAX_CURSOR_SIZE)
++    return FALSE;
++
+   /* Allocate memory for pixel data and temporary mask data. */
+   if(client->rcSource)
+     free(client->rcSource);
diff --git a/user/okular/APKBUILD b/user/okular/APKBUILD
index f77196baef002206cbef48edc470a3968a309e1b..4e9567438e0a1bf4fdb68ce9c9399ef386207233 100644
--- a/user/okular/APKBUILD
+++ b/user/okular/APKBUILD
@@ -2,7 +2,7 @@
 # Maintainer: A. Wilcox <awilfox@adelielinux.org>
 pkgname=okular
 pkgver=19.12.3
-pkgrel=0
+pkgrel=1
 pkgdesc="Universal document reader developed by KDE"
 url="https://okular.kde.org/"
 arch="all"
@@ -18,8 +18,13 @@ makedepends="cmake extra-cmake-modules qt5-qtbase-dev qt5-qtsvg-dev kconfig-dev
 subpackages="$pkgname-doc $pkgname-lang"
 source="https://download.kde.org/stable/release-service/$pkgver/src/okular-$pkgver.tar.xz
 	es-doc-fix.patch
+	CVE-2020-9359.patch
 	"
 
+# secfixes:
+#   19.12.3-r1:
+#     - CVE-2020-9359
+
 build() {
 	if [ "$CBUILD" != "$CHOST" ]; then
 		CMAKE_CROSSOPTS="-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_HOST_SYSTEM_NAME=Linux"
@@ -45,4 +50,5 @@ package() {
 }
 
 sha512sums="ccc3c357fefe04691bba7bc803321789c3a1fdad4cfc610e9c425b2373efd94340fa2ceb2e357569ad14f1c0c69ef0db8079d9bc082a6d5708ccbfb3b65d8b3d  okular-19.12.3.tar.xz
-de32eabda7ee84c4d894b02c56c7d66d8e2332688c726ad95e1b61c1e730035081ff7721275c7b7a9884aabc268ee0115d9ab8e5f52ae8838e1c09c471c81932  es-doc-fix.patch"
+de32eabda7ee84c4d894b02c56c7d66d8e2332688c726ad95e1b61c1e730035081ff7721275c7b7a9884aabc268ee0115d9ab8e5f52ae8838e1c09c471c81932  es-doc-fix.patch
+02b27bd206006dbbafbe74e60665ad5159ef6ea32b8bf1526b9c655c046cb6de08630f28d64c9935e73d5707a30d0835f2ab8cd4521740e5236cefc3d3057d29  CVE-2020-9359.patch"
diff --git a/user/okular/CVE-2020-9359.patch b/user/okular/CVE-2020-9359.patch
new file mode 100644
index 0000000000000000000000000000000000000000..34ff3e2ce3edc521ecbf703a33d64f75c483bf9c
--- /dev/null
+++ b/user/okular/CVE-2020-9359.patch
@@ -0,0 +1,27 @@
+From 6a93a033b4f9248b3cd4d04689b8391df754e244 Mon Sep 17 00:00:00 2001
+From: Albert Astals Cid <aacid@kde.org>
+Date: Tue, 10 Mar 2020 23:07:24 +0100
+Subject: [PATCH] Document::processAction: If the url points to a binary, don't
+ run it
+
+---
+ core/document.cpp | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/core/document.cpp b/core/document.cpp
+index 3215a1abc..0aa5b6980 100644
+--- a/core/document.cpp
++++ b/core/document.cpp
+@@ -4388,7 +4388,8 @@ void Document::processAction( const Action * action )
+                 {
+                     const QUrl realUrl = KIO::upUrl(d->m_url).resolved(url);
+                     // KRun autodeletes
+-                    new KRun( realUrl, d->m_widget );
++                    KRun *r = new KRun( realUrl, d->m_widget );
++                    r->setRunExecutables(false);
+                 }
+             }
+             } break;
+-- 
+2.25.2
+
diff --git a/user/py3-pillow/APKBUILD b/user/py3-pillow/APKBUILD
index 8012a6fe21648129e0a0d9260e448814cb94b8e6..bb4878256daf0250a486e7a9bd16005b382c14de 100644
--- a/user/py3-pillow/APKBUILD
+++ b/user/py3-pillow/APKBUILD
@@ -4,7 +4,7 @@ pkgname=py3-pillow
 _pkgname=Pillow
 _p="${_pkgname#?}"
 _p="${_pkgname%"$_p"}"
-pkgver=6.2.1
+pkgver=6.2.2
 pkgrel=0
 pkgdesc="A Python Imaging Library"
 url="https://pypi.org/project/Pillow"
@@ -20,6 +20,14 @@ source="$pkgname-$pkgver.tar.gz::https://files.pythonhosted.org/packages/source/
 	https://dev.sick.bike/dist/$pkgname-scripts-$_scripts_rev.tar.gz"
 builddir="$srcdir/$_pkgname-$pkgver"
 
+# secfixes: pillow
+#   6.2.2-r0:
+#     - CVE-2019-19911
+#     - CVE-2020-5310
+#     - CVE-2020-5311
+#     - CVE-2020-5312
+#     - CVE-2020-5313
+
 unpack() {
 	default_unpack
 	mv pillow-scripts-*/Scripts "$builddir/Scripts"
@@ -49,5 +57,5 @@ doc() {
 	install -Dm644 "$builddir"/LICENSE "$subpkgdir/usr/share/licenses/$pkgname/LICENSE"
 }
 
-sha512sums="757bfdab2ba418195e96e696d2d111de3b38b6bafe4f6f94012f024f59c9bc8542fdab54f643eaf7b2867a9214db806e72eecbdd636bfceb55b47d3164f643ec  py3-pillow-6.2.1.tar.gz
+sha512sums="517c971d4fb23a47466a7e8326c8c29291f7832d4521001c1898d6223ea25d4b0a8b7c8f7e78dd706f421229a8261b558b9fbdc43e47a0a2a7b2b4bbc1a21eff  py3-pillow-6.2.2.tar.gz
 c01e83a7cef6653a33f60acbcbc737f0d40ff0dbc792ce0b2ce52f21092d3071845830fa0f64b27a1c5e679c53df57e0ec2e89867ee717f938d4e6f19db77790  py3-pillow-scripts-b24479c.tar.gz"
diff --git a/user/py3-twisted/APKBUILD b/user/py3-twisted/APKBUILD
index 37f2b097672bd3b96f42b8a14811aac11130771d..4080810529524c083645537ac46ff1cf77781f3a 100644
--- a/user/py3-twisted/APKBUILD
+++ b/user/py3-twisted/APKBUILD
@@ -4,18 +4,31 @@ pkgname=py3-twisted
 _pkgname=Twisted
 _p="${_pkgname#?}"
 _p="${_pkgname%"$_p"}"
-pkgver=19.7.0
+pkgver=19.10.0
 pkgrel=0
 pkgdesc="Asynchronous networking framework written in Python"
 url="https://twistedmatrix.com/"
 arch="all"
+# FIXME: constantly, automat, hyperlink, and PyHamcrest
+# also need to be packaged and added to depends=
+options="net"
 license="MIT"
-depends="python3 py3-incremental"
+depends="python3 py3-attrs py3-incremental py3-zope-interface"
 makedepends="python3-dev"
 subpackages=""
-source="https://files.pythonhosted.org/packages/source/$_p/$_pkgname/$_pkgname-$pkgver.tar.bz2"
+source="https://files.pythonhosted.org/packages/source/$_p/$_pkgname/$_pkgname-$pkgver.tar.bz2
+	CVE-2020-10108-and-2020-10109.patch
+	"
 builddir="$srcdir/Twisted-$pkgver"
 
+# secfixes: twisted
+#   19.10.0-r0:
+#     - CVE-2019-9512
+#     - CVE-2019-9514
+#     - CVE-2019-9515
+#     - CVE-2020-10108
+#     - CVE-2020-10109
+
 build() {
 	python3 setup.py build
 }
@@ -28,4 +41,5 @@ package() {
 	python3 setup.py install --prefix=/usr --root="$pkgdir"
 }
 
-sha512sums="46588008f0be63f9ec8cfb88bb81f4268e59e8dead8256c36144b521eb3e58726f4d8c9016b7157365b26929e39a3fa6ff2cc2a9f83e8cfa7f1acc43d31297c4  Twisted-19.7.0.tar.bz2"
+sha512sums="de8d7fd0b2081cebeff68b060c8469377011648bc563a94a993d3530fb007ed42c3a54925c9a10c465ee7a3065cc9108ace12d10d358223fab13494becb9ac4b  Twisted-19.10.0.tar.bz2
+dcc22af0a72bce5cca3c9f5ee739b17f14275ac8e776c658743746239c793ad9585fb0333203945912fd4994bd001b7244905562c4389304a707a2a4430faa40  CVE-2020-10108-and-2020-10109.patch"
diff --git a/user/py3-twisted/CVE-2020-10108-and-2020-10109.patch b/user/py3-twisted/CVE-2020-10108-and-2020-10109.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9a58f55840524c101cfe48f588d43957b25b4453
--- /dev/null
+++ b/user/py3-twisted/CVE-2020-10108-and-2020-10109.patch
@@ -0,0 +1,260 @@
+From 4a7d22e490bb8ff836892cc99a1f54b85ccb0281 Mon Sep 17 00:00:00 2001
+From: Mark Williams <mrw@enotuniq.org>
+Date: Sun, 16 Feb 2020 19:00:10 -0800
+Subject: [PATCH] Fix several request smuggling attacks.
+
+1. Requests with multiple Content-Length headers were allowed (thanks
+to Jake Miller from Bishop Fox and ZeddYu Lu) and now fail with a 400;
+
+2. Requests with a Content-Length header and a Transfer-Encoding
+header honored the first header (thanks to Jake Miller from Bishop
+Fox) and now fail with a 400;
+
+3. Requests whose Transfer-Encoding header had a value other than
+"chunked" and "identity" (thanks to ZeddYu Lu) were allowed and now fail
+with a 400.
+---
+ src/twisted/web/http.py                   |  64 +++++++---
+ src/twisted/web/newsfragments/9770.bugfix |   1 +
+ src/twisted/web/test/test_http.py         | 137 ++++++++++++++++++++++
+ 3 files changed, 187 insertions(+), 15 deletions(-)
+ create mode 100644 src/twisted/web/newsfragments/9770.bugfix
+
+diff --git a/src/twisted/web/http.py b/src/twisted/web/http.py
+index f0fb05b4d69..06d830fe30f 100644
+--- a/src/twisted/web/http.py
++++ b/src/twisted/web/http.py
+@@ -2171,6 +2171,51 @@ def _finishRequestBody(self, data):
+         self.allContentReceived()
+         self._dataBuffer.append(data)
+ 
++    def _maybeChooseTransferDecoder(self, header, data):
++        """
++        If the provided header is C{content-length} or
++        C{transfer-encoding}, choose the appropriate decoder if any.
++
++        Returns L{True} if the request can proceed and L{False} if not.
++        """
++
++        def fail():
++            self._respondToBadRequestAndDisconnect()
++            self.length = None
++
++        # Can this header determine the length?
++        if header == b'content-length':
++            try:
++                length = int(data)
++            except ValueError:
++                fail()
++                return False
++            newTransferDecoder = _IdentityTransferDecoder(
++                length, self.requests[-1].handleContentChunk, self._finishRequestBody)
++        elif header == b'transfer-encoding':
++            # XXX Rather poorly tested code block, apparently only exercised by
++            # test_chunkedEncoding
++            if data.lower() == b'chunked':
++                length = None
++                newTransferDecoder = _ChunkedTransferDecoder(
++                    self.requests[-1].handleContentChunk, self._finishRequestBody)
++            elif data.lower() == b'identity':
++                return True
++            else:
++                fail()
++                return False
++        else:
++            # It's not a length related header, so exit
++            return True
++
++        if self._transferDecoder is not None:
++            fail()
++            return False
++        else:
++            self.length = length
++            self._transferDecoder = newTransferDecoder
++            return True
++
+ 
+     def headerReceived(self, line):
+         """
+@@ -2196,21 +2241,10 @@ def headerReceived(self, line):
+ 
+         header = header.lower()
+         data = data.strip()
+-        if header == b'content-length':
+-            try:
+-                self.length = int(data)
+-            except ValueError:
+-                self._respondToBadRequestAndDisconnect()
+-                self.length = None
+-                return False
+-            self._transferDecoder = _IdentityTransferDecoder(
+-                self.length, self.requests[-1].handleContentChunk, self._finishRequestBody)
+-        elif header == b'transfer-encoding' and data.lower() == b'chunked':
+-            # XXX Rather poorly tested code block, apparently only exercised by
+-            # test_chunkedEncoding
+-            self.length = None
+-            self._transferDecoder = _ChunkedTransferDecoder(
+-                self.requests[-1].handleContentChunk, self._finishRequestBody)
++
++        if not self._maybeChooseTransferDecoder(header, data):
++            return False
++
+         reqHeaders = self.requests[-1].requestHeaders
+         values = reqHeaders.getRawHeaders(header)
+         if values is not None:
+diff --git a/src/twisted/web/newsfragments/9770.bugfix b/src/twisted/web/newsfragments/9770.bugfix
+new file mode 100644
+index 00000000000..4f1be97de8a
+--- /dev/null
++++ b/src/twisted/web/newsfragments/9770.bugfix
+@@ -0,0 +1 @@
++Fix several request smuggling attacks: requests with multiple Content-Length headers were allowed (thanks to Jake Miller from Bishop Fox and ZeddYu Lu) and now fail with a 400; requests with a Content-Length header and a Transfer-Encoding header honored the first header (thanks to Jake Miller from Bishop Fox) and now fail with a 400; requests whose Transfer-Encoding header had a value other than "chunked" and "identity" (thanks to ZeddYu Lu) were allowed and now fail a 400.
+\ No newline at end of file
+diff --git a/src/twisted/web/test/test_http.py b/src/twisted/web/test/test_http.py
+index 0a0db09b750..578cb500cda 100644
+--- a/src/twisted/web/test/test_http.py
++++ b/src/twisted/web/test/test_http.py
+@@ -2252,6 +2252,143 @@ def process(self):
+         self.flushLoggedErrors(AttributeError)
+ 
+ 
++    def assertDisconnectingBadRequest(self, request):
++        """
++        Assert that the given request bytes fail with a 400 bad
++        request without calling L{Request.process}.
++
++        @param request: A raw HTTP request
++        @type request: L{bytes}
++        """
++        class FailedRequest(http.Request):
++            processed = False
++            def process(self):
++                FailedRequest.processed = True
++
++        channel = self.runRequest(request, FailedRequest, success=False)
++        self.assertFalse(FailedRequest.processed, "Request.process called")
++        self.assertEqual(
++            channel.transport.value(),
++            b"HTTP/1.1 400 Bad Request\r\n\r\n")
++        self.assertTrue(channel.transport.disconnecting)
++
++
++    def test_duplicateContentLengths(self):
++        """
++        A request which includes multiple C{content-length} headers
++        fails with a 400 response without calling L{Request.process}.
++        """
++        self.assertRequestRejected([
++            b'GET /a HTTP/1.1',
++            b'Content-Length: 56',
++            b'Content-Length: 0',
++            b'Host: host.invalid',
++            b'',
++            b'',
++        ])
++
++
++    def test_duplicateContentLengthsWithPipelinedRequests(self):
++        """
++        Two pipelined requests, the first of which includes multiple
++        C{content-length} headers, trigger a 400 response without
++        calling L{Request.process}.
++        """
++        self.assertRequestRejected([
++            b'GET /a HTTP/1.1',
++            b'Content-Length: 56',
++            b'Content-Length: 0',
++            b'Host: host.invalid',
++            b'',
++            b'',
++            b'GET /a HTTP/1.1',
++            b'Host: host.invalid',
++            b'',
++            b'',
++        ])
++
++
++    def test_contentLengthAndTransferEncoding(self):
++        """
++        A request that includes both C{content-length} and
++        C{transfer-encoding} headers fails with a 400 response without
++        calling L{Request.process}.
++        """
++        self.assertRequestRejected([
++            b'GET /a HTTP/1.1',
++            b'Transfer-Encoding: chunked',
++            b'Content-Length: 0',
++            b'Host: host.invalid',
++            b'',
++            b'',
++        ])
++
++
++    def test_contentLengthAndTransferEncodingWithPipelinedRequests(self):
++        """
++        Two pipelined requests, the first of which includes both
++        C{content-length} and C{transfer-encoding} headers, triggers a
++        400 response without calling L{Request.process}.
++        """
++        self.assertRequestRejected([
++            b'GET /a HTTP/1.1',
++            b'Transfer-Encoding: chunked',
++            b'Content-Length: 0',
++            b'Host: host.invalid',
++            b'',
++            b'',
++            b'GET /a HTTP/1.1',
++            b'Host: host.invalid',
++            b'',
++            b'',
++        ])
++
++
++    def test_unknownTransferEncoding(self):
++        """
++        A request whose C{transfer-encoding} header includes a value
++        other than C{chunked} or C{identity} fails with a 400 response
++        without calling L{Request.process}.
++        """
++        self.assertRequestRejected([
++            b'GET /a HTTP/1.1',
++            b'Transfer-Encoding: unknown',
++            b'Host: host.invalid',
++            b'',
++            b'',
++        ])
++
++
++    def test_transferEncodingIdentity(self):
++        """
++        A request with a valid C{content-length} and a
++        C{transfer-encoding} whose value is C{identity} succeeds.
++        """
++        body = []
++
++        class SuccessfulRequest(http.Request):
++            processed = False
++            def process(self):
++                body.append(self.content.read())
++                self.setHeader(b'content-length', b'0')
++                self.finish()
++
++        request = b'''\
++GET / HTTP/1.1
++Host: host.invalid
++Content-Length: 2
++Transfer-Encoding: identity
++
++ok
++'''
++        channel = self.runRequest(request, SuccessfulRequest, False)
++        self.assertEqual(body, [b'ok'])
++        self.assertEqual(
++            channel.transport.value(),
++            b'HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n',
++        )
++
++
+ 
+ class QueryArgumentsTests(unittest.TestCase):
+     def testParseqs(self):
diff --git a/user/sox/APKBUILD b/user/sox/APKBUILD
index 31a5d4b1e96caf4facfbb1e560c2406626bf00d2..8e9fe9934a0427234e017033cf245d0da9db83b5 100644
--- a/user/sox/APKBUILD
+++ b/user/sox/APKBUILD
@@ -2,7 +2,7 @@
 # Maintainer: 
 pkgname=sox
 pkgver=14.4.2
-pkgrel=1
+pkgrel=2
 pkgdesc="Convert between various audio formats"
 url="http://sox.sourceforge.net/"
 arch="all"
@@ -15,10 +15,38 @@ makedepends="alsa-lib-dev ffmpeg-dev file-dev flac-dev gsm-dev lame-dev
 depends=""
 subpackages="$pkgname-dev $pkgname-doc"
 source="https://downloads.sourceforge.net/sourceforge/$pkgname/$pkgname-$pkgver.tar.gz
+	CVE-2017-11332.patch
+	CVE-2017-11358.patch
+	CVE-2017-11359.patch
+	CVE-2017-15370.patch
+	CVE-2017-15371.patch
+	CVE-2017-15372.patch
+	CVE-2017-15642.patch
+	CVE-2017-18189.patch
+	CVE-2019-13590.patch
+	CVE-2019-8354.patch
+	CVE-2019-8355.patch
+	CVE-2019-8356.patch
+	CVE-2019-8357.patch
 	disable-pipe-file-detection.patch
-	sox-dynamic.patch
 	"
 
+# secfixes:
+#   14.4.2-r2:
+#     - CVE-2017-11332
+#     - CVE-2017-11358
+#     - CVE-2017-11359
+#     - CVE-2017-15370
+#     - CVE-2017-15371
+#     - CVE-2017-15372
+#     - CVE-2017-15642
+#     - CVE-2017-18189
+#     - CVE-2019-13590
+#     - CVE-2019-8354
+#     - CVE-2019-8355
+#     - CVE-2019-8356
+#     - CVE-2019-8357
+
 prepare() {
 	default_prepare
 	autoreconf -vif
@@ -43,5 +71,17 @@ package() {
 }
 
 sha512sums="b5c6203f4f5577503a034fe5b3d6a033ee97fe4d171c533933e2b036118a43a14f97c9668433229708609ccf9ee16abdeca3fc7501aa0aafe06baacbba537eca  sox-14.4.2.tar.gz
-eb90574a7c174a32ac77aa09a2bb4ebbea407463517e55943e16efd8b7c52393c6b7a6b2778d696f708627271f4d2212221a85fc50d2500b32143139a37a957a  disable-pipe-file-detection.patch
-3950834db26faa0523006c6fd8e0769d080518f127d345c8ec9bf53e9db8a6bd67cd724f0f86492aaf9ce6ede2dfbde167049768f35c14ef3c2b96e7e00302b6  sox-dynamic.patch"
+b4bded0b15a2243fbb404a33fccf45ad5634d6c6e0f60b49b967592f00ff9bc3657ebcfa42b18a5af804e7f04a700773bece5951739b8206b2c68c46c9ec4c7f  CVE-2017-11332.patch
+28ffd5eef149563a1cdfcd920a89a0e2247ddbf4ed10a76c4e34ee57e3a30ec3a98bacf53fe1675da1431dd40c30b13cae0b9a1e26153c1aad6144322b7d78b0  CVE-2017-11358.patch
+2c95d85f94877bf1637d2c1297944a77a8854506cad35b1c0d632237133cd970da82cded817696b19acde25b0e570f4c86659cc362a910e4ea76a037e3e56214  CVE-2017-11359.patch
+bcbfd0785751372cd959a7419d88af24bb041dd02d3d0cf2f0dab46b6f6b55f284c1d823d20e5a0eae15191f3ccb2eefa2026287fdfbecb064722b006970ee00  CVE-2017-15370.patch
+b116887f52eb4b70de9dda5f14e581579c4c1755c39100d88c4b8645bf9e053cfe87de3346eb138edc45fd2c36f0e1755f91e09511d279fe6d4661099c578420  CVE-2017-15371.patch
+f8a4d38cfad80a50b9c758b222d83f6b51d96f1491862680e1632eec2a5c2a7c6f968660307f0f403e0b7537f7da19a510945648bdef8f1302fd4683be869581  CVE-2017-15372.patch
+259980ea6fe08a2481a478a4a21b11a7fc4390b1b53023009d85fb2185ee63c42d2762e024af20912e7277688fac98e4eaa66b4a4e79840517ff2481ad50327e  CVE-2017-15642.patch
+de510114a9fbbbabe62149f3c22ebd1fae65ed68e6ed0b818f367bbee806c9e04be6db0c8e64f4985b7bd95dd0cc643e1475767fda4e405931f25104b4a2e39f  CVE-2017-18189.patch
+eab27e22035bdbe00d0dc4117f98bf9c5dcad4513a27e0e8a83506b94fca8055bc6ce532d24306aa8434942bef111b3511daf260df56fafb7b4ac5ed2075e3f7  CVE-2019-13590.patch
+61342fad71dbe7f0ff10a7327eeed901c0defd5aafaace4ac755032ccf687d875856490c30f2af050823fd6ff1a1c7f503ae26670225eab916ab59fa857a8cb3  CVE-2019-8354.patch
+3f05ab71680a67c9e8a4b33c70cb19a623f0925a2620ab007dc8d4a82caf5b73b50e3e5d40e242d6f65420d444b91e11bee09e4398e8079ca4af60bd34097593  CVE-2019-8355.patch
+6eca5096c658a61939902a70d218b5662b663df84173d09d5b23f497bdcb81c04cd94d8debed2818079c342cec80ec29ff33d572611826bdbc12a5d465a20241  CVE-2019-8356.patch
+82fbbf62a7124248ce74cf0daab0cd224a3da80e62923db58b8be31c4f145abe0e653f6968d0f6b862e5554d080d0f85b0bc0bcdb6dea34c130aa4ee9106d915  CVE-2019-8357.patch
+eb90574a7c174a32ac77aa09a2bb4ebbea407463517e55943e16efd8b7c52393c6b7a6b2778d696f708627271f4d2212221a85fc50d2500b32143139a37a957a  disable-pipe-file-detection.patch"
diff --git a/user/sox/CVE-2017-11332.patch b/user/sox/CVE-2017-11332.patch
new file mode 100644
index 0000000000000000000000000000000000000000..511049d8e9fcf8d71b52d0446bba902d7c5420c0
--- /dev/null
+++ b/user/sox/CVE-2017-11332.patch
@@ -0,0 +1,28 @@
+From 6e177c455fb554327ff8125b6e6dde1568610abe Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Sun, 5 Nov 2017 16:29:28 +0000
+Subject: [PATCH] wav: fix crash if channel count is zero (CVE-2017-11332)
+
+---
+ src/wav.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/wav.c b/src/wav.c
+index 5202556c..71fd52ac 100644
+--- a/src/wav.c
++++ b/src/wav.c
+@@ -712,6 +712,11 @@ static int startread(sox_format_t * ft)
+     else
+         lsx_report("User options overriding channels read in .wav header");
+ 
++    if (ft->signal.channels == 0) {
++        lsx_fail_errno(ft, SOX_EHDR, "Channel count is zero");
++        return SOX_EOF;
++    }
++
+     if (ft->signal.rate == 0 || ft->signal.rate == dwSamplesPerSecond)
+         ft->signal.rate = dwSamplesPerSecond;
+     else
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-11358.patch b/user/sox/CVE-2017-11358.patch
new file mode 100644
index 0000000000000000000000000000000000000000..4fadeda3093b262999a2ef9d5b675d46c7716abc
--- /dev/null
+++ b/user/sox/CVE-2017-11358.patch
@@ -0,0 +1,44 @@
+From e410d00c4821726accfbe1f825f2def6376e181f Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Sun, 5 Nov 2017 16:43:35 +0000
+Subject: [PATCH] hcom: fix crash on input with corrupt dictionary
+ (CVE-2017-11358)
+
+---
+ src/hcom.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/src/hcom.c b/src/hcom.c
+index e76820e9..be17d9d2 100644
+--- a/src/hcom.c
++++ b/src/hcom.c
+@@ -73,6 +73,14 @@ typedef struct {
+   size_t pos;                /* Where next byte goes */
+ } priv_t;
+ 
++static int dictvalid(int n, int size, int left, int right)
++{
++        if (n > 0 && left < 0)
++                return 1;
++
++        return (unsigned)left < size && (unsigned)right < size;
++}
++
+ static int startread(sox_format_t * ft)
+ {
+         priv_t *p = (priv_t *) ft->priv;
+@@ -150,6 +158,11 @@ static int startread(sox_format_t * ft)
+                 lsx_debug("%d %d",
+                        p->dictionary[i].dict_leftson,
+                        p->dictionary[i].dict_rightson);
++                if (!dictvalid(i, dictsize, p->dictionary[i].dict_leftson,
++                               p->dictionary[i].dict_rightson)) {
++                        lsx_fail_errno(ft, SOX_EHDR, "Invalid dictionary");
++                        return SOX_EOF;
++                }
+         }
+         rc = lsx_skipbytes(ft, (size_t) 1); /* skip pad byte */
+         if (rc)
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-11359.patch b/user/sox/CVE-2017-11359.patch
new file mode 100644
index 0000000000000000000000000000000000000000..cb96c4a710ca7e5bca0fe367f9389c71fb5054c4
--- /dev/null
+++ b/user/sox/CVE-2017-11359.patch
@@ -0,0 +1,30 @@
+From 7b3f30e13e4845bafc93215a372c6eb7dcf04118 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Sun, 5 Nov 2017 17:02:11 +0000
+Subject: [PATCH] wav: fix crash writing header when channel count >64k
+ (CVE-2017-11359)
+
+---
+ src/wav.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/wav.c b/src/wav.c
+index 71fd52ac..eca1cde5 100644
+--- a/src/wav.c
++++ b/src/wav.c
+@@ -1379,6 +1379,12 @@ static int wavwritehdr(sox_format_t * ft, int second_header)
+     long blocksWritten = 0;
+     sox_bool isExtensible = sox_false;    /* WAVE_FORMAT_EXTENSIBLE? */
+ 
++    if (ft->signal.channels > UINT16_MAX) {
++        lsx_fail_errno(ft, SOX_EOF, "Too many channels (%u)",
++                       ft->signal.channels);
++        return SOX_EOF;
++    }
++
+     dwSamplesPerSecond = ft->signal.rate;
+     wChannels = ft->signal.channels;
+     wBitsPerSample = ft->encoding.bits_per_sample;
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-15370.patch b/user/sox/CVE-2017-15370.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9e6a7f7eebfd5c77427cb19dcc4e58001dc0d9f1
--- /dev/null
+++ b/user/sox/CVE-2017-15370.patch
@@ -0,0 +1,28 @@
+From e076a7ad504add6e8c3b8699e8587eef0e0d9bc3 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Sun, 5 Nov 2017 16:21:23 +0000
+Subject: [PATCH] wav: ima_adpcm: fix buffer overflow on corrupt input
+ (CVE-2017-15370)
+
+Add the same check bad block size as was done for MS adpcm in commit
+f39c574b ("More checks for invalid MS ADPCM blocks").
+---
+ src/wav.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/wav.c b/src/wav.c
+index eca1cde5..fad334cf 100644
+--- a/src/wav.c
++++ b/src/wav.c
+@@ -127,7 +127,7 @@ static unsigned short  ImaAdpcmReadBlock(sox_format_t * ft)
+         /* work with partial blocks.  Specs say it should be null */
+         /* padded but I guess this is better than trailing quiet. */
+         samplesThisBlock = lsx_ima_samples_in((size_t)0, (size_t)ft->signal.channels, bytesRead, (size_t) 0);
+-        if (samplesThisBlock == 0)
++        if (samplesThisBlock == 0 || samplesThisBlock > wav->samplesPerBlock)
+         {
+             lsx_warn("Premature EOF on .wav input file");
+             return 0;
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-15371.patch b/user/sox/CVE-2017-15371.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7b38943f2e489fb71708aea122feedd74e53e796
--- /dev/null
+++ b/user/sox/CVE-2017-15371.patch
@@ -0,0 +1,40 @@
+From 968c689ad2c4269a1a853434d99aa7ebf0c01354 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Sun, 5 Nov 2017 15:57:48 +0000
+Subject: [PATCH] flac: fix crash on corrupt metadata (CVE-2017-15371)
+
+---
+ src/flac.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/src/flac.c b/src/flac.c
+index 0d7829ec..07f45c1b 100644
+--- a/src/flac.c
++++ b/src/flac.c
+@@ -119,9 +119,10 @@ static void decoder_metadata_callback(FLAC__StreamDecoder const * const flac, FL
+     p->total_samples = metadata->data.stream_info.total_samples;
+   }
+   else if (metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) {
++    const FLAC__StreamMetadata_VorbisComment *vc = &metadata->data.vorbis_comment;
+     size_t i;
+ 
+-    if (metadata->data.vorbis_comment.num_comments == 0)
++    if (vc->num_comments == 0)
+       return;
+ 
+     if (ft->oob.comments != NULL) {
+@@ -129,8 +130,9 @@ static void decoder_metadata_callback(FLAC__StreamDecoder const * const flac, FL
+       return;
+     }
+ 
+-    for (i = 0; i < metadata->data.vorbis_comment.num_comments; ++i)
+-      sox_append_comment(&ft->oob.comments, (char const *) metadata->data.vorbis_comment.comments[i].entry);
++    for (i = 0; i < vc->num_comments; ++i)
++      if (vc->comments[i].entry)
++        sox_append_comment(&ft->oob.comments, (char const *) vc->comments[i].entry);
+   }
+ }
+ 
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-15372.patch b/user/sox/CVE-2017-15372.patch
new file mode 100644
index 0000000000000000000000000000000000000000..dd7fcff5de2d8161c45611451edcf6464e318c9e
--- /dev/null
+++ b/user/sox/CVE-2017-15372.patch
@@ -0,0 +1,100 @@
+From 515b986139183326cc40c67c75f83edc60826a9e Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Wed, 8 Nov 2017 00:27:46 +0000
+Subject: [PATCH] adpcm: fix stack overflow with >4 channels (CVE-2017-15372)
+
+---
+ src/adpcm.c | 8 +++++++-
+ src/adpcm.h | 3 +++
+ src/wav.c   | 5 ++++-
+ 3 files changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/src/adpcm.c b/src/adpcm.c
+index 2e13867e..f64b7d5c 100644
+--- a/src/adpcm.c
++++ b/src/adpcm.c
+@@ -71,6 +71,11 @@ const short lsx_ms_adpcm_i_coef[7][2] = {
+                         { 392,-232}
+ };
+ 
++extern void *lsx_ms_adpcm_alloc(unsigned chans)
++{
++        return lsx_malloc(chans * sizeof(MsState_t));
++}
++
+ static inline sox_sample_t AdpcmDecode(sox_sample_t c, MsState_t *state,
+                                sox_sample_t sample1, sox_sample_t sample2)
+ {
+@@ -102,6 +107,7 @@ static inline sox_sample_t AdpcmDecode(sox_sample_t c, MsState_t *state,
+ 
+ /* lsx_ms_adpcm_block_expand_i() outputs interleaved samples into one output buffer */
+ const char *lsx_ms_adpcm_block_expand_i(
++        void *priv,
+         unsigned chans,          /* total channels             */
+         int nCoef,
+         const short *coef,
+@@ -113,7 +119,7 @@ const char *lsx_ms_adpcm_block_expand_i(
+   const unsigned char *ip;
+   unsigned ch;
+   const char *errmsg = NULL;
+-  MsState_t state[4];  /* One decompressor state for each channel */
++  MsState_t *state = priv;  /* One decompressor state for each channel */
+ 
+   /* Read the four-byte header for each channel */
+   ip = ibuff;
+diff --git a/src/adpcm.h b/src/adpcm.h
+index af4d6f08..db5cc615 100644
+--- a/src/adpcm.h
++++ b/src/adpcm.h
+@@ -29,8 +29,11 @@
+ /* default coef sets */
+ extern const short lsx_ms_adpcm_i_coef[7][2];
+ 
++extern void *lsx_ms_adpcm_alloc(unsigned chans);
++
+ /* lsx_ms_adpcm_block_expand_i() outputs interleaved samples into one output buffer */
+ extern const char *lsx_ms_adpcm_block_expand_i(
++	void *priv,
+ 	unsigned chans,          /* total channels             */
+ 	int nCoef,
+ 	const short *coef,
+diff --git a/src/wav.c b/src/wav.c
+index fad334cf..066be6d7 100644
+--- a/src/wav.c
++++ b/src/wav.c
+@@ -82,6 +82,7 @@ typedef struct {
+     /* following used by *ADPCM wav files */
+     unsigned short nCoefs;          /* ADPCM: number of coef sets */
+     short         *lsx_ms_adpcm_i_coefs;          /* ADPCM: coef sets           */
++    void          *ms_adpcm_data;   /* Private data of adpcm decoder */
+     unsigned char *packet;          /* Temporary buffer for packets */
+     short         *samples;         /* interleaved samples buffer */
+     short         *samplePtr;       /* Pointer to current sample  */
+@@ -175,7 +176,7 @@ static unsigned short  AdpcmReadBlock(sox_format_t * ft)
+         }
+     }
+ 
+-    errmsg = lsx_ms_adpcm_block_expand_i(ft->signal.channels, wav->nCoefs, wav->lsx_ms_adpcm_i_coefs, wav->packet, wav->samples, samplesThisBlock);
++    errmsg = lsx_ms_adpcm_block_expand_i(wav->ms_adpcm_data, ft->signal.channels, wav->nCoefs, wav->lsx_ms_adpcm_i_coefs, wav->packet, wav->samples, samplesThisBlock);
+ 
+     if (errmsg)
+         lsx_warn("%s", errmsg);
+@@ -791,6 +792,7 @@ static int startread(sox_format_t * ft)
+ 
+         /* nCoefs, lsx_ms_adpcm_i_coefs used by adpcm.c */
+         wav->lsx_ms_adpcm_i_coefs = lsx_malloc(wav->nCoefs * 2 * sizeof(short));
++        wav->ms_adpcm_data = lsx_ms_adpcm_alloc(wChannels);
+         {
+             int i, errct=0;
+             for (i=0; len>=2 && i < 2*wav->nCoefs; i++) {
+@@ -1216,6 +1218,7 @@ static int stopread(sox_format_t * ft)
+     free(wav->packet);
+     free(wav->samples);
+     free(wav->lsx_ms_adpcm_i_coefs);
++    free(wav->ms_adpcm_data);
+     free(wav->comment);
+     wav->comment = NULL;
+ 
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-15642.patch b/user/sox/CVE-2017-15642.patch
new file mode 100644
index 0000000000000000000000000000000000000000..95beb4f6f9dbd25fde8047eca5bdd640487e8e9f
--- /dev/null
+++ b/user/sox/CVE-2017-15642.patch
@@ -0,0 +1,34 @@
+From f56c0dbca8f5bd02ea88970c248c0d087386e807 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Mon, 20 Nov 2017 11:03:15 +0000
+Subject: [PATCH] aiff: fix crash on empty comment chunk (CVE-2017-15642)
+
+This fixes a use after free and double free if an empty comment
+chunk follows a non-empty one.
+---
+ src/aiff.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/aiff.c b/src/aiff.c
+index 240d2e1f..11ddb542 100644
+--- a/src/aiff.c
++++ b/src/aiff.c
+@@ -62,7 +62,6 @@ int lsx_aiffstartread(sox_format_t * ft)
+   size_t ssndsize = 0;
+   char *annotation;
+   char *author;
+-  char *comment = NULL;
+   char *copyright;
+   char *nametext;
+ 
+@@ -270,6 +269,7 @@ int lsx_aiffstartread(sox_format_t * ft)
+       free(annotation);
+     }
+     else if (strncmp(buf, "COMT", (size_t)4) == 0) {
++      char *comment = NULL;
+       rc = commentChunk(&comment, "Comment:", ft);
+       if (rc) {
+         /* Fail already called in function */
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2017-18189.patch b/user/sox/CVE-2017-18189.patch
new file mode 100644
index 0000000000000000000000000000000000000000..aa3791d011555ceca1e070de8f69d38112c54747
--- /dev/null
+++ b/user/sox/CVE-2017-18189.patch
@@ -0,0 +1,33 @@
+From 09d7388c8ad5701ed9c59d1d600ff6154b066397 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Thu, 9 Nov 2017 11:45:10 +0000
+Subject: [PATCH] xa: validate channel count (CVE-2017-18189)
+
+A corrupt header specifying zero channels would send read_channels()
+into an infinite loop.  Prevent this by sanity checking the channel
+count in open_read().  Also add an upper bound to prevent overflow
+in multiplication.
+---
+ src/xa.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/xa.c b/src/xa.c
+index 81a76772..9fc086ec 100644
+--- a/src/xa.c
++++ b/src/xa.c
+@@ -143,6 +143,12 @@ static int startread(sox_format_t * ft)
+         lsx_report("User options overriding rate read in .xa header");
+     }
+ 
++    if (ft->signal.channels == 0 || ft->signal.channels > UINT16_MAX) {
++        lsx_fail_errno(ft, SOX_EFMT, "invalid channel count %d",
++                       ft->signal.channels);
++        return SOX_EOF;
++    }
++
+     /* Check for supported formats */
+     if (ft->encoding.bits_per_sample != 16) {
+         lsx_fail_errno(ft, SOX_EFMT, "%d-bit sample resolution not supported.",
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2019-13590.patch b/user/sox/CVE-2019-13590.patch
new file mode 100644
index 0000000000000000000000000000000000000000..a09b11bae01e782956de196dfb81c6dccb3d9a1f
--- /dev/null
+++ b/user/sox/CVE-2019-13590.patch
@@ -0,0 +1,33 @@
+From 7b6a889217d62ed7e28188621403cc7542fd1f7e Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Tue, 4 Feb 2020 12:55:18 +0000
+Subject: [PATCH] sox-fmt: validate comments_bytes before use (CVE-2019-13590)
+ [bug #325]
+
+Cap the comments size to 1 GB to avoid overflows in subsequent
+arithmetic.
+
+The missing null check mentioned in the bug report is bogus since
+lsx_calloc() returns a valid pointer or aborts.
+---
+ src/sox-fmt.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/sox-fmt.c b/src/sox-fmt.c
+index aad965cd..11c88771 100644
+--- a/src/sox-fmt.c
++++ b/src/sox-fmt.c
+@@ -46,7 +46,9 @@ static int startread(sox_format_t * ft)
+       lsx_readdw(ft, &comments_bytes))
+     return SOX_EOF;
+ 
+-  if (((headers_bytes + 4) & 7) || headers_bytes < FIXED_HDR + comments_bytes ||
++  if (((headers_bytes + 4) & 7) ||
++      comments_bytes > 0x40000000 || /* max 1 GB */
++      headers_bytes < FIXED_HDR + comments_bytes ||
+       (num_channels > 65535)) /* Reserve top 16 bits */ {
+     lsx_fail_errno(ft, SOX_EHDR, "invalid sox file format header");
+     return SOX_EOF;
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2019-8354.patch b/user/sox/CVE-2019-8354.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1fa0e669f8e47c5fe53f1c77832ba34183afd744
--- /dev/null
+++ b/user/sox/CVE-2019-8354.patch
@@ -0,0 +1,28 @@
+From f70911261a84333b077c29908e1242f69d7439eb Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Wed, 24 Apr 2019 14:57:34 +0100
+Subject: [PATCH] fix possible buffer size overflow in lsx_make_lpf()
+ (CVE-2019-8354)
+
+The multiplication in the size argument malloc() might overflow,
+resulting in a small buffer being allocated.  Use calloc() instead.
+---
+ src/effects_i_dsp.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/effects_i_dsp.c b/src/effects_i_dsp.c
+index a979b501..e32dfa05 100644
+--- a/src/effects_i_dsp.c
++++ b/src/effects_i_dsp.c
+@@ -357,7 +357,7 @@ double * lsx_make_lpf(int num_taps, double Fc, double beta, double rho,
+     double scale, sox_bool dc_norm)
+ {
+   int i, m = num_taps - 1;
+-  double * h = malloc(num_taps * sizeof(*h)), sum = 0;
++  double * h = calloc(num_taps, sizeof(*h)), sum = 0;
+   double mult = scale / lsx_bessel_I_0(beta), mult1 = 1 / (.5 * m + rho);
+   assert(Fc >= 0 && Fc <= 1);
+   lsx_debug("make_lpf(n=%i Fc=%.7g β=%g ρ=%g dc-norm=%i scale=%g)", num_taps, Fc, beta, rho, dc_norm, scale);
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2019-8355.patch b/user/sox/CVE-2019-8355.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d4d8cb80830169377588a342b848dc3bb8722531
--- /dev/null
+++ b/user/sox/CVE-2019-8355.patch
@@ -0,0 +1,59 @@
+Backport of the following:
+
+From ec073861aa9c0f779a3741c456e4f97d59366ffb Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Sun, 5 Nov 2017 15:40:16 +0000
+Subject: [PATCH] make: update exported symbol list [bug #266]
+
+From f8587e2d50dad72d40453ac1191c539ee9e50381 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Wed, 24 Apr 2019 17:39:45 +0100
+Subject: [PATCH] fix possible overflow in lsx_(re)valloc() size calculation
+ (CVE-2019-8355)
+
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -95,7 +95,7 @@ libsox_la_LIBADD += @GOMP_LIBS@
+ 
+ libsox_la_CFLAGS = @WARN_CFLAGS@
+ libsox_la_LDFLAGS = @APP_LDFLAGS@ -version-info @SHLIB_VERSION@ \
+-  -export-symbols-regex '^(sox_.*|lsx_(check_read_params|(close|open)_dllibrary|(debug(_more|_most)?|fail|report|warn)_impl|eof|fail_errno|filelength|find_(enum_(text|value)|file_extension)|getopt(_init)?|lpc10_(create_(de|en)coder_state|(de|en)code)|raw(read|write)|read(_b_buf|buf|chars)|realloc|rewind|seeki|sigfigs3p?|strcasecmp|tell|unreadb|write(b|_b_buf|buf|s)))$$'
++  -export-symbols-regex '^(sox_.*|lsx_(([cm]|re)alloc.*|check_read_params|(close|open)_dllibrary|(debug(_more|_most)?|fail|report|warn)_impl|eof|error|fail_errno|filelength|find_(enum_(text|value)|file_extension)|flush|getopt(_init)?|lpc10_(create_(de|en)coder_state|(de|en)code)|raw(read|write)|read(_b_buf|buf|chars)|rewind|seeki|sigfigs3p?|strcasecmp|strdup|tell|unreadb|write(b|_b_buf|buf|s)))$$'
+ 
+ if HAVE_WIN32_LTDL
+   libsox_la_SOURCES += win32-ltdl.c win32-ltdl.h
+--- sox-14.4.2/src/xmalloc.c	2012-01-23 16:27:33.000000000 -0600
++++ sox-14.4.2/src/xmalloc.c	2020-03-21 13:24:52.660007611 -0500
+@@ -41,3 +41,13 @@ void *lsx_realloc(void *ptr, size_t news
+ 
+   return ptr;
+ }
++
++void *lsx_realloc_array(void *p, size_t n, size_t size)
++{
++  if (n > (size_t)-1 / size) {
++    lsx_fail("malloc size overflow");
++    exit(2);
++  }
++
++  return lsx_realloc(p, n * size);
++}
+--- sox-14.4.2/src/xmalloc.h	2012-01-23 16:27:33.000000000 -0600
++++ sox-14.4.2/src/xmalloc.h	2020-03-21 13:24:14.610007203 -0500
+@@ -23,12 +23,14 @@
+ #include <stddef.h>
+ #include <string.h>
+ 
++LSX_RETURN_VALID void *lsx_realloc_array(void *p, size_t n, size_t size);
++
+ #define lsx_malloc(size) lsx_realloc(NULL, (size))
+ #define lsx_calloc(n,s) (((n)*(s))? memset(lsx_malloc((n)*(s)),0,(n)*(s)) : NULL)
+ #define lsx_Calloc(v,n)  v = lsx_calloc(n,sizeof(*(v)))
+ #define lsx_strdup(p) ((p)? strcpy((char *)lsx_malloc(strlen(p) + 1), p) : NULL)
+ #define lsx_memdup(p,s) ((p)? memcpy(lsx_malloc(s), p, s) : NULL)
+-#define lsx_valloc(v,n)  v = lsx_malloc((n)*sizeof(*(v)))
+-#define lsx_revalloc(v,n)  v = lsx_realloc(v, (n)*sizeof(*(v)))
++#define lsx_valloc(v,n)  v = lsx_realloc_array(NULL, n, sizeof(*(v)))
++#define lsx_revalloc(v,n)  v = lsx_realloc_array(v, n, sizeof(*(v)))
+ 
+ #endif
diff --git a/user/sox/CVE-2019-8356.patch b/user/sox/CVE-2019-8356.patch
new file mode 100644
index 0000000000000000000000000000000000000000..9375bc5ae878a583bdb3d5fb6353ed1ba07eb878
--- /dev/null
+++ b/user/sox/CVE-2019-8356.patch
@@ -0,0 +1,92 @@
+From b7883ae1398499daaa926ae6621f088f0f531ed8 Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Wed, 24 Apr 2019 16:56:42 +0100
+Subject: [PATCH] fft4g: bail if size too large (CVE-2019-8356)
+
+Prevent overflowing of fixed-size buffers in bitrv2() and bitrv2conj()
+if the transform size is too large.
+---
+ src/fft4g.c | 18 ++++++++++++++++++
+ src/fft4g.h |  2 ++
+ 2 files changed, 20 insertions(+)
+
+diff --git a/src/fft4g.c b/src/fft4g.c
+index 38a8bcc0..88a2a7ec 100644
+--- a/src/fft4g.c
++++ b/src/fft4g.c
+@@ -322,6 +322,9 @@ static void rftfsub(int n, double *a, int nc, double const *c);
+ 
+ void cdft(int n, int isgn, double *a, int *ip, double *w)
+ {
++    if (n > FFT4G_MAX_SIZE)
++        return;
++
+     if (n > (ip[0] << 2)) {
+         makewt(n >> 2, ip, w);
+     }
+@@ -344,6 +347,9 @@ void rdft(int n, int isgn, double *a, int *ip, double *w)
+     int nw, nc;
+     double xi;
+     
++    if (n > FFT4G_MAX_SIZE)
++        return;
++
+     nw = ip[0];
+     if (n > (nw << 2)) {
+         nw = n >> 2;
+@@ -384,6 +390,9 @@ void ddct(int n, int isgn, double *a, int *ip, double *w)
+     int j, nw, nc;
+     double xr;
+     
++    if (n > FFT4G_MAX_SIZE)
++        return;
++
+     nw = ip[0];
+     if (n > (nw << 2)) {
+         nw = n >> 2;
+@@ -435,6 +444,9 @@ void ddst(int n, int isgn, double *a, int *ip, double *w)
+     int j, nw, nc;
+     double xr;
+     
++    if (n > FFT4G_MAX_SIZE)
++        return;
++
+     nw = ip[0];
+     if (n > (nw << 2)) {
+         nw = n >> 2;
+@@ -486,6 +498,9 @@ void dfct(int n, double *a, double *t, int *ip, double *w)
+     int j, k, l, m, mh, nw, nc;
+     double xr, xi, yr, yi;
+     
++    if (n > FFT4G_MAX_SIZE)
++        return;
++
+     nw = ip[0];
+     if (n > (nw << 3)) {
+         nw = n >> 3;
+@@ -576,6 +591,9 @@ void dfst(int n, double *a, double *t, int *ip, double *w)
+     int j, k, l, m, mh, nw, nc;
+     double xr, xi, yr, yi;
+     
++    if (n > FFT4G_MAX_SIZE)
++        return;
++
+     nw = ip[0];
+     if (n > (nw << 3)) {
+         nw = n >> 3;
+diff --git a/src/fft4g.h b/src/fft4g.h
+index 2b8051ca..95ee3413 100644
+--- a/src/fft4g.h
++++ b/src/fft4g.h
+@@ -13,6 +13,8 @@
+  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+  */
+ 
++#define FFT4G_MAX_SIZE 262144
++
+ void lsx_cdft(int, int, double *, int *, double *);
+ void lsx_rdft(int, int, double *, int *, double *);
+ void lsx_ddct(int, int, double *, int *, double *);
+-- 
+2.25.0
+
diff --git a/user/sox/CVE-2019-8357.patch b/user/sox/CVE-2019-8357.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ec2b04d30d9c179ea12c4b2ec10396aed08d6945
--- /dev/null
+++ b/user/sox/CVE-2019-8357.patch
@@ -0,0 +1,28 @@
+From 2ce02fea7b350de9ddfbcf542ba4dd59a8ab255b Mon Sep 17 00:00:00 2001
+From: Mans Rullgard <mans@mansr.com>
+Date: Wed, 24 Apr 2019 15:08:51 +0100
+Subject: [PATCH] fix possible null pointer deref in lsx_make_lpf()
+ (CVE-2019-8357)
+
+If the buffer allocation fails, return NULL.
+---
+ src/effects_i_dsp.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/src/effects_i_dsp.c b/src/effects_i_dsp.c
+index e32dfa05..88b1b390 100644
+--- a/src/effects_i_dsp.c
++++ b/src/effects_i_dsp.c
+@@ -362,6 +362,9 @@ double * lsx_make_lpf(int num_taps, double Fc, double beta, double rho,
+   assert(Fc >= 0 && Fc <= 1);
+   lsx_debug("make_lpf(n=%i Fc=%.7g β=%g ρ=%g dc-norm=%i scale=%g)", num_taps, Fc, beta, rho, dc_norm, scale);
+ 
++  if (!h)
++    return NULL;
++
+   for (i = 0; i <= m / 2; ++i) {
+     double z = i - .5 * m, x = z * M_PI, y = z * mult1;
+     h[i] = x? sin(Fc * x) / x : Fc;
+-- 
+2.25.0
+
diff --git a/user/sox/sox-dynamic.patch b/user/sox/sox-dynamic.patch
deleted file mode 100644
index 94ac6a282dde9157eeb037242917a5720350e4ae..0000000000000000000000000000000000000000
--- a/user/sox/sox-dynamic.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Naur sox-14.4.2-orig/src/Makefile.am sox-14.4.2/src/Makefile.am
---- sox-14.4.2-orig/src/Makefile.am	2015-04-08 17:11:09.555343005 -0400
-+++ sox-14.4.2/src/Makefile.am	2015-04-08 17:11:25.115317153 -0400
-@@ -95,7 +95,7 @@
- 
- libsox_la_CFLAGS = @WARN_CFLAGS@
- libsox_la_LDFLAGS = @APP_LDFLAGS@ -version-info @SHLIB_VERSION@ \
--  -export-symbols-regex '^(sox_.*|lsx_(check_read_params|(close|open)_dllibrary|(debug(_more|_most)?|fail|report|warn)_impl|eof|fail_errno|filelength|find_(enum_(text|value)|file_extension)|getopt(_init)?|lpc10_(create_(de|en)coder_state|(de|en)code)|raw(read|write)|read(_b_buf|buf|chars)|realloc|rewind|seeki|sigfigs3p?|strcasecmp|tell|unreadb|write(b|_b_buf|buf|s)))$$'
-+  -export-symbols-regex '^(sox_.*|lsx_(error|flush|check_read_params|(close|open)_dllibrary|(debug(_more|_most)?|fail|report|warn)_impl|eof|fail_errno|filelength|find_(enum_(text|value)|file_extension)|getopt(_init)?|lpc10_(create_(de|en)coder_state|(de|en)code)|raw(read|write)|read(_b_buf|buf|chars)|realloc|rewind|seeki|sigfigs3p?|strcasecmp|tell|unreadb|write(b|_b_buf|buf|s)))$$'
- 
- if HAVE_WIN32_LTDL
-   libsox_la_SOURCES += win32-ltdl.c win32-ltdl.h
diff --git a/user/thunderbird/APKBUILD b/user/thunderbird/APKBUILD
index 5cb1c2099f5764d51a484f2f785fc08ad153b462..b50a1a7e8ffa2abe98fa6a456120cdf15974b2bb 100644
--- a/user/thunderbird/APKBUILD
+++ b/user/thunderbird/APKBUILD
@@ -1,6 +1,6 @@
 # Maintainer: A. Wilcox <awilfox@adelielinux.org>
 pkgname=thunderbird
-pkgver=68.5.0
+pkgver=68.6.0
 pkgrel=0
 pkgdesc="Email client from Mozilla"
 url="https://www.thunderbird.net/"
@@ -13,7 +13,7 @@ depends=""
 # system-libs
 # actual deps
 makedepends="
-	autoconf2.13 cargo cbindgen clang llvm8-dev node ncurses-dev 
+	autoconf2.13 cargo cbindgen clang llvm8-dev node ncurses-dev
 	perl rust cmd:which
 
 	ncurses-dev openssl-dev
@@ -55,6 +55,16 @@ somask="liblgpllibs.so
 _mozappdir=/usr/lib/thunderbird
 ldpath="$_mozappdir"
 
+# secfixes:
+#   68.6.0-r0:
+#     - CVE-2020-6805
+#     - CVE-2020-6806
+#     - CVE-2020-6807
+#     - CVE-2020-6811
+#     - CVE-2019-20503
+#     - CVE-2020-6812
+#     - CVE-2020-6814
+
 unpack() {
 	default_unpack
 	[ -z $SKIP_PYTHON ] || return 0
@@ -148,7 +158,7 @@ package() {
 		${pkgdir}/usr/share/applications/thunderbird.desktop
 }
 
-sha512sums="bb58a398f24d89eac5b1816f9d16edadbe65cdac6542e1f6798424c7ea18eb2d4ca46bb03f54c8c365e67d1dec44d3dfb36fbe4f85afe9ad80fbcc1f2984084b  thunderbird-68.5.0.source.tar.xz
+sha512sums="3502cc42b594eebf3511219ae8e7fb8a13594534abfe7a40ec32e5a3f60343cfab7c652b161a5f33af46bd5e6f096e3abd4a407c8b307ce4693089b471a42c3e  thunderbird-68.6.0.source.tar.xz
 16e814e8dcffc707b595ca2919bd2fa3db0d15794c63d977364652c4a5b92e90e72b8c9e1cc83b5020398bd90a1b397dbdd7cb931c49f1aa4af6ef95414b43e0  Python-2.7.16.tar.xz
 5519234df2934ac2f3d76c8cad7e4f0fe15cf83ea4beb32c6489d8b7839b3ebea88bdb342e0d2a9c1c7c95e9455d234b0a5aa0e73446fd8027b520f080a2bb5b  mozconfig
 ace7492f4fb0523c7340fdc09c831906f74fddad93822aff367135538dacd3f56288b907f5a04f53f94c76e722ba0bab73e28d83ec12d3e672554712e6b08613  bad-google-code.patch
diff --git a/user/wavpack/APKBUILD b/user/wavpack/APKBUILD
index 45b2f7895aeac72b427c7257f9fa23e326f92644..db868c74f40c93d5fa2993e6977614dcde3f0b58 100644
--- a/user/wavpack/APKBUILD
+++ b/user/wavpack/APKBUILD
@@ -3,7 +3,7 @@
 # Maintainer: 
 pkgname=wavpack
 pkgver=5.2.0
-pkgrel=0
+pkgrel=1
 pkgdesc="Audio compression format with lossless, lossy, and hybrid compression modes"
 url="http://www.wavpack.com/"
 arch="all"
@@ -12,19 +12,30 @@ license="BSD-3-Clause"
 depends=""
 makedepends=""
 subpackages="$pkgname-dev $pkgname-doc"
-source="http://www.wavpack.com/$pkgname-$pkgver.tar.bz2
-	cve2018-19840.patch
-	"
+source="http://www.wavpack.com/$pkgname-$pkgver.tar.bz2"
 
 # secfixes:
+#   5.2.0-r0:
+#     - CVE-2018-6767
+#     - CVE-2018-7253
+#     - CVE-2018-7254
+#     - CVE-2018-10536
+#     - CVE-2018-10537
+#     - CVE-2018-10538
+#     - CVE-2018-10539
+#     - CVE-2018-10540
+#     - CVE-2019-11498
+#     - CVE-2019-1010315
+#     - CVE-2019-1010317
+#     - CVE-2019-1010319
 #   5.1.0-r4:
-#   - CVE-2018-19840
-#   - CVE-2018-19840
+#     - CVE-2018-19840
+#     - CVE-2018-19841
 #   5.1.0-r0:
-#   - CVE-2016-10169
-#   - CVE-2016-10170
-#   - CVE-2016-10171
-#   - CVE-2016-10172
+#     - CVE-2016-10169
+#     - CVE-2016-10170
+#     - CVE-2016-10171
+#     - CVE-2016-10172
 
 build() {
 	_arch_opts=""
diff --git a/user/wavpack/cve2018-19840.patch b/user/wavpack/cve2018-19840.patch
deleted file mode 100644
index 2da0220258613462e70e2db977b5e8d20b81f61b..0000000000000000000000000000000000000000
--- a/user/wavpack/cve2018-19840.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 070ef6f138956d9ea9612e69586152339dbefe51 Mon Sep 17 00:00:00 2001
-From: David Bryant <david@wavpack.com>
-Date: Thu, 29 Nov 2018 21:00:42 -0800
-Subject: [PATCH] issue #53: error out on zero sample rate
-
----
- src/pack_utils.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/src/pack_utils.c b/src/pack_utils.c
-index 2253f0d..2a83497 100644
---- a/src/pack_utils.c
-+++ b/src/pack_utils.c
-@@ -195,6 +195,11 @@ int WavpackSetConfiguration64 (WavpackContext *wpc, WavpackConfig *config, int64
-     int num_chans = config->num_channels;
-     int i;
- 
-+    if (!config->sample_rate) {
-+        strcpy (wpc->error_message, "sample rate cannot be zero!");
-+        return FALSE;
-+    }
-+
-     wpc->stream_version = (config->flags & CONFIG_COMPATIBLE_WRITE) ? CUR_STREAM_VERS : MAX_STREAM_VERS;
- 
-     if ((config->qmode & QMODE_DSD_AUDIO) && config->bytes_per_sample == 1 && config->bits_per_sample == 8) {