From: Aurelien DARRAGON Date: Thu, 28 Nov 2024 11:58:37 +0000 (+0100) Subject: MINOR: log: always consider "+M" option in lf_text_len() X-Git-Tag: v3.2-dev1~84 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e37976166b66205c4ff2530e8a2b85ae3c50524c;p=thirdparty%2Fhaproxy.git MINOR: log: always consider "+M" option in lf_text_len() Historically, when lf_text_len() or lf_text() were called with a NULL string and "+M" option was set, "-" would be printed. However, if the input string was simply an empty one with len > 0, then nothing would be printed. This can happen if lf_text() is called with an empty string because in this case len is set to size (indeed, for performance reasons we don't pre-compute the length, we stop as soon as we encounter a NULL-byte) In practise, a lot of call places making use of lf_text() or lf_text_len() try their best to avoid calling lf_text() with an empty string, and instead explicitly call lf_text_len() with NULL as parameter to consider the "+M" option. But this is not enough, as shown in GH #2797, there could still be places where lf_text() is called with an empty string. In such case, instead of ignoring the "+M" option, let's check after _lf_text_len() if the returned pointer differs from the original one. If both are equal, then it means that nothing was printed (ie: result of empty string): in that case we check the "+M" option to print "-" when possible. While this commit seems harmless, it's probably better to avoid backporting it since it could break existing applications relying on the historical behavior. --- diff --git a/src/log.c b/src/log.c index ac94f5fbc7..441e692850 100644 --- a/src/log.c +++ b/src/log.c @@ -2461,21 +2461,23 @@ static inline char *_lf_quotetext_len(char *dst, const char *src, */ static char *lf_text_len(char *dst, const char *src, size_t len, size_t size, struct lf_buildctx *ctx) { + char *ret; + if ((ctx->options & (LOG_OPT_QUOTE | LOG_OPT_ENCODE_JSON))) return _lf_quotetext_len(dst, src, len, size, ctx); - else if ((ctx->options & LOG_OPT_ENCODE_CBOR) || - (src && len)) - return _lf_text_len(dst, src, len, size, ctx); - if (size < 2) - return NULL; + ret = _lf_text_len(dst, src, len, size, ctx); + if (dst != ret || + (ctx->options & LOG_OPT_ENCODE_CBOR) || + !(ctx->options & LOG_OPT_MANDATORY)) + return ret; - if ((ctx->options & LOG_OPT_MANDATORY)) - return _lf_text_len(dst, "-", 1, size, ctx); + /* empty output and "+M" option is set, try to print '-' */ - *dst = '\0'; + if (size < 2) + return NULL; - return dst; + return _lf_text_len(dst, "-", 1, size, ctx); } /*