From 537a80278835d0f4290edce1bfc47d0624177cc5 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Fri, 24 Aug 2012 16:38:46 -0700 Subject: [PATCH] Add a missing null-check, turning a segfault into an assertion. Static analysis says: src\tcp_address.cpp(297): error V595: The 'res' pointer was utilized before it was verified against nullptr. Check lines: 297, 301. src\tcp_address.cpp(603): error V106: Implicit type conversion third argument 'full_bytes' of function 'memcmp' to memsize type. src\tcp_address.cpp(603): error V526: The 'memcmp' function returns 0 if corresponding buffers are equal. Consider examining the condition for mistakes. In fact the use of "memcmp" is correct, but the enclosing "if" isn't necessary, and the compiler is happier if "full_bytes" is a size_t. --- src/tcp_address.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/tcp_address.cpp b/src/tcp_address.cpp index 45d170ca..d29f722d 100644 --- a/src/tcp_address.cpp +++ b/src/tcp_address.cpp @@ -294,12 +294,12 @@ int zmq::tcp_address_t::resolve_interface (const char *interface_, } // Use the first result. + zmq_assert (res != NULL); zmq_assert ((size_t) (res->ai_addrlen) <= sizeof (address)); memcpy (&address, res->ai_addr, res->ai_addrlen); // Cleanup getaddrinfo after copying the possibly referenced result. - if (res) - freeaddrinfo (res); + freeaddrinfo (res); return 0; } @@ -598,11 +598,9 @@ const bool zmq::tcp_address_mask_t::match_address (const struct sockaddr *ss, co } if (address_mask < mask) mask = address_mask; - int full_bytes = mask / 8; - if (full_bytes) { - if (memcmp(our_bytes, their_bytes, full_bytes)) - return false; - } + size_t full_bytes = mask / 8; + if (memcmp(our_bytes, their_bytes, full_bytes)) + return false; uint8_t last_byte_bits = (0xffU << (8 - (mask % 8))) & 0xffU; if (last_byte_bits) {