From: Alan T. DeKok Date: Wed, 25 Feb 2026 15:15:31 +0000 (-0500) Subject: allow packet_list_recv() to return error X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca4430bf4d00e77160a0ac44e66c85d477ea408c;p=thirdparty%2Ffreeradius-server.git allow packet_list_recv() to return error so that we can close TCP sockets --- diff --git a/src/bin/radclient.c b/src/bin/radclient.c index 01b11cf056f..6be13ccedb8 100644 --- a/src/bin/radclient.c +++ b/src/bin/radclient.c @@ -1423,6 +1423,7 @@ static int blast_radius_check(rc_request_t *request, fr_packet_t *reply) */ static int recv_one_packet(fr_time_delta_t wait_time) { + int rcode; fd_set set; fr_time_delta_t our_wait_time; rc_request_t *request; @@ -1465,8 +1466,8 @@ retry: /* * Look for the packet. */ - reply = fr_packet_list_recv(packet_list, &set, RADIUS_MAX_ATTRIBUTES, false); - if (!reply) { + rcode = fr_packet_list_recv(packet_list, &set, NULL, &reply, RADIUS_MAX_ATTRIBUTES, false); + if (rcode < 0) { ERROR("Received bad packet"); /* diff --git a/src/protocols/radius/list.c b/src/protocols/radius/list.c index eb6c2658b24..3523310a6cd 100644 --- a/src/protocols/radius/list.c +++ b/src/protocols/radius/list.c @@ -670,12 +670,12 @@ int fr_packet_list_fd_set(fr_packet_list_t *pl, fd_set *set) * FIXME: Add socket.fd, if -1, do round-robin, else do socket.fd * IF in fdset. */ -fr_packet_t *fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set, uint32_t max_attributes, bool require_message_authenticator) +int fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set, TALLOC_CTX *ctx, fr_packet_t **packet_p, uint32_t max_attributes, bool require_message_authenticator) { int start; fr_packet_t *packet; - if (!pl || !set) return NULL; + if (!pl || !set) return 0; start = pl->last_recv; do { @@ -689,7 +689,7 @@ fr_packet_t *fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set, uint32_t max if (pl->sockets[start].socket.type == SOCK_STREAM) { packet = fr_tcp_recv(pl->sockets[start].socket.fd, false); } else - packet = fr_packet_recv(NULL, pl->sockets[start].socket.fd, UDP_FLAGS_NONE, + packet = fr_packet_recv(ctx, pl->sockets[start].socket.fd, UDP_FLAGS_NONE, max_attributes, require_message_authenticator); if (!packet) continue; @@ -700,10 +700,11 @@ fr_packet_t *fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set, uint32_t max pl->last_recv = start; packet->socket.type = pl->sockets[start].socket.type; - return packet; + *packet_p = packet; + return 0; } while (start != pl->last_recv); - return NULL; + return 0; } uint32_t fr_packet_list_num_incoming(fr_packet_list_t *pl) diff --git a/src/protocols/radius/list.h b/src/protocols/radius/list.h index 1049161248f..89f7fa9c1b8 100644 --- a/src/protocols/radius/list.h +++ b/src/protocols/radius/list.h @@ -55,7 +55,7 @@ bool fr_packet_list_socket_del(fr_packet_list_t *pl, int sockfd); bool fr_packet_list_socket_freeze(fr_packet_list_t *pl, int sockfd); bool fr_packet_list_socket_thaw(fr_packet_list_t *pl, int sockfd); int fr_packet_list_fd_set(fr_packet_list_t *pl, fd_set *set); -fr_packet_t *fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set, uint32_t max_attributes, bool require_message_authenticator); +int fr_packet_list_recv(fr_packet_list_t *pl, fd_set *set, TALLOC_CTX *ctx, fr_packet_t **packet, uint32_t max_attributes, bool require_message_authenticator); uint32_t fr_packet_list_num_incoming(fr_packet_list_t *pl); uint32_t fr_packet_list_num_outgoing(fr_packet_list_t *pl);