lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 23 Dec 2011 05:10:14 +0100 From: Eric Dumazet <eric.dumazet@...il.com> To: Xi Wang <xi.wang@...il.com> Cc: Tom Herbert <therbert@...gle.com>, "David S. Miller" <davem@...emloft.net>, netdev@...r.kernel.org Subject: Re: [PATCH v2] rps: fix insufficient bounds checking in store_rps_dev_flow_table_cnt() Le jeudi 22 décembre 2011 à 18:35 -0500, Xi Wang a écrit : > Setting a large rps_flow_cnt like (1 << 30) on 32-bit platform will > cause a kernel oops due to insufficient bounds checking. > > if (count > 1<<30) { > /* Enforce a limit to prevent overflow */ > return -EINVAL; > } > count = roundup_pow_of_two(count); > table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count)); > > Note that the macro RPS_DEV_FLOW_TABLE_SIZE(count) is defined as: > > ... + (count * sizeof(struct rps_dev_flow)) > > where sizeof(struct rps_dev_flow) is 8. (1 << 30) * 8 will overflow > 32 bits. > > This patch replaces the magic number (1 << 30) with a symbolic bound. > > Suggested-by: Eric Dumazet <eric.dumazet@...il.com> > Signed-off-by: Xi Wang <xi.wang@...il.com> > --- > net/core/net-sysfs.c | 7 +++++-- > 1 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c > index c71c434..385aefe 100644 > --- a/net/core/net-sysfs.c > +++ b/net/core/net-sysfs.c > @@ -665,11 +665,14 @@ static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue, > if (count) { > int i; > > - if (count > 1<<30) { > + if (count > INT_MAX) > + return -EINVAL; > + count = roundup_pow_of_two(count); > + if (count > (ULONG_MAX - sizeof(struct rps_dev_flow_table)) Oh well, you added a bug here, since count is "unsigned int" Why mixing INT_MAX in the previous test and ULONG_MAX here ? > + / sizeof(struct rps_dev_flow)) { > /* Enforce a limit to prevent overflow */ > return -EINVAL; > } > - count = roundup_pow_of_two(count); > table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count)); > if (!table) > return -ENOMEM; -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists