Read all of the packet using MSG_PEEK for dynamic clients
authorAlan T. DeKok <aland@freeradius.org>
Wed, 27 May 2009 10:06:47 +0000 (12:06 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 27 May 2009 10:06:47 +0000 (12:06 +0200)
src/lib/radius.c
src/main/listen.c

index b49f0df..806b89f 100644 (file)
@@ -1820,6 +1820,7 @@ int rad_packet_ok(RADIUS_PACKET *packet, int flags)
  */
 RADIUS_PACKET *rad_recv(int fd, int flags)
 {
+       int sockflags = 0;
        RADIUS_PACKET           *packet;
 
        /*
@@ -1831,7 +1832,12 @@ RADIUS_PACKET *rad_recv(int fd, int flags)
        }
        memset(packet, 0, sizeof(*packet));
 
-       packet->data_len = rad_recvfrom(fd, &packet->data, 0,
+       if (flags & 0x02) {
+               sock_flags = MSG_PEEK;
+               flags &= ~0x02;
+       }
+
+       packet->data_len = rad_recvfrom(fd, &packet->data, sock_flags,
                                        &packet->src_ipaddr, &packet->src_port,
                                        &packet->dst_ipaddr, &packet->dst_port);
 
index e4446e8..1276f69 100644 (file)
@@ -209,12 +209,12 @@ RADCLIENT *client_listener_find(const rad_listen_t *listener,
 
        request->listener = listener;
        request->client = client;
-       request->packet = rad_alloc(0);
-       if (!request->packet) {
+       request->packet = rad_recv(listener->fd, 0x02); /* MSG_PEEK */
+       if (!request->packet) {                         /* badly formed, etc */
                request_free(&request);
                goto unknown;
        }
-       request->reply = rad_alloc(0);
+       request->reply = rad_alloc_reply(request->packet);
        if (!request->reply) {
                request_free(&request);
                goto unknown;
@@ -233,23 +233,6 @@ RADCLIENT *client_listener_find(const rad_listen_t *listener,
         *
         *      and create the RADCLIENT structure from that.
         */
-
-       sock = listener->data;
-       request->packet->sockfd = listener->fd;
-       request->packet->src_ipaddr = *ipaddr;
-       request->packet->src_port = 0; /* who cares... */
-       request->packet->dst_ipaddr = sock->ipaddr;
-       request->packet->dst_port = sock->port;
-
-       request->reply->sockfd = request->packet->sockfd;
-       request->reply->dst_ipaddr = request->packet->src_ipaddr;
-       request->reply->src_ipaddr = request->packet->dst_ipaddr;
-       request->reply->dst_port = request->packet->src_port;
-       request->reply->src_port = request->packet->dst_port;
-       request->reply->id = request->packet->id;
-       request->reply->code = 0; /* UNKNOWN code */
-
-       
        DEBUG("server %s {", request->server);
 
        rcode = module_authorize(0, request);