code: plan9front

Download patch

ref: 1cff923af4dbcaaab515cc04ea40c559eab7830f
parent: 235ef367d793db705b1b4ef20913c697eccd13a6
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Sep 25 16:35:04 EDT 2021

devtls: fix bwrite memory leak when channel stops being open

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.

--- a/sys/src/9/port/devtls.c
+++ b/sys/src/9/port/devtls.c
@@ -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;