XFRM policy expire
Subsystems (3)
PATCH 1/1 XFRM policy expire
Hi,
the attached patch fixes a bug in xfrm_send_policy_notify(). The space allocated in skb must include 'sizeof(struct xfrm_user_polexpire)', not 'sizeof(struct xfrm_userpolicy_info)' which is shorter. On ia32 it worked, probably because of some space gained from aligning. Unfortunately on amd64 it didn't and finally led to BUG() & kernel hangup.
Please apply.
BTW The second patch attached does some obvious cleanup: replaces RTA_ALIGN(RTA_LENGTH(x)) with RTA_SPACE(x) and ditto for NLMSG_*() macros. Apply on top of the first one or drop it. It's up to you.
Michal Ludvig
Signature · 3 lines
SUSE Labs [email protected] | Cray is the only computer (+420) 296.545.373 http://www.suse.cz | that runs an endless loop Personal homepage http://www.logix.cz/michal | in just four hours.
net/xfrm/xfrm_user.c +1 -1
@@ -1153,7 +1153,7 @@ static int xfrm_send_policy_notify(struc len =sizeof (struct xfrm_user_tmpl ) * xp->xfrm_nr; len =RTA_ALIGN (RTA_LENGTH (len)); - len +=NLMSG_ALIGN (NLMSG_LENGTH (sizeof (struct xfrm_userpolicy_info ))); + len +=NLMSG_ALIGN (NLMSG_LENGTH (sizeof (struct xfrm_user_polexpire ))); skb =alloc_skb (len,GFP_ATOMIC );if (skb ==NULL )return -ENOMEM ;
net/xfrm/xfrm_user.c +4 -6
@@ -1052,9 +1052,8 @@ static int xfrm_send_acquire(struct xfrmstruct sk_buff *skb;size_t len; - len =RTA_LENGTH (sizeof (struct xfrm_user_tmpl ) * xp->xfrm_nr); - len =RTA_ALIGN (len); - len +=NLMSG_ALIGN (NLMSG_LENGTH (sizeof (struct xfrm_user_acquire ))); + len =RTA_SPACE (sizeof (struct xfrm_user_tmpl ) * xp->xfrm_nr); + len +=NLMSG_SPACE (sizeof (struct xfrm_user_acquire )); skb =alloc_skb (len,GFP_ATOMIC );if (skb ==NULL )return -ENOMEM ;
@@ -1151,9 +1150,8 @@ static int xfrm_send_policy_notify(strucstruct sk_buff *skb;size_t len; - len =sizeof (struct xfrm_user_tmpl ) * xp->xfrm_nr; - len =RTA_ALIGN (RTA_LENGTH (len)); - len +=NLMSG_ALIGN (NLMSG_LENGTH (sizeof (struct xfrm_user_polexpire ))); + len =RTA_SPACE (sizeof (struct xfrm_user_tmpl ) * xp->xfrm_nr); + len +=NLMSG_SPACE (sizeof (struct xfrm_user_polexpire )); skb =alloc_skb (len,GFP_ATOMIC );if (skb ==NULL )return -ENOMEM ;
David S. Miller
AppliedQuoted 5 lines · On Tue, 24 Feb 2004 10:09:46 +0100 Michal Ludvig <[email protected]> wrote:
the attached patch fixes a bug in
xfrm_send_policy_notify(). The space allocated in skb must include 'sizeof(struct xfrm_user_polexpire)', not 'sizeof(struct xfrm_userpolicy_info)' which is shorter. On ia32 it worked, probably because of some space gained from aligning. Unfortunately on amd64 it didn't and finally led toBUG()& kernel hangup.
Applied, thanks Michal.
Quoted 3 lines
BTW The second patch attached does some obvious cleanup: replaces RTA_ALIGN(RTA_LENGTH(x)) with
RTA_SPACE(x)and ditto for NLMSG_*() macros. Apply on top of the first one or drop it. It's up to you.
This is fine too, also applied.
Thanks again.