Blame SOURCES/librelp-1.2.12-rhbz1561232-snprintf.patch

f8a4ec
From 2cfe657672636aa5d7d2a14cfcb0a6ab9d1f00cf Mon Sep 17 00:00:00 2001
f8a4ec
From: Rainer Gerhards <rgerhards@adiscon.com>
f8a4ec
Date: Tue, 20 Mar 2018 12:30:12 +0100
f8a4ec
Subject: [PATCH] unify error message generation
f8a4ec
f8a4ec
---
f8a4ec
 src/tcp.c | 38 +++++++++++++++++++++++++++++++++-----
f8a4ec
 1 file changed, 33 insertions(+), 5 deletions(-)
f8a4ec
f8a4ec
diff --git a/src/tcp.c b/src/tcp.c
f8a4ec
index a587627..d2d48f5 100644
f8a4ec
--- a/src/tcp.c
f8a4ec
+++ b/src/tcp.c
f8a4ec
@@ -1172,9 +1172,35 @@ relpTcpGetCN(relpTcp_t *pThis, gnutls_x509_crt_t cert, char *namebuf, int lenNam
f8a4ec
 	return r;
f8a4ec
 }
f8a4ec
 
f8a4ec
+
f8a4ec
+/* helper to consistently add names to error message buffer */
f8a4ec
+static int
f8a4ec
+relpTcpAddToCertNamesBuffer(relpTcp_t *const pThis,
f8a4ec
+	char *const buf,
f8a4ec
+	const size_t buflen,
f8a4ec
+	int *p_currIdx,
f8a4ec
+	const char *const certName)
f8a4ec
+{
f8a4ec
+	int r = 0;
f8a4ec
+	assert(buf != NULL);
f8a4ec
+	assert(p_currIdx != NULL);
f8a4ec
+	const int currIdx = *p_currIdx;
f8a4ec
+	const int n = snprintf(buf + currIdx, buflen - currIdx,
f8a4ec
+		"DNSname: %s; ", certName);
f8a4ec
+	if(n < 0 || n >= (int) (buflen - currIdx)) {
f8a4ec
+		callOnAuthErr(pThis, "", "certificate validation failed, names "
f8a4ec
+			"inside certifcate are way to long (> 32KiB)",
f8a4ec
+			RELP_RET_AUTH_CERT_INVL);
f8a4ec
+		r = GNUTLS_E_CERTIFICATE_ERROR;
f8a4ec
+	} else {
f8a4ec
+		*p_currIdx += n;
f8a4ec
+	}
f8a4ec
+	return r;
f8a4ec
+}
f8a4ec
+
f8a4ec
 /* Check the peer's ID in name auth mode. */
f8a4ec
 static int
f8a4ec
-relpTcpChkPeerName(relpTcp_t *pThis, gnutls_x509_crt_t cert)
f8a4ec
+relpTcpChkPeerName(relpTcp_t *const pThis, gnutls_x509_crt_t cert)
f8a4ec
 {
f8a4ec
 	int r = 0;
f8a4ec
 	int ret;
f8a4ec
@@ -1213,8 +1239,9 @@ relpTcpChkPeerName(relpTcp_t *pThis, gnutls_x509_crt_t cert)
f8a4ec
 			break;
f8a4ec
 		else if(gnuRet == GNUTLS_SAN_DNSNAME) {
f8a4ec
 			pThis->pEngine->dbgprint("librelp: subject alt dnsName: '%s'\n", szAltName);
f8a4ec
-			iAllNames += snprintf(allNames+iAllNames, sizeof(allNames)-iAllNames,
f8a4ec
-					      "DNSname: %s; ", szAltName);
f8a4ec
+			r = relpTcpAddToCertNamesBuffer(pThis, allNames, sizeof(allNames),
f8a4ec
+				&iAllNames, szAltName);
f8a4ec
+			if(r != 0) goto done;
f8a4ec
 			relpTcpChkOnePeerName(pThis, szAltName, &bFoundPositiveMatch);
f8a4ec
 			/* do NOT break, because there may be multiple dNSName's! */
f8a4ec
 		}
f8a4ec
@@ -1225,8 +1252,9 @@ relpTcpChkPeerName(relpTcp_t *pThis, gnutls_x509_crt_t cert)
f8a4ec
 		/* if we did not succeed so far, we try the CN part of the DN... */
f8a4ec
 		if(relpTcpGetCN(pThis, cert, cnBuf, sizeof(cnBuf)) == 0) {
f8a4ec
 			pThis->pEngine->dbgprint("librelp: relpTcp now checking auth for CN '%s'\n", cnBuf);
f8a4ec
-			iAllNames += snprintf(allNames+iAllNames, sizeof(allNames)-iAllNames,
f8a4ec
-					      "CN: %s; ", cnBuf);
f8a4ec
+			r = relpTcpAddToCertNamesBuffer(pThis, allNames, sizeof(allNames),
f8a4ec
+				&iAllNames, cnBuf);
f8a4ec
+			if(r != 0) goto done;
f8a4ec
 			relpTcpChkOnePeerName(pThis, cnBuf, &bFoundPositiveMatch);
f8a4ec
 		}
f8a4ec
 	}