From: Willy Tarreau Date: Tue, 29 Oct 2019 12:02:15 +0000 (+0100) Subject: MINOR: chunk: add chunk_istcat() to concatenate an ist after a chunk X-Git-Tag: v2.1-dev4~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=20020ae804033e67675802031adcd0f3983f15ef;p=thirdparty%2Fhaproxy.git MINOR: chunk: add chunk_istcat() to concatenate an ist after a chunk We previously relied on chunk_cat(dst, b_fromist(src)) for this but it is not reliable as the allocated buffer is inside the expression and may be on a temporary stack. While it's possible to allocate stack space for a struct and return a pointer to it, it's not possible to initialize it form a temporary variable to prevent arguments from being evaluated multiple times. Since this is only used to append an ist after a chunk, let's instead have a chunk_istcat() function to perform exactly this from a native ist. The only call place (URI computation in the cache) was updated. --- diff --git a/include/common/chunk.h b/include/common/chunk.h index 18abca7bdd..e44feea516 100644 --- a/include/common/chunk.h +++ b/include/common/chunk.h @@ -27,6 +27,7 @@ #include #include +#include #include @@ -117,6 +118,17 @@ static inline int chunk_cat(struct buffer *chk, const struct buffer *src) return 1; } +/* appends ist after . Returns 0 in case of failure. */ +static inline int chunk_istcat(struct buffer *chk, const struct ist src) +{ + if (unlikely(chk->data + src.len > chk->size)) + return 0; + + memcpy(chk->area + chk->data, src.ptr, src.len); + chk->data += src.len; + return 1; +} + /* copies memory area into for bytes. Returns 0 in * case of failure. No trailing zero is added. */ diff --git a/src/cache.c b/src/cache.c index 2ca745a94e..8e2acd1cb1 100644 --- a/src/cache.c +++ b/src/cache.c @@ -1097,10 +1097,10 @@ int sha1_hosturi(struct stream *s) * well. */ if (!(sl->flags & HTX_SL_F_HAS_AUTHORITY)) { - chunk_cat(trash, b_fromist(ist("https://"))); + chunk_istcat(trash, ist("https://")); if (!http_find_header(htx, ist("Host"), &ctx, 0)) return 0; - chunk_cat(trash, b_fromist(ctx.value)); + chunk_istcat(trash, ctx.value); } chunk_memcat(trash, uri.ptr, uri.len);