From 11101add57f214dc3d83c87aabac75355852fdd2 Mon Sep 17 00:00:00 2001 From: Bruin06 <15325335+bruin06@user.noreply.gitee.com> Date: Fri, 4 Jul 2025 14:47:07 +0800 Subject: [PATCH] CVE-2025-24912 Signed-off-by: Bruin06 <419738327@qq.com> --- wpa_supplicant-2.9/src/radius/radius_client.c | 25 +++++++++++-------- .../src/radius/radius_client.c | 25 +++++++++++-------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/wpa_supplicant-2.9/src/radius/radius_client.c b/wpa_supplicant-2.9/src/radius/radius_client.c index a3db404..6f2b251 100755 --- a/wpa_supplicant-2.9/src/radius/radius_client.c +++ b/wpa_supplicant-2.9/src/radius/radius_client.c @@ -821,7 +821,7 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) struct radius_hdr *hdr; struct radius_rx_handler *handlers; size_t num_handlers, i; - struct radius_msg_list *req, *prev_req; + struct radius_msg_list *req, *prev_req, *r; struct os_reltime now; struct hostapd_radius_server *rconf; int invalid_authenticator = 0; @@ -877,7 +877,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) break; } - prev_req = NULL; req = radius->msgs; while (req) { /* TODO: also match by src addr:port of the packet when using @@ -889,7 +888,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) hdr->identifier) break; - prev_req = req; req = req->next; } @@ -912,13 +910,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) roundtrip / 100, roundtrip % 100); rconf->round_trip_time = roundtrip; - /* Remove ACKed RADIUS packet from retransmit list */ - if (prev_req) - prev_req->next = req->next; - else - radius->msgs = req->next; - radius->num_msgs--; - for (i = 0; i < num_handlers; i++) { RadiusRxResult res; res = handlers[i].handler(msg, req->msg, req->shared_secret, @@ -929,6 +920,19 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) radius_msg_free(msg); /* fall through */ case RADIUS_RX_QUEUED: + /* Remove ACKed RADIUS packet from retransmit list */ + prev_req = NULL; + for (r = radius->msgs; r; r = r->next) { + if (r == req) + break; + prev_req = r; + } + if (prev_req) + prev_req->next = req->next; + else + radius->msgs = req->next; + radius->num_msgs--; + radius_client_msg_free(req); return; case RADIUS_RX_INVALID_AUTHENTICATOR: @@ -950,7 +954,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) msg_type, hdr->code, hdr->identifier, invalid_authenticator ? " [INVALID AUTHENTICATOR]" : ""); - radius_client_msg_free(req); fail: radius_msg_free(msg); diff --git a/wpa_supplicant-2.9_standard/src/radius/radius_client.c b/wpa_supplicant-2.9_standard/src/radius/radius_client.c index 5f26576..d576338 100644 --- a/wpa_supplicant-2.9_standard/src/radius/radius_client.c +++ b/wpa_supplicant-2.9_standard/src/radius/radius_client.c @@ -1105,7 +1105,7 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) struct radius_hdr *hdr; struct radius_rx_handler *handlers; size_t num_handlers, i; - struct radius_msg_list *req, *prev_req; + struct radius_msg_list *req, *prev_req, *r; struct os_reltime now; struct hostapd_radius_server *rconf; int invalid_authenticator = 0; @@ -1230,7 +1230,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) break; } - prev_req = NULL; req = radius->msgs; while (req) { /* TODO: also match by src addr:port of the packet when using @@ -1242,7 +1241,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) hdr->identifier) break; - prev_req = req; req = req->next; } @@ -1265,13 +1263,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) roundtrip / 100, roundtrip % 100); rconf->round_trip_time = roundtrip; - /* Remove ACKed RADIUS packet from retransmit list */ - if (prev_req) - prev_req->next = req->next; - else - radius->msgs = req->next; - radius->num_msgs--; - for (i = 0; i < num_handlers; i++) { RadiusRxResult res; res = handlers[i].handler(msg, req->msg, req->shared_secret, @@ -1282,6 +1273,19 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) radius_msg_free(msg); __attribute__((fallthrough)); case RADIUS_RX_QUEUED: + /* Remove ACKed RADIUS packet from retransmit list */ + prev_req = NULL; + for (r = radius->msgs; r; r = r->next) { + if (r == req) + break; + prev_req = r; + } + if (prev_req) + prev_req->next = req->next; + else + radius->msgs = req->next; + radius->num_msgs--; + radius_client_msg_free(req); return; case RADIUS_RX_INVALID_AUTHENTICATOR: @@ -1303,7 +1307,6 @@ static void radius_client_receive(int sock, void *eloop_ctx, void *sock_ctx) msg_type, hdr->code, hdr->identifier, invalid_authenticator ? " [INVALID AUTHENTICATOR]" : ""); - radius_client_msg_free(req); fail: radius_msg_free(msg); -- Gitee