Show who is sending the wrong packets
authorJorge Pereira <jpereiran@gmail.com>
Sat, 26 Sep 2015 02:16:51 +0000 (23:16 -0300)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 26 Sep 2015 02:29:42 +0000 (22:29 -0400)
src/lib/radius.c

index 590e594..6d0173d 100644 (file)
@@ -364,60 +364,59 @@ ssize_t rad_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, uint16_t *src_port,
        struct sockaddr_storage src;
        socklen_t               sizeof_src = sizeof(src);
 
-       data_len = recvfrom(sockfd, header, sizeof(header), MSG_PEEK,
-                           (struct sockaddr *)&src, &sizeof_src);
+       data_len = recvfrom(sockfd, header, sizeof(header), MSG_PEEK, (struct sockaddr *)&src, &sizeof_src);
        if (data_len < 0) {
                if ((errno == EAGAIN) || (errno == EINTR)) return 0;
                return -1;
        }
 
        /*
+        *      Convert AF.  If unknown, discard packet.
+        */
+       if (!fr_sockaddr2ipaddr(&src, sizeof_src, src_ipaddr, src_port)) {
+               FR_DEBUG_STRERROR_PRINTF("Unkown address family");
+               rad_recv_discard(sockfd);
+
+               return 1;
+       }
+
+       /*
         *      Too little data is available, discard the packet.
         */
        if (data_len < 4) {
                FR_DEBUG_STRERROR_PRINTF("Expected at least 4 bytes of header data, got %zu bytes", data_len);
+invalid:
+               FR_DEBUG_STRERROR_PRINTF("Invalid data from %s:  %s",
+                                        fr_inet_ntop(src_ipaddr->af, &src_ipaddr->ipaddr),
+                                        fr_strerror());
                rad_recv_discard(sockfd);
 
                return 1;
+       }
 
-       } else {                /* we got 4 bytes of data. */
-               /*
-                *      See how long the packet says it is.
-                */
-               packet_len = (header[2] * 256) + header[3];
-
-               /*
-                *      The length in the packet says it's less than
-                *      a RADIUS header length: discard it.
-                */
-               if (packet_len < RADIUS_HDR_LEN) {
-                       FR_DEBUG_STRERROR_PRINTF("Expected at least " STRINGIFY(RADIUS_HDR_LEN)  " bytes of packet "
-                                                "data, got %zu bytes", packet_len);
-                       rad_recv_discard(sockfd);
-
-                       return 1;
-
-                       /*
-                        *      Enforce RFC requirements, for sanity.
-                        *      Anything after 4k will be discarded.
-                        */
-               } else if (packet_len > MAX_PACKET_LEN) {
-                       FR_DEBUG_STRERROR_PRINTF("Length field value too large, expected maximum of "
-                                                STRINGIFY(MAX_PACKET_LEN) " bytes, got %zu bytes", packet_len);
-                       rad_recv_discard(sockfd);
+       /*
+        *      See how long the packet says it is.
+        */
+       packet_len = (header[2] * 256) + header[3];
 
-                       return 1;
-               }
+       /*
+        *      The length in the packet says it's less than
+        *      a RADIUS header length: discard it.
+        */
+       if (packet_len < RADIUS_HDR_LEN) {
+               FR_DEBUG_STRERROR_PRINTF("Expected at least " STRINGIFY(RADIUS_HDR_LEN)  " bytes of packet "
+                                        "data, got %zu bytes", packet_len);
+               goto invalid;
        }
 
        /*
-        *      Convert AF.  If unknown, discard packet.
+        *      Enforce RFC requirements, for sanity.
+        *      Anything after 4k will be discarded.
         */
-       if (!fr_sockaddr2ipaddr(&src, sizeof_src, src_ipaddr, src_port)) {
-               FR_DEBUG_STRERROR_PRINTF("Unkown address family");
-               rad_recv_discard(sockfd);
-
-               return 1;
+       if (packet_len > MAX_PACKET_LEN) {
+               FR_DEBUG_STRERROR_PRINTF("Length field value too large, expected maximum of "
+                                        STRINGIFY(MAX_PACKET_LEN) " bytes, got %zu bytes", packet_len);
+               goto invalid;
        }
 
        *code = header[0];