shithub: riscv

Download patch

ref: 53526d76e450a0eac621961255c5554fe837e080
parent: 0eeb315c79f5247921e20c171bc2561b70e412c7
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Apr 21 09:34:13 EDT 2025

upas/smtpd: Pass certificate chain to tlsServer() (thanks sirjofri)

--- a/sys/src/cmd/upas/smtp/smtpd.c
+++ b/sys/src/cmd/upas/smtp/smtpd.c
@@ -1584,23 +1584,25 @@
 void
 starttls(void)
 {
-	int certlen, fd;
-	uchar *cert;
+	int fd;
 	TLSconn conn;
+	PEMChain *chain;
 
 	if (tlscert == nil) {
 		reply("500 5.5.1 illegal command or bad syntax\r\n");
 		return;
 	}
-	cert = readcert(tlscert, &certlen);
-	if (cert == nil) {
+	chain = readcertchain(tlscert);
+	if (chain == nil) {
 		reply("454 4.7.5 TLS not available\r\n");
 		return;
 	}
 	reply("220 2.0.0 Go ahead make my day\r\n");
 	memset(&conn, 0, sizeof(conn));
-	conn.cert = cert;
-	conn.certlen = certlen;
+	conn.cert = chain->pem;
+	conn.certlen = chain->pemlen;
+	conn.chain = chain->next;
+	free(chain);	/* chain->pem freed by tlsSevrer() */
 	fd = tlsServer(Bfildes(&bin), &conn);
 	if (fd < 0) {
 		syslog(0, "smtpd", "TLS start-up failed with %s", him);
@@ -1611,7 +1613,12 @@
 		fprint(2, "dup of %d failed: %r\n", fd);
 	close(fd);
 	Binit(&bin, 0, OREAD);
-	free(conn.cert);
+	while((chain = conn.chain) != nil){
+		conn.chain = chain->next;
+		free(chain->pem);
+		free(chain);
+	}
+	free(conn.cert);	/* client cert */
 	free(conn.sessionID);
 	passwordinclear = 1;
 	syslog(0, "smtpd", "started TLS with %s", him);
--