Commit c64554b17f for strongswan.org

commit c64554b17fdb3427905b93f1e300315fe350c688
Author: Tobias Brunner <tobias@strongswan.org>
Date:   Thu Jul 23 16:54:48 2026 +0200

    pt-tls-client: Don't store PT-TLS message on stack

    Basically the same as the previous commit.

diff --git a/src/libpttls/pt_tls_client.c b/src/libpttls/pt_tls_client.c
index baa42fabe9..0d9295af94 100644
--- a/src/libpttls/pt_tls_client.c
+++ b/src/libpttls/pt_tls_client.c
@@ -358,11 +358,18 @@ static bool authenticate(private_pt_tls_client_t *this)
  */
 static bool assess(private_pt_tls_client_t *this, tls_t *tnccs)
 {
+	const size_t max_buflen = PT_TLS_MAX_MESSAGE_LEN;
+	char *buf;
+
+	buf = malloc(max_buflen);
+	if (!buf)
+	{
+		return FALSE;
+	}
+
 	while (TRUE)
 	{
-		size_t msglen;
-		size_t buflen = PT_TLS_MAX_MESSAGE_LEN;
-		char buf[buflen];
+		size_t msglen, buflen = max_buflen;
 		bio_reader_t *reader;
 		uint32_t vendor, type, identifier;
 		chunk_t data;
@@ -370,26 +377,27 @@ static bool assess(private_pt_tls_client_t *this, tls_t *tnccs)
 		switch (tnccs->build(tnccs, buf, &buflen, &msglen))
 		{
 			case SUCCESS:
+				free(buf);
 				return tnccs->is_complete(tnccs);
 			case ALREADY_DONE:
 				data = chunk_create(buf, buflen);
 				if (!pt_tls_write(this->tls, PT_TLS_PB_TNC_BATCH,
 								  this->identifier++, data))
 				{
-					return FALSE;
+					goto failed;
 				}
 				break;
 			case INVALID_STATE:
 				break;
 			case FAILED:
 			default:
-				return FALSE;
+				goto failed;
 		}

 		reader = pt_tls_read(this->tls, &vendor, &type, &identifier);
 		if (!reader)
 		{
-			return FALSE;
+			goto failed;
 		}
 		if (vendor == 0)
 		{
@@ -397,24 +405,25 @@ static bool assess(private_pt_tls_client_t *this, tls_t *tnccs)
 			{
 				DBG1(DBG_TNC, "received PT-TLS error");
 				reader->destroy(reader);
-				return FALSE;
+				goto failed;
 			}
 			if (type != PT_TLS_PB_TNC_BATCH)
 			{
 				DBG1(DBG_TNC, "unexpected PT-TLS message: %d", type);
 				reader->destroy(reader);
-				return FALSE;
+				goto failed;
 			}
 			data = reader->peek(reader);
 			switch (tnccs->process(tnccs, data.ptr, data.len))
 			{
 				case SUCCESS:
 					reader->destroy(reader);
+					free(buf);
 					return tnccs->is_complete(tnccs);
 				case FAILED:
 				default:
 					reader->destroy(reader);
-					return FALSE;
+					goto failed;
 				case NEED_MORE:
 					break;
 			}
@@ -425,6 +434,10 @@ static bool assess(private_pt_tls_client_t *this, tls_t *tnccs)
 		}
 		reader->destroy(reader);
 	}
+
+failed:
+	free(buf);
+	return FALSE;
 }

 METHOD(pt_tls_client_t, run_assessment, status_t,