avoid endless loop in processipcp, processipv6cp
[l2tpns.git] / l2tpns.c
index 5fe05c9..804e1ad 100644 (file)
--- a/l2tpns.c
+++ b/l2tpns.c
@@ -4,7 +4,7 @@
 // Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
 // vim: sw=8 ts=8
 
-char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.153 2005/12/19 06:08:42 bodea Exp $";
+char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.156 2006/02/17 13:27:07 bodea Exp $";
 
 #include <arpa/inet.h>
 #include <assert.h>
@@ -2918,7 +2918,7 @@ static void regular_cleanups(double period)
                        *q = EchoReq;
                        *(uint8_t *)(q + 1) = (time_now % 255); // ID
                        *(uint16_t *)(q + 2) = htons(8); // Length
-                       *(uint32_t *)(q + 4) = 0; // Magic Number (not supported)
+                       *(uint32_t *)(q + 4) = session[s].ppp.lcp == Opened ? htonl(session[s].magic) : 0; // Magic Number
 
                        LOG(4, s, session[s].tunnel, "No data in %d seconds, sending LCP ECHO\n",
                                        (int)(time_now - session[s].last_packet));
@@ -3301,9 +3301,17 @@ static void mainloop(void)
                                        break;
 
                                case FD_TYPE_RADIUS: // RADIUS response
-                                       s = recv(radfds[d->index], buf, sizeof(buf), 0);
+                                       alen = sizeof(addr);
+                                       s = recvfrom(radfds[d->index], buf, sizeof(buf), MSG_WAITALL, (void *) &addr, &alen);
                                        if (s >= 0 && config->cluster_iam_master)
-                                               processrad(buf, s, d->index);
+                                       {
+                                               if (addr.sin_addr.s_addr == config->radiusserver[0] ||
+                                                   addr.sin_addr.s_addr == config->radiusserver[1])
+                                                       processrad(buf, s, d->index);
+                                               else
+                                                       LOG(3, 0, 0, "Dropping RADIUS packet from unknown source %s\n",
+                                                               fmtaddr(addr.sin_addr.s_addr, 0));
+                                       }
 
                                        n--;
                                        break;
@@ -3949,7 +3957,7 @@ static void initippool()
                else
                {
                        // It's a single ip address
-                       add_to_ip_pool(inet_addr(pool), 0);
+                       add_to_ip_pool(ntohl(inet_addr(pool)), 0);
                }
        }
        fclose(f);