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.
#include <common/buf.h>
#include <common/config.h>
+#include <common/ist.h>
#include <common/memory.h>
return 1;
}
+/* appends ist <src> after <chk>. 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 <src> into <chk> for <len> bytes. Returns 0 in
* case of failure. No trailing zero is added.
*/
* 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);