From: Willy Tarreau Date: Fri, 9 Sep 2011 06:21:55 +0000 (+0200) Subject: [MINOR] halog: do not consider byte 0x8A as end of line X-Git-Tag: v1.5-dev8~111 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96c148b0d22f461afe5d345ca9d93d0e8ccc7e78;p=thirdparty%2Fhaproxy.git [MINOR] halog: do not consider byte 0x8A as end of line A bug in the algorithm used to find an LF in multiple bytes at once made byte 0x80 trigger detection of byte 0x00, thus 0x8A matches byte 0x0A. In practice, this issue never happens since byte 0x8A won't be displayed in logs (or it will be encoded). This could still possibly happen in mixed logs. --- diff --git a/contrib/halog/fgets2-64.c b/contrib/halog/fgets2-64.c index 9aae45465c..7556a31c2d 100644 --- a/contrib/halog/fgets2-64.c +++ b/contrib/halog/fgets2-64.c @@ -21,7 +21,7 @@ #include #include -// return 1 if the integer contains at least one zero byte +// return non-zero if the integer contains at least one zero byte static inline unsigned int has_zero(unsigned int x) { unsigned int y; @@ -38,25 +38,21 @@ static inline unsigned int has_zero(unsigned int x) * we check in the final result if one of them is present and was not. */ y = x; - x = ~x & 0x80808080; /* save and invert bits 7, 15, 23, 31 */ - y &= 0x7F7F7F7F; /* clear them */ - y -= 0x01010101; /* generate a carry */ - y &= x; /* clear the bits that were already set */ - return !!y; + y -= 0x01010101; /* generate a carry */ + y &= ~x; /* clear the bits that were already set */ + return y & 0x80808080; } -// return 1 if the argument contains at least one zero byte. See principle above. -static inline unsigned int has_zero64(unsigned long long x) +// return non-zero if the argument contains at least one zero byte. See principle above. +static inline unsigned long long has_zero64(unsigned long long x) { unsigned long long y; y = x; - x = ~x & 0x8080808080808080ULL; /* save bits 7, 15, 23, 31, 39, 47, 55 and 63 */ - y &= 0x7F7F7F7F7F7F7F7FULL; /* clear them */ y -= 0x0101010101010101ULL; /* generate a carry */ - y &= x; /* clear the bits that were already set */ - return !!y; + y &= ~x; /* clear the bits that were already set */ + return y & 0x8080808080808080ULL; } #define FGETS2_BUFSIZE (256*1024) diff --git a/contrib/halog/fgets2.c b/contrib/halog/fgets2.c index 6c5bc6b0a9..11baa23131 100644 --- a/contrib/halog/fgets2.c +++ b/contrib/halog/fgets2.c @@ -21,7 +21,7 @@ #include #include -// return 1 if the integer contains at least one zero byte +// return non-zero if the integer contains at least one zero byte static inline unsigned int has_zero(unsigned int x) { unsigned int y; @@ -38,11 +38,9 @@ static inline unsigned int has_zero(unsigned int x) * we check in the final result if one of them is present and was not. */ y = x; - x = ~x & 0x80808080; /* save and invert bits 7, 15, 23, 31 */ - y &= 0x7F7F7F7F; /* clear them */ y -= 0x01010101; /* generate a carry */ - y &= x; /* clear the bits that were already set */ - return !!y; + y &= ~x; /* clear the bits that were already set */ + return y & 0x80808080; }