]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-h1: Be prepare to fail when EOM is added during trailers parsing
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 22 Nov 2018 10:44:35 +0000 (11:44 +0100)
committerWilly Tarreau <w@1wt.eu>
Sat, 1 Dec 2018 16:37:27 +0000 (17:37 +0100)
When trailers are parsed, we must add the corrresponsing HTX block and then we
must add the block end-of-message. But this last operation can failed because
there is not enough space the HTX message. This case was left aside till
now. Now, we stay in the state H1_MSG_TRAILERS with the warranty we will be able
to restart at the right stage.

src/mux_h1.c

index 77251cbc674a764930269dde5fcdd11a12c1369c..534e14d79b4922ea7703b5d087f6829a5e15a6da 100644 (file)
@@ -920,6 +920,7 @@ static size_t h1_process_data(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
                                if (!chksz) {
                                        if (!htx_add_endof(htx, HTX_BLK_EOD))
                                                goto end;
+                                       h1s->flags |= H1S_F_HAVE_EOD;
                                        h1m->state = H1_MSG_TRAILERS;
                                }
                                else
@@ -956,6 +957,11 @@ static size_t h1_process_data(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
                        }
 
                        if (h1m->state == H1_MSG_TRAILERS) {
+                               /* Trailers were alread parsed, only the EOM
+                                * need to be added */
+                               if (h1s->flags & H1S_F_HAVE_TLR)
+                                       goto skip_tlr_parsing;
+
                                ret = h1_measure_trailers(buf, *ofs, *ofs + max);
                                if (ret > data_space)
                                        ret = (htx_is_empty(htx) ? -1 : 0);
@@ -974,12 +980,12 @@ static size_t h1_process_data(struct h1s *h1s, struct h1m *h1m, struct htx *htx,
 
                                if (!htx_add_trailer(htx, ist2(b_peek(buf, *ofs), ret)))
                                        goto end;
+                               h1s->flags |= H1S_F_HAVE_TLR;
                                max -= ret;
                                *ofs += ret;
                                total += ret;
 
-                               /* FIXME: if it fails here, this is a problem,
-                                * because there is no way to return here. */
+                         skip_tlr_parsing:
                                if (!htx_add_endof(htx, HTX_BLK_EOM))
                                        goto end;
                                h1m->state = H1_MSG_DONE;