For whatever reason, in my testing, using memchr() here improves performance over strchr() by a great deal. Fixes bug 24826; bugfix on 0.3.1.1-alpha.
@@ -0,0 +1,4 @@
+ o Minor bugfixes (performance, fragile-hardening):
+ - Improve the performance of our consensus-diff application code when Tor
+ is built with the --enable-fragile-hardening option set. Fixes bug
+ 24826; bugfix on 0.3.1.1-alpha.
@@ -1285,8 +1285,11 @@ consdiff_apply_diff(const smartlist_t *cons1,
STATIC int
consensus_split_lines(smartlist_t *out, const char *s, memarea_t *area)
{
+ const char *end_of_str = s + strlen(s);
+ tor_assert(*end_of_str == '\0');
+
while (*s) {
- const char *eol = strchr(s, '\n');
+ const char *eol = memchr(s, '\n', end_of_str - s);
if (!eol) {
/* File doesn't end with newline. */
return -1;