From: Willy Tarreau Date: Tue, 11 Aug 2020 08:26:36 +0000 (+0200) Subject: BUG/MINOR: stats: use strncmp() instead of memcmp() on health states X-Git-Tag: v2.3-dev3~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7b52485f1afb7d420633d7794549ec0549d1e2d7;p=thirdparty%2Fhaproxy.git BUG/MINOR: stats: use strncmp() instead of memcmp() on health states The reports for health states are checked using memcmp() in order to only focus on the first word and possibly ignore trailing %d/%d etc. This makes gcc unhappy about a potential use of "" as the string, which never happens since the string is always set. This resulted in commit c4e6460f6 ("MINOR: build: Disable -Wstringop-overflow.") to silence these messages. However some lengths are incorrect (though cannot cause trouble), and in the end strncmp() is just safer and cleaner. This can be backported to all stable branches as it will shut a warning with gcc 8 and above. --- diff --git a/src/stats.c b/src/stats.c index 562cd82733..5248a6c2f9 100644 --- a/src/stats.c +++ b/src/stats.c @@ -935,7 +935,7 @@ static int stats_dump_fields_html(struct buffer *out, style = "going_down"; } - if (memcmp(field_str(stats, ST_F_STATUS), "MAINT", 5) == 0) + if (strncmp(field_str(stats, ST_F_STATUS), "MAINT", 5) == 0) chunk_appendf(out, ""); else chunk_appendf(out, @@ -1107,15 +1107,15 @@ static int stats_dump_fields_html(struct buffer *out, */ - if (memcmp(field_str(stats, ST_F_STATUS), "MAINT", 5) == 0) { + if (strncmp(field_str(stats, ST_F_STATUS), "MAINT", 5) == 0) { chunk_appendf(out, "%s MAINT", human_time(stats[ST_F_LASTCHG].u.u32, 1)); } - else if (memcmp(field_str(stats, ST_F_STATUS), "no check", 5) == 0) { + else if (strcmp(field_str(stats, ST_F_STATUS), "no check") == 0) { chunk_strcat(out, "no check"); } else { chunk_appendf(out, "%s %s", human_time(stats[ST_F_LASTCHG].u.u32, 1), field_str(stats, ST_F_STATUS)); - if (memcmp(field_str(stats, ST_F_STATUS), "DOWN", 4) == 0) { + if (strncmp(field_str(stats, ST_F_STATUS), "DOWN", 4) == 0) { if (stats[ST_F_CHECK_HEALTH].u.u32) chunk_strcat(out, " ↑"); } @@ -1123,7 +1123,7 @@ static int stats_dump_fields_html(struct buffer *out, chunk_strcat(out, " ↓"); } - if (memcmp(field_str(stats, ST_F_STATUS), "DOWN", 4) == 0 && + if (strncmp(field_str(stats, ST_F_STATUS), "DOWN", 4) == 0 && stats[ST_F_AGENT_STATUS].type && !stats[ST_F_AGENT_HEALTH].u.u32) { chunk_appendf(out, " %s",