fs/exec.c: work around icc miscompilation
authorXi Wang <xi.wang@gmail.com>
Fri, 11 Jan 2013 22:31:48 +0000 (14:31 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 11 Jan 2013 22:54:55 +0000 (14:54 -0800)
commit6d92d4f6a74766cc885b18218268e0c47fbca399
tree9feb7c205f8062ffc1982948d2ffc446cbf94a6b
parent7964c06d66c76507d8b6b662bffea770c29ef0ce
fs/exec.c: work around icc miscompilation

The tricky problem is this check:

if (i++ >= max)

icc (mis)optimizes this check as:

if (++i > max)

The check now becomes a no-op since max is MAX_ARG_STRINGS (0x7FFFFFFF).

This is "allowed" by the C standard, assuming i++ never overflows,
because signed integer overflow is undefined behavior.  This
optimization effectively reverts the previous commit 362e6663ef23
("exec.c, compat.c: fix count(), compat_count() bounds checking") that
tries to fix the check.

This patch simply moves ++ after the check.

Signed-off-by: Xi Wang <xi.wang@gmail.com>
Cc: Jason Baron <jbaron@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/exec.c