]> granicus.if.org Git - spl/commit
sysmacros: Make P2ROUNDUP not trigger int overflow
authorJason Zaman <jason@perfinion.com>
Sat, 24 Oct 2015 06:15:58 +0000 (14:15 +0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 13 Nov 2015 23:21:52 +0000 (15:21 -0800)
commit8fc851b7b5315c9cae92557be6c32e1ee236201f
treee6160fb2a305295b35305e0107dec4b6299c32a1
parentf5f2b87df0362242b13b8183a2a8d88be63b0e73
sysmacros: Make P2ROUNDUP not trigger int overflow

The original P2ROUNDUP and P2ROUNDUP_TYPED macros contain -x which
triggers PaX's integer overflow detection for unsigned integers.
Replace the macros with an equivalent version that does not trigger
the overflow.

Axioms:
A. (-(x)) === (~((x) - 1)) === (~(x) + 1) under two's complement.
B. ~(x & y) === ((~(x)) | (~(y))) under De Morgan's law.
C. ~(~x) === x under the law of excluded middle.

Proof:
0. (-(-(x) & -(align))) original
1. (~(-(x) & -(align)) + 1) by A
2. (((~(-(x))) | (~(-(align)))) + 1) by B
3. (((~(~((x) - 1))) | (~(~((align) - 1)))) + 1) by A
4. (((((x) - 1)) | (((align) - 1))) + 1) by C
Q.E.D.

Signed-off-by: Jason Zaman <jason@perfinion.com>
Reviewed-by: Chris Dunlop <chris@onthe.net.au>
Reviewed-by: Richard Yao <ryao@gentoo.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes zfsonlinux/zfs#2505
Closes #488
include/sys/sysmacros.h