: policer: restore compatibility with old iproute binaries
Subsystems (3)
[NET_SCHED]: policer: restore compatibility with old iproute binaries
The tc actions increased the size of struct tc_police, which broke compatibility with old iproute binaries since both the act_police and the old NET_CLS_POLICE code check for an exact size match.
Since the new members are not even used, the simple fix is to also accept the size of the old structure. Dumping is not affected since old userspace will receive a bigger structure, which is handled fine.
---
commit 8c69566fc6b34f819d1002fdc76cdb2611e37dcb
tree dd502f69be944acd744f19392f3e3145552ca6b2
parent c498fe066d393b0f677fd0a857c0b25f24dd2049
author Patrick McHardy <[email protected]> Sun, 26 Nov 2006 14:56:09 +0100 committer Patrick McHardy <[email protected]> Sun, 26 Nov 2006 14:56:09 +0100
net/sched/act_police.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-)
net/sched/act_police.c +22 -4
@@ -46,6 +46,18 @@ static struct tcf_hashinfo police_hash_i .lock = &police_lock, }; +/* old policer structure from before tc actions */ +struct tc_police_compat +{ +u32 index; +int action; +u32 limit; +u32 burst; +u32 mtu; +struct tc_ratespec rate; +struct tc_ratespec peakrate; +}; +/* Each policer is serialized by its individual spinlock */ #ifdef CONFIG_NET_CLS_ACT
@@ -131,12 +143,15 @@ static int tcf_act_police_locate(structstruct tc_police *parm;struct tcf_police *police;struct qdisc_rate_table *R_tab =NULL , *P_tab =NULL ; +int size;if (rta ==NULL ||rtattr_parse_nested (tb,TCA_POLICE_MAX , rta) <0 )return -EINVAL ; -if (tb[TCA_POLICE_TBF -1 ] ==NULL || -RTA_PAYLOAD (tb[TCA_POLICE_TBF -1 ]) !=sizeof (*parm)) +if (tb[TCA_POLICE_TBF -1 ] ==NULL ) +return -EINVAL ; + size =RTA_PAYLOAD (tb[TCA_POLICE_TBF -1 ]); +if (size !=sizeof (*parm) && size !=sizeof (struct tc_police_compat ))return -EINVAL ; parm =RTA_DATA (tb[TCA_POLICE_TBF -1 ]);
@@ -415,12 +430,15 @@ struct tcf_police *tcf_police_locate(strstruct tcf_police *police;struct rtattr *tb[TCA_POLICE_MAX ];struct tc_police *parm; +int size;if (rtattr_parse_nested (tb,TCA_POLICE_MAX , rta) <0 )return NULL ; -if (tb[TCA_POLICE_TBF -1 ] ==NULL || -RTA_PAYLOAD (tb[TCA_POLICE_TBF -1 ]) !=sizeof (*parm)) +if (tb[TCA_POLICE_TBF -1 ] ==NULL ) +return NULL ; + size =RTA_PAYLOAD (tb[TCA_POLICE_TBF -1 ]); +if (size !=sizeof (*parm) && size !=sizeof (struct tc_police_compat ))return NULL ; parm =RTA_DATA (tb[TCA_POLICE_TBF -1 ]);
A message that is not in the archive (sent off-list or not yet received): [email protected]
From: jamal <[email protected]>
Date: Thu, 30 Nov 2006 06:43:36 -0500
Quoted 14 lines · Patrick McHardy
Quoted 13 lines
[
NET_SCHED]: policer: restore compatibility with old iproute binariesThe tc actions increased the size of struct
tc_police, which broke compatibility with old iproute binaries since both theact_policeand the oldNET_CLS_POLICEcode check for an exact size match.Since the new members are not even used, the simple fix is to also accept the size of the old structure. Dumping is not affected since old userspace will receive a bigger structure, which is handled fine.
Quoted 7 lines
Quoted 1 line
Signed-off-by Patrick McHardy <[email protected]>Sorry, couldnt respond sooner. Was travelling and overloaded. Looks good although i havent run any of my tests. I will at some point.
Acked-by Jamal Hadi Salim
Applied to net-2.6.20, and I'll push this to -stable too.
Thanks everyone.