From 1727648e108cb60ed48b2ee0949fa06f2b5768e8 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 22 Nov 2018 11:44:35 +0100 Subject: [PATCH] MINOR: mux-h1: Be prepare to fail when EOM is added during trailers parsing 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 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mux_h1.c b/src/mux_h1.c index 77251cbc6..534e14d79 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -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;