patch-2.4.19 linux-2.4.19/net/ipv6/addrconf.c
Next file: linux-2.4.19/net/ipv6/ndisc.c
Previous file: linux-2.4.19/net/ipv4/utils.c
Back to the patch index
Back to the overall index
- Lines: 52
- Date:
Fri Aug 2 17:39:46 2002
- Orig file:
linux-2.4.18/net/ipv6/addrconf.c
- Orig date:
Fri Dec 21 09:42:05 2001
diff -urN linux-2.4.18/net/ipv6/addrconf.c linux-2.4.19/net/ipv6/addrconf.c
@@ -62,6 +62,8 @@
#include <asm/uaccess.h>
+#define IPV6_MAX_ADDRESSES 16
+
/* Set to 3 to get tracing... */
#define ACONF_DEBUG 2
@@ -586,6 +588,18 @@
return err;
}
+int ipv6_count_addresses(struct inet6_dev *idev)
+{
+ int cnt = 0;
+ struct inet6_ifaddr *ifp;
+
+ read_lock_bh(&idev->lock);
+ for (ifp=idev->addr_list; ifp; ifp=ifp->if_next)
+ cnt++;
+ read_unlock_bh(&idev->lock);
+ return cnt;
+}
+
int ipv6_chk_addr(struct in6_addr *addr, struct net_device *dev)
{
struct inet6_ifaddr * ifp;
@@ -895,8 +909,12 @@
ifp = ipv6_get_ifaddr(&addr, dev);
if (ifp == NULL && valid_lft) {
- ifp = ipv6_add_addr(in6_dev, &addr, pinfo->prefix_len,
- addr_type&IPV6_ADDR_SCOPE_MASK, 0);
+ /* Do not allow to create too much of autoconfigured
+ * addresses; this would be too easy way to crash kernel.
+ */
+ if (ipv6_count_addresses(in6_dev) < IPV6_MAX_ADDRESSES)
+ ifp = ipv6_add_addr(in6_dev, &addr, pinfo->prefix_len,
+ addr_type&IPV6_ADDR_SCOPE_MASK, 0);
if (ifp == NULL) {
in6_dev_put(in6_dev);
@@ -1815,7 +1833,7 @@
break;
case RTM_DELADDR:
addrconf_leave_solict(ifp->idev->dev, &ifp->addr);
- if (!ipv6_chk_addr(&ifp->addr, ifp->idev->dev))
+ if (!ipv6_chk_addr(&ifp->addr, NULL))
ip6_rt_addr_del(&ifp->addr, ifp->idev->dev);
break;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)