From 6cb8e687f038424ef54b5c5c3c433be974fbe371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 2 Feb 2015 21:32:28 -0500 Subject: [PATCH] network-address,test-network: avoid undefined behaviour --- src/network/networkd-address.c | 4 ++++ src/network/test-network.c | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index ce0e923..47033ac 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -592,6 +592,10 @@ bool address_equal(Address *a1, Address *a2) { case AF_INET: if (a1->prefixlen != a2->prefixlen) return false; + else if (a1->prefixlen == 0) + /* make sure we don't try to shift by 32. + * See ISO/IEC 9899:TC3 ยง 6.5.7.3. */ + return true; else { uint32_t b1, b2; diff --git a/src/network/test-network.c b/src/network/test-network.c index ea9f938..b4a7be0 100644 --- a/src/network/test-network.c +++ b/src/network/test-network.c @@ -158,10 +158,9 @@ static void test_address_equality(void) { assert_se(address_equal(a1, a2)); assert_se(inet_pton(AF_INET, "192.168.3.9", &a1->in_addr.in)); - assert_se(!address_equal(a1, a2)); + assert_se(address_equal(a1, a2)); assert_se(inet_pton(AF_INET, "192.168.3.9", &a2->in_addr.in)); assert_se(address_equal(a1, a2)); - a1->prefixlen = 10; assert_se(!address_equal(a1, a2)); a2->prefixlen = 10; -- 2.3.0