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 7f1095e05a93e4d38808932e0b698368bc3ec787..476f1fa10bf750fddf208e125a1383c88fd3c192 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.
-    while (byteIndex * 8 <= mask && one[byteIndex] == two[byteIndex]) {
+    while (byteIndex * 8 < mask && one[byteIndex] == two[byteIndex]) {
       ba[byteIndex] = one[byteIndex];
       ++byteIndex;
     }