]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: http: don't store exp_replace() result in the trash's length
authorWilly Tarreau <w@1wt.eu>
Wed, 22 Aug 2018 02:46:47 +0000 (04:46 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 22 Aug 2018 03:16:32 +0000 (05:16 +0200)
By convenience or laziness we used to store exp_replace()'s return code
into trash.data. The result checks applied there compare trash.data to -1
while it's now unsigned since commit 843b7cb ("MEDIUM: chunks: make the
chunk struct's fields match the buffer struct "). Let's clean this up
and test the result itself without storing it first.

No backport is needed.

src/proto_http.c

index 6a1722f39d74f83873f4ad1ca5fda0a0b21567b0..2605c770e603132c8d1014414c6bf4b86da52772 100644 (file)
@@ -2421,20 +2421,18 @@ int http_transform_header_str(struct stream* s, struct http_msg *msg,
 
        while (http_find_hdr_func(name, name_len, buf, idx, &ctx)) {
                struct hdr_idx_elem *hdr = idx->v + ctx.idx;
-               int delta;
+               int delta, len;
                char *val = ctx.line + ctx.val;
                char* val_end = val + ctx.vlen;
 
                if (!regex_exec_match2(re, val, val_end-val, MAX_MATCH, pmatch, 0))
                        continue;
 
-               output->data = exp_replace(output->area, output->size, val,
-                                         str, pmatch);
-               if (output->data == -1)
+               len = exp_replace(output->area, output->size, val, str, pmatch);
+               if (len == -1)
                        return -1;
 
-               delta = b_rep_blk(&msg->chn->buf, val, val_end, output->area,
-                                 output->data);
+               delta = b_rep_blk(&msg->chn->buf, val, val_end, output->area, len);
 
                hdr->len += delta;
                http_msg_move_end(msg, delta);
@@ -6524,7 +6522,7 @@ int apply_filter_to_req_headers(struct stream *s, struct channel *req, struct hd
        int cur_idx, old_idx, last_hdr;
        struct http_txn *txn = s->txn;
        struct hdr_idx_elem *cur_hdr;
-       int delta;
+       int delta, len;
 
        last_hdr = 0;
 
@@ -6571,14 +6569,14 @@ int apply_filter_to_req_headers(struct stream *s, struct channel *req, struct hd
                                break;
 
                        case ACT_REPLACE:
-                               trash.data = exp_replace(trash.area,
-                                                       trash.size, cur_ptr,
-                                                       exp->replace, pmatch);
-                               if (trash.data < 0)
+                               len = exp_replace(trash.area,
+                                                 trash.size, cur_ptr,
+                                                 exp->replace, pmatch);
+                               if (len < 0)
                                        return -1;
 
-                               delta = b_rep_blk(&req->buf, cur_ptr, cur_end,
-                                                 trash.area, trash.data);
+                               delta = b_rep_blk(&req->buf, cur_ptr, cur_end, trash.area, len);
+
                                /* FIXME: if the user adds a newline in the replacement, the
                                 * index will not be recalculated for now, and the new line
                                 * will not be counted as a new header.
@@ -6625,7 +6623,7 @@ int apply_filter_to_req_line(struct stream *s, struct channel *req, struct hdr_e
        char *cur_ptr, *cur_end;
        int done;
        struct http_txn *txn = s->txn;
-       int delta;
+       int delta, len;
 
        if (unlikely(txn->flags & (TX_CLDENY | TX_CLTARPIT)))
                return 1;
@@ -6662,13 +6660,13 @@ int apply_filter_to_req_line(struct stream *s, struct channel *req, struct hdr_e
                        break;
 
                case ACT_REPLACE:
-                       trash.data = exp_replace(trash.area, trash.size,
-                                               cur_ptr, exp->replace, pmatch);
-                       if (trash.data < 0)
+                       len = exp_replace(trash.area, trash.size,
+                                         cur_ptr, exp->replace, pmatch);
+                       if (len < 0)
                                return -1;
 
-                       delta = b_rep_blk(&req->buf, cur_ptr, cur_end,
-                                         trash.area, trash.data);
+                       delta = b_rep_blk(&req->buf, cur_ptr, cur_end, trash.area, len);
+
                        /* FIXME: if the user adds a newline in the replacement, the
                         * index will not be recalculated for now, and the new line
                         * will not be counted as a new header.
@@ -7271,7 +7269,7 @@ int apply_filter_to_resp_headers(struct stream *s, struct channel *rtr, struct h
        int cur_idx, old_idx, last_hdr;
        struct http_txn *txn = s->txn;
        struct hdr_idx_elem *cur_hdr;
-       int delta;
+       int delta, len;
 
        last_hdr = 0;
 
@@ -7312,14 +7310,14 @@ int apply_filter_to_resp_headers(struct stream *s, struct channel *rtr, struct h
                                break;
 
                        case ACT_REPLACE:
-                               trash.data = exp_replace(trash.area,
-                                                       trash.size, cur_ptr,
-                                                       exp->replace, pmatch);
-                               if (trash.data < 0)
+                               len = exp_replace(trash.area,
+                                                 trash.size, cur_ptr,
+                                                 exp->replace, pmatch);
+                               if (len < 0)
                                        return -1;
 
-                               delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end,
-                                                 trash.area, trash.data);
+                               delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end, trash.area, len);
+
                                /* FIXME: if the user adds a newline in the replacement, the
                                 * index will not be recalculated for now, and the new line
                                 * will not be counted as a new header.
@@ -7364,8 +7362,7 @@ int apply_filter_to_sts_line(struct stream *s, struct channel *rtr, struct hdr_e
        char *cur_ptr, *cur_end;
        int done;
        struct http_txn *txn = s->txn;
-       int delta;
-
+       int delta, len;
 
        if (unlikely(txn->flags & TX_SVDENY))
                return 1;
@@ -7396,13 +7393,13 @@ int apply_filter_to_sts_line(struct stream *s, struct channel *rtr, struct hdr_e
                        break;
 
                case ACT_REPLACE:
-                       trash.data = exp_replace(trash.area, trash.size,
-                                               cur_ptr, exp->replace, pmatch);
-                       if (trash.data < 0)
+                       len = exp_replace(trash.area, trash.size,
+                                         cur_ptr, exp->replace, pmatch);
+                       if (len < 0)
                                return -1;
 
-                       delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end,
-                                         trash.area, trash.data);
+                       delta = b_rep_blk(&rtr->buf, cur_ptr, cur_end, trash.area, len);
+
                        /* FIXME: if the user adds a newline in the replacement, the
                         * index will not be recalculated for now, and the new line
                         * will not be counted as a new header.