--- /dev/null
+From 52f28bd5149360f8e3bf8ca13d3fb9a77283df7c Mon Sep 17 00:00:00 2001
+From: Sean Parkinson <sean@wolfssl.com>
+Date: Wed, 6 Nov 2019 08:28:09 +1000
+Subject: [PATCH] Check domain name location index hasn't exceed maximum before
+ setting
+
+[CVE-2019–18840]
+Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
+---
+ wolfcrypt/src/asn.c | 30 ++++++++++++++++++++----------
+ 1 file changed, 20 insertions(+), 10 deletions(-)
+
+diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c
+index 637f4c355..d3793b7b3 100644
+--- a/wolfcrypt/src/asn.c
++++ b/wolfcrypt/src/asn.c
+@@ -5117,8 +5117,10 @@ static int GetName(DecodedCert* cert, int nameType)
+ XMEMCPY(&full[idx], &cert->source[cert->srcIdx], strLen);
+ idx += strLen;
+ #if defined(OPENSSL_EXTRA)
+- /* store order that DN was parsed */
+- dName->loc[count++] = id;
++ if (count < DOMAIN_COMPONENT_MAX) {
++ /* store order that DN was parsed */
++ dName->loc[count++] = id;
++ }
+ #endif
+ }
+
+@@ -5191,8 +5193,10 @@ static int GetName(DecodedCert* cert, int nameType)
+ XMEMCPY(&full[idx], &cert->source[cert->srcIdx], strLen);
+ idx += strLen;
+ #if defined(OPENSSL_EXTRA)
+- /* store order that DN was parsed */
+- dName->loc[count++] = id;
++ if (count < DOMAIN_COMPONENT_MAX) {
++ /* store order that DN was parsed */
++ dName->loc[count++] = id;
++ }
+ #endif
+ }
+
+@@ -5276,8 +5280,10 @@ static int GetName(DecodedCert* cert, int nameType)
+ XMEMCPY(&full[idx], &cert->source[cert->srcIdx], adv);
+ idx += adv;
+ #if defined(OPENSSL_EXTRA)
+- /* store order that DN was parsed */
+- dName->loc[count++] = ASN_EMAIL_NAME;
++ if (count < DOMAIN_COMPONENT_MAX) {
++ /* store order that DN was parsed */
++ dName->loc[count++] = ASN_EMAIL_NAME;
++ }
+ #endif
+ }
+ }
+@@ -5298,8 +5304,10 @@ static int GetName(DecodedCert* cert, int nameType)
+ dName->uidLen = adv;
+
+ #ifdef OPENSSL_EXTRA
+- /* store order that DN was parsed */
+- dName->loc[count++] = ASN_USER_ID;
++ if (count < DOMAIN_COMPONENT_MAX) {
++ /* store order that DN was parsed */
++ dName->loc[count++] = ASN_USER_ID;
++ }
+ #endif
+ #endif /* OPENSSL_EXTRA */
+ break;
+@@ -5315,8 +5323,10 @@ static int GetName(DecodedCert* cert, int nameType)
+ dcnum++;
+
+ #ifdef OPENSSL_EXTRA
+- /* store order that DN was parsed */
+- dName->loc[count++] = ASN_DOMAIN_COMPONENT;
++ if (count < DOMAIN_COMPONENT_MAX) {
++ /* store order that DN was parsed */
++ dName->loc[count++] = ASN_DOMAIN_COMPONENT;
++ }
+ #endif
+ #endif /* OPENSSL_EXTRA */
+ break;
+--
+2.20.1
+