diff options
| author | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2006-06-17 22:48:48 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2006-06-17 22:48:48 -0700 | 
| commit | c5396a31b20991c856facbce18a2a56d1a14e8d0 (patch) | |
| tree | 39213f3e9cabee6ba2ffe7440a7a4efef8a1e033 /net | |
| parent | b293acfd3133393a81bcd382eb71a210c9cf9526 (diff) | |
| download | kernel_samsung_tuna-c5396a31b20991c856facbce18a2a56d1a14e8d0.zip kernel_samsung_tuna-c5396a31b20991c856facbce18a2a56d1a14e8d0.tar.gz kernel_samsung_tuna-c5396a31b20991c856facbce18a2a56d1a14e8d0.tar.bz2  | |
[IPV6]: Sum real space for RTAs.
This patch fixes RTNLGRP_IPV6_IFINFO netlink notifications.  Issue
pointed out by Patrick McHardy <kaber@trash.net>.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
| -rw-r--r-- | net/ipv6/addrconf.c | 28 | 
1 files changed, 24 insertions, 4 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 445006e..c2c26fa 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -2860,6 +2860,11 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)  	return inet6_addr_add(ifm->ifa_index, pfx, ifm->ifa_prefixlen);  } +/* Maximum length of ifa_cacheinfo attributes */ +#define INET6_IFADDR_RTA_SPACE \ +		RTA_SPACE(16) /* IFA_ADDRESS */ + \ +		RTA_SPACE(sizeof(struct ifa_cacheinfo)) /* CACHEINFO */ +  static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,  			     u32 pid, u32 seq, int event, unsigned int flags)  { @@ -3092,7 +3097,7 @@ static int inet6_dump_ifacaddr(struct sk_buff *skb, struct netlink_callback *cb)  static void inet6_ifa_notify(int event, struct inet6_ifaddr *ifa)  {  	struct sk_buff *skb; -	int size = NLMSG_SPACE(sizeof(struct ifaddrmsg)+128); +	int size = NLMSG_SPACE(sizeof(struct ifaddrmsg) + INET6_IFADDR_RTA_SPACE);  	skb = alloc_skb(size, GFP_ATOMIC);  	if (!skb) { @@ -3142,6 +3147,17 @@ static void inline ipv6_store_devconf(struct ipv6_devconf *cnf,  #endif  } +/* Maximum length of ifinfomsg attributes */ +#define INET6_IFINFO_RTA_SPACE \ +		RTA_SPACE(IFNAMSIZ) /* IFNAME */ + \ +		RTA_SPACE(MAX_ADDR_LEN) /* ADDRESS */ +	\ +		RTA_SPACE(sizeof(u32)) /* MTU */ + \ +		RTA_SPACE(sizeof(int)) /* LINK */ + \ +		RTA_SPACE(0) /* PROTINFO */ + \ +		RTA_SPACE(sizeof(u32)) /* FLAGS */ + \ +		RTA_SPACE(sizeof(struct ifla_cacheinfo)) /* CACHEINFO */ + \ +		RTA_SPACE(sizeof(__s32[DEVCONF_MAX])) /* CONF */ +  static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,   			     u32 pid, u32 seq, int event, unsigned int flags)  { @@ -3235,8 +3251,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)  void inet6_ifinfo_notify(int event, struct inet6_dev *idev)  {  	struct sk_buff *skb; -	/* 128 bytes ?? */ -	int size = NLMSG_SPACE(sizeof(struct ifinfomsg)+128); +	int size = NLMSG_SPACE(sizeof(struct ifinfomsg) + INET6_IFINFO_RTA_SPACE);  	skb = alloc_skb(size, GFP_ATOMIC);  	if (!skb) { @@ -3252,6 +3267,11 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)  	netlink_broadcast(rtnl, skb, 0, RTNLGRP_IPV6_IFINFO, GFP_ATOMIC);  } +/* Maximum length of prefix_cacheinfo attributes */ +#define INET6_PREFIX_RTA_SPACE \ +		RTA_SPACE(sizeof(((struct prefix_info *)NULL)->prefix)) /* ADDRESS */ + \ +		RTA_SPACE(sizeof(struct prefix_cacheinfo)) /* CACHEINFO */ +  static int inet6_fill_prefix(struct sk_buff *skb, struct inet6_dev *idev,  			struct prefix_info *pinfo, u32 pid, u32 seq,   			int event, unsigned int flags) @@ -3296,7 +3316,7 @@ static void inet6_prefix_notify(int event, struct inet6_dev *idev,  			 struct prefix_info *pinfo)  {  	struct sk_buff *skb; -	int size = NLMSG_SPACE(sizeof(struct prefixmsg)+128); +	int size = NLMSG_SPACE(sizeof(struct prefixmsg) + INET6_PREFIX_RTA_SPACE);  	skb = alloc_skb(size, GFP_ATOMIC);  	if (!skb) {  | 
