Subject: [PATCH] devtls: fix bwrite memory leak when channel stops being open
From: cinap_lenrek <[email-masked]>
Date: Sat, 25 Sep 2021 20:35:04 +0000

tlsbwrite() would call checkstate() before calling tlsrecwrite()
to make sure the channel is open. however, because checkstate()
only raises the error, the Block* passed wont be freed and
would result in a memory leak.

move the checkstate() call inside tlsrecwrite() to reuse the
error handling that frees the block on error.
---
diff 235ef367d793db705b1b4ef20913c697eccd13a6 1cff923af4dbcaaab515cc04ea40c559eab7830f
--- a/sys/src/9/port/devtls.c	Sat Sep 25 12:57:58 2021
+++ b/sys/src/9/port/devtls.c	Sat Sep 25 16:35:04 2021
@@ -1258,6 +1258,8 @@
 if(tr->debug)pprint("send %zd\n", BLEN(b));
 if(tr->debug)pdump(BLEN(b), b->rp, "sent:");
 
+	if(type == RApplication)
+		checkstate(tr, 0, SOpen);
 
 	ok = SHandshake|SOpen|SRClose;
 	if(type == RAlert)
@@ -1375,7 +1377,6 @@
 		tr->handout += n;
 		break;
 	case Qdata:
-		checkstate(tr, 0, SOpen);
 		tlsrecwrite(tr, RApplication, b);
 		tr->dataout += n;
 		break;