BUG/MEDIUM: http-conv: Fix url_enc() to not crush const samples
authorChristopher Faulet <cfaulet@haproxy.com>
Fri, 8 Apr 2022 08:04:05 +0000 (10:04 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 29 Apr 2022 13:24:39 +0000 (15:24 +0200)
url_enc() encodes an input string by calling encode_string(). To do so, it
adds a trailing '\0' to the sample string. However it never restores the
sample string at the end. It is a problem for const samples. The sample
string may be in the middle of a buffer. For instance, the HTTP headers
values are concerned.

However, instead of modifying the sample string, it is easier to rely on
encode_chunk() function. It does the same but on a buffer.

This patch must be backported as far as 2.2.

(cherry picked from commit 21ac0eec280685174fbe368c4da0cb9cb8efd075)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit df968906e9718a0fe0e173d69988bd8d0374464e)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit 7c6b03efd48b785eb5c9787bfc1bd06043595f4a)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/http_conv.c

index b5abb95..7184d26 100644 (file)
@@ -325,16 +325,13 @@ static int sample_conv_url_enc(const struct arg *args, struct sample *smp, void
        if (args)
                enc_type = args->data.sint;
 
-       /* Add final \0 required by encode_string() */
-       smp->data.u.str.area[smp->data.u.str.data] = '\0';
-
        if (enc_type == ENC_QUERY)
                encode_map = query_encode_map;
        else
                return 0;
 
-       ret = encode_string(trash->area, trash->area + trash->size, '%',
-                           encode_map, smp->data.u.str.area);
+       ret = encode_chunk(trash->area, trash->area + trash->size, '%',
+                          encode_map, &smp->data.u.str);
        if (ret == NULL || *ret != '\0')
                return 0;
        trash->data = ret - trash->area;