fix off-by-one error in IPAddress::longestCommonPrefix()
authorAdam Simpkins <simpkins@fb.com>
Fri, 18 Apr 2014 18:53:32 +0000 (11:53 -0700)
committerDave Watson <davejwatson@fb.com>
Tue, 20 May 2014 19:53:46 +0000 (12:53 -0700)
Summary:
Fix an off-by-one error causing an ASAN abort.  When calling
longestCommonPrefix() with a full mask, it would compare one byte past
the end of the address data, and would end up writing past the end of
the ba array on the stack.

Test Plan:
Built with ASAN, ran the unit tests, and verified the ASAN failure was
gone.

Reviewed By: jasmeetbagga@fb.com

FB internal diff: D1284750

folly/detail/IPAddress.h

index 7f1095e..476f1fa 100644 (file)
@@ -121,7 +121,7 @@ struct Bytes : private boost::noncopyable {
     // Compare a byte at a time. Note - I measured compared this with
     // going multiple bytes at a time (8, 4, 2 and 1). It turns out
     // to be 20 - 25% slower for 4 and 16 byte arrays.
     // Compare a byte at a time. Note - I measured compared this with
     // going multiple bytes at a time (8, 4, 2 and 1). It turns out
     // to be 20 - 25% slower for 4 and 16 byte arrays.
-    while (byteIndex * 8 <= mask && one[byteIndex] == two[byteIndex]) {
+    while (byteIndex * 8 < mask && one[byteIndex] == two[byteIndex]) {
       ba[byteIndex] = one[byteIndex];
       ++byteIndex;
     }
       ba[byteIndex] = one[byteIndex];
       ++byteIndex;
     }