From: Marc-Antoine Perennou Date: Sun, 22 Jun 2014 10:36:03 +0000 (+0900) Subject: fix in_addr_prefix_intersect for 32bits X-Git-Tag: v215~226 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=57827c087c3d32920136842f242bf4183cbfcb35;ds=inline fix in_addr_prefix_intersect for 32bits shifting from a non fixed number of bits >= to the size of the type leads to weird results, handle the special case of << 32 to fix it. This was causing a test failure from test-socket-util: Assertion 'in_addr_prefix_intersect(f, &ua, apl, &ub, bpl) == result' failed at /var/tmp/paludis/build/sys-apps-systemd-scm/work/systemd-scm/src/test/test-socket-util.c:147, function test_in_addr_prefix_intersect_one(). Aborting. Minimal reproducer: paludisbuild@Lou /tmp $ cat test.c static void test(unsigned m) { unsigned nm = 0xFFFFFFFFUL << (32-m); printf("%u: %x\n", m, nm); } int main (void) { test(1); test(0); return 0; } paludisbuild@Lou /tmp $ gcc -m32 -std=gnu99 test.c -o test32 paludisbuild@Lou /tmp $ ./test32 1: 80000000 0: ffffffff paludisbuild@Lou /tmp $ gcc -std=gnu99 test.c -o test64 paludisbuild@Lou /tmp $ ./test64 1: 80000000 0: 0 --- diff --git a/src/shared/socket-util.c b/src/shared/socket-util.c index f8c6795e7..6f4979853 100644 --- a/src/shared/socket-util.c +++ b/src/shared/socket-util.c @@ -695,7 +695,7 @@ int in_addr_prefix_intersect( uint32_t x, nm; x = be32toh(a->in.s_addr ^ b->in.s_addr); - nm = 0xFFFFFFFFUL << (32 - m); + nm = (m == 0) ? 0 : 0xFFFFFFFFUL << (32 - m); return (x & nm) == 0; }