|
| 1 | +From c98e21a34e93c5d76cfafd4e42af2e076b8122e7 Mon Sep 17 00:00:00 2001 |
| 2 | +From: AllSpark <allspark@microsoft.com> |
| 3 | +Date: Mon, 25 May 2026 08:44:24 +0000 |
| 4 | +Subject: [PATCH] lib/buffers: ensure packets with duplicate sequence but |
| 5 | + mismatched type are discarded; fix comparator to return 0 when sequence equal |
| 6 | + for stable sort (backport) |
| 7 | + |
| 8 | +Signed-off-by: Azure Linux Security Servicing Account <azurelinux-security@microsoft.com> |
| 9 | +Upstream-reference: AI Backport of https://gitlab.com/gnutls/gnutls/-/commit/f01e21441e29052a6f0963840794c41d3b3ee66d.patch https://gitlab.com/gnutls/gnutls/-/commit/f341441fad91142897d83b44a175ffc8f925b76f.patch |
| 10 | +--- |
| 11 | + lib/buffers.c | 21 +++++++++++++++------ |
| 12 | + 1 file changed, 15 insertions(+), 6 deletions(-) |
| 13 | + |
| 14 | +diff --git a/lib/buffers.c b/lib/buffers.c |
| 15 | +index f419193..e412915 100644 |
| 16 | +--- a/lib/buffers.c |
| 17 | ++++ b/lib/buffers.c |
| 18 | +@@ -845,10 +845,7 @@ static int handshake_compare(const void *_e1, const void *_e2) |
| 19 | + const handshake_buffer_st *e1 = _e1; |
| 20 | + const handshake_buffer_st *e2 = _e2; |
| 21 | + |
| 22 | +- if (e1->sequence <= e2->sequence) |
| 23 | +- return 1; |
| 24 | +- else |
| 25 | +- return -1; |
| 26 | ++ return (e1->sequence < e2->sequence) - (e1->sequence > e2->sequence); |
| 27 | + } |
| 28 | + |
| 29 | + #define SSL2_HEADERS 1 |
| 30 | +@@ -967,8 +964,20 @@ static int merge_handshake_packet(gnutls_session_t session, |
| 31 | + int ret; |
| 32 | + |
| 33 | + for (i = 0; i < session->internals.handshake_recv_buffer_size; i++) { |
| 34 | +- if (session->internals.handshake_recv_buffer[i].htype == |
| 35 | +- hsk->htype) { |
| 36 | ++ if (session->internals.handshake_recv_buffer[i].sequence == hsk->sequence) { |
| 37 | ++ if (session->internals.handshake_recv_buffer[i].htype != hsk->htype) { |
| 38 | ++ _gnutls_audit_log( |
| 39 | ++ session, |
| 40 | ++ "Discarded unexpected handshake packet " |
| 41 | ++ "with duplicate sequence %d, but " |
| 42 | ++ "mismatched type %s (previously %s)\n", |
| 43 | ++ hsk->sequence, |
| 44 | ++ _gnutls_handshake2str(hsk->htype), |
| 45 | ++ _gnutls_handshake2str( |
| 46 | ++ session->internals.handshake_recv_buffer[i].htype)); |
| 47 | ++ _gnutls_handshake_buffer_clear(hsk); |
| 48 | ++ return 0; |
| 49 | ++ } |
| 50 | + exists = 1; |
| 51 | + pos = i; |
| 52 | + break; |
| 53 | +-- |
| 54 | +2.45.4 |
| 55 | + |
0 commit comments