提交 caf5b04c 编写于 作者: L Linus Torvalds

x86: Work around compiler code generation bug with -Os

Some versions of gcc generate incorrect code for the inet_check_attr()
function, apparently due to a totally bogus index -> pointer comparison
transformation.

At least "gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)" from FC4 is
affected, possibly others too.

This changes the function subtly so that the buggy gcc transformation
doesn't trigger.
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 650eec5e
...@@ -289,13 +289,13 @@ static int inet_check_attr(struct rtmsg *r, struct rtattr **rta) ...@@ -289,13 +289,13 @@ static int inet_check_attr(struct rtmsg *r, struct rtattr **rta)
{ {
int i; int i;
for (i=1; i<=RTA_MAX; i++) { for (i=1; i<=RTA_MAX; i++, rta++) {
struct rtattr *attr = rta[i-1]; struct rtattr *attr = *rta;
if (attr) { if (attr) {
if (RTA_PAYLOAD(attr) < 4) if (RTA_PAYLOAD(attr) < 4)
return -EINVAL; return -EINVAL;
if (i != RTA_MULTIPATH && i != RTA_METRICS) if (i != RTA_MULTIPATH && i != RTA_METRICS)
rta[i-1] = (struct rtattr*)RTA_DATA(attr); *rta = (struct rtattr*)RTA_DATA(attr);
} }
} }
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册