x86: Work around compiler code generation bug with -Os
authorLinus Torvalds <torvalds@g5.osdl.org>
Sun, 15 Jan 2006 06:08:28 +0000 (22:08 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Sun, 15 Jan 2006 06:08:28 +0000 (22:08 -0800)
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: Linus Torvalds <torvalds@osdl.org>
net/ipv4/fib_frontend.c

index 5b25fc0d980c98655dc20814f0ba432cffcbb9e9..4e3d3811dea29f67c2cd701368ea3bb6a0c677a8 100644 (file)
@@ -289,13 +289,13 @@ static int inet_check_attr(struct rtmsg *r, struct rtattr **rta)
 {
        int i;
 
-       for (i=1; i<=RTA_MAX; i++) {
-               struct rtattr *attr = rta[i-1];
+       for (i=1; i<=RTA_MAX; i++, rta++) {
+               struct rtattr *attr = *rta;
                if (attr) {
                        if (RTA_PAYLOAD(attr) < 4)
                                return -EINVAL;
                        if (i != RTA_MULTIPATH && i != RTA_METRICS)
-                               rta[i-1] = (struct rtattr*)RTA_DATA(attr);
+                               *rta = (struct rtattr*)RTA_DATA(attr);
                }
        }
        return 0;