]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
correctly set output for partial reads
authorAlan T. DeKok <aland@freeradius.org>
Thu, 16 Jul 2026 23:35:00 +0000 (19:35 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 17 Jul 2026 12:36:55 +0000 (08:36 -0400)
src/protocols/radius/tcp.c

index 18ec854a3e030e93f95722f9333e171cc6b6c4f7..76cf928bebfbd1ed16ca2dd648c4df95228b7573 100644 (file)
@@ -43,14 +43,17 @@ ssize_t fr_tcp_read_packet(int sockfd, uint8_t *buffer, size_t size, size_t *tot
        end = buffer + size;
 
        slen = recv(sockfd, start, (size_t) (end - start), 0);
-       if (slen <= 0) return -1;
+       if (slen <= 0) return -1; /* 0 means EOF for non-blocking TCP reads */
 
        packet_len = *total + slen;
 
        /*
-        *      Not enough for a header, die.
+        *      Not enough for a header, we don't have a packet.
         */
-       if (packet_len < 4) return 0;
+       if (packet_len < 4) {
+               *total = packet_len;
+               return 0;
+       }
 
        hdr_len = fr_nbo_to_uint16(buffer + 2);
        if ((hdr_len < RADIUS_HEADER_LENGTH) || (hdr_len >  RADIUS_MAX_PACKET_SIZE)) return -1;
@@ -67,5 +70,6 @@ ssize_t fr_tcp_read_packet(int sockfd, uint8_t *buffer, size_t size, size_t *tot
                return -1;
        }
 
+       *total = hdr_len;
        return hdr_len;
 }