]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
allow packet_list_recv() to return error
authorAlan T. DeKok <aland@freeradius.org>
Wed, 25 Feb 2026 15:15:31 +0000 (10:15 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 25 Feb 2026 15:33:32 +0000 (10:33 -0500)
so that we can close TCP sockets

src/bin/radclient.c
src/protocols/radius/list.c
src/protocols/radius/list.h

index 01b11cf056f2db11c231567208e35028c3f344f2..6be13ccedb81db0450743b83bf519c4c2cffbb80 100644 (file)
@@ -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");
 
                /*
index eb6c2658b24252ca7a6bd488342916b5e48aba23..3523310a6cd412d0cc1913fb391f2ca8a41886d1 100644 (file)
@@ -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)
index 1049161248f6fd43d4c440a97f09172e3983b610..89f7fa9c1b824713d25c7fd52f0e89bdad6fedef 100644 (file)
@@ -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);