From 17254939c50707f06f2c248337990fc8e8d4d75b Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 2 Sep 2020 07:08:47 +0200 Subject: [PATCH] CLEANUP: http: silence a cppcheck warning in get_http_auth() In issue #777, cppcheck wrongly assumes a useless null pointer check in the expression below while it's obvious that in a 3G/1G split on 32-bit, len can become positive if p is NULL: p = memchr(ctx.value.ptr, ' ', ctx.value.len); len = p - ctx.value.ptr; if (!p || len <= 0) return 0; In addition, on 64 bits you never know given that len is a 32-bit signed int thus the sign of the result in case of a null p will always be the opposite of the 32th bit of ctx.value.ptr. Admittedly the test is ugly. Tim proposed this fix consisting in checking for p == ctx.value.ptr instead when checking for first character only, which Ilya confirmed is enough to shut cppcheck up. No backport is needed. --- src/http_fetch.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/http_fetch.c b/src/http_fetch.c index 460bfbd34..2149b7fa2 100644 --- a/src/http_fetch.c +++ b/src/http_fetch.c @@ -113,10 +113,10 @@ static int get_http_auth(struct sample *smp, struct htx *htx) if (!http_find_header(htx, hdr, &ctx, 0)) return 0; - p = memchr(ctx.value.ptr, ' ', ctx.value.len); - len = p - ctx.value.ptr; - if (!p || len <= 0) + p = memchr(ctx.value.ptr, ' ', ctx.value.len); + if (!p || p == ctx.value.ptr) /* if no space was found or if the space is the first character */ return 0; + len = p - ctx.value.ptr; if (chunk_initlen(&auth_method, ctx.value.ptr, 0, len) != 1) return 0;