From: Willy Tarreau Date: Mon, 25 Apr 2022 08:46:16 +0000 (+0200) Subject: MINOR: sample: make the bool type cast to bin X-Git-Tag: v2.6-dev8~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9f30f398b58ddda4f552eca465f18eb3cecfc40;p=thirdparty%2Fhaproxy.git MINOR: sample: make the bool type cast to bin Any type except bool could cast to bin, while it can cast to string. That's a bit inconsistent, and prevents a boolean from being used as the entry of a hash function while any other type can. This is a problem when passing via variable where someone could use: ... set-var(txn.bar) always_false to temporarily disable something, but this would result in an empty hash output when later doing: ... var(txn.bar),sdbm Instead of using c_int2bin() as is done for the string output, better enfore an set of inputs or exactly 0 or 1 so that a poorly written sample fetch function does not result in a difficult to debug hash output. --- diff --git a/src/sample.c b/src/sample.c index 1278ef9387..870f5dcd85 100644 --- a/src/sample.c +++ b/src/sample.c @@ -958,6 +958,17 @@ static int c_int2bin(struct sample *smp) return 1; } +static int c_bool2bin(struct sample *smp) +{ + struct buffer *chk = get_trash_chunk(); + + *(unsigned long long int *)chk->area = my_htonll(!!smp->data.u.sint); + chk->data = 8; + smp->data.u.str = *chk; + smp->data.type = SMP_T_BIN; + return 1; +} + /*****************************************************************/ /* Sample casts matrix: */ @@ -968,7 +979,7 @@ static int c_int2bin(struct sample *smp) sample_cast_fct sample_casts[SMP_TYPES][SMP_TYPES] = { /* to: ANY BOOL SINT ADDR IPV4 IPV6 STR BIN METH */ /* from: ANY */ { c_none, c_none, c_none, c_none, c_none, c_none, c_none, c_none, c_none, }, -/* BOOL */ { c_none, c_none, c_none, NULL, NULL, NULL, c_int2str, NULL, NULL, }, +/* BOOL */ { c_none, c_none, c_none, NULL, NULL, NULL, c_int2str, c_bool2bin, NULL, }, /* SINT */ { c_none, c_none, c_none, c_int2ip, c_int2ip, c_int2ipv6, c_int2str, c_int2bin, NULL, }, /* ADDR */ { c_none, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }, /* IPV4 */ { c_none, NULL, c_ip2int, c_none, c_none, c_ip2ipv6, c_ip2str, c_addr2bin, NULL, },