Commit ec95d049 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune Committed by Simon Stridsberg

http2_send: Proper null checks for h2 errors

parent 7fb01bdf
...@@ -239,11 +239,11 @@ h2_errcheck(const struct h2_req *r2, const struct h2_sess *h2) ...@@ -239,11 +239,11 @@ h2_errcheck(const struct h2_req *r2, const struct h2_sess *h2)
CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC); CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC); CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC);
if (r2->error) if (r2->error != NULL)
return (r2->error); return (r2->error);
if (h2->error && r2->stream > h2->goaway_last_stream) if (h2->error != NULL && r2->stream > h2->goaway_last_stream)
return (h2->error); return (h2->error);
return (0); return (NULL);
} }
static int64_t static int64_t
...@@ -263,15 +263,17 @@ h2_do_window(struct worker *wrk, struct h2_req *r2, ...@@ -263,15 +263,17 @@ h2_do_window(struct worker *wrk, struct h2_req *r2,
if (r2->t_window <= 0 || h2->req0->t_window <= 0) { if (r2->t_window <= 0 || h2->req0->t_window <= 0) {
r2->t_winupd = VTIM_real(); r2->t_winupd = VTIM_real();
h2_send_rel_locked(h2, r2); h2_send_rel_locked(h2, r2);
while (r2->t_window <= 0 && h2_errcheck(r2, h2) == 0) {
while (r2->t_window <= 0 && h2_errcheck(r2, h2) == NULL) {
r2->cond = &wrk->cond; r2->cond = &wrk->cond;
(void)h2_cond_wait(r2->cond, h2, r2); (void)h2_cond_wait(r2->cond, h2, r2);
r2->cond = NULL; r2->cond = NULL;
} }
while (h2->req0->t_window <= 0 && h2_errcheck(r2, h2) == 0)
while (h2->req0->t_window <= 0 && h2_errcheck(r2, h2) == NULL)
(void)h2_cond_wait(h2->winupd_cond, h2, r2); (void)h2_cond_wait(h2->winupd_cond, h2, r2);
if (h2_errcheck(r2, h2) == 0) { if (h2_errcheck(r2, h2) == NULL) {
w = vmin_t(int64_t, h2_win_limit(r2, h2), wanted); w = vmin_t(int64_t, h2_win_limit(r2, h2), wanted);
h2_win_charge(r2, h2, w); h2_win_charge(r2, h2, w);
assert (w > 0); assert (w > 0);
...@@ -279,7 +281,7 @@ h2_do_window(struct worker *wrk, struct h2_req *r2, ...@@ -279,7 +281,7 @@ h2_do_window(struct worker *wrk, struct h2_req *r2,
h2_send_get_locked(wrk, h2, r2); h2_send_get_locked(wrk, h2, r2);
} }
if (w == 0 && h2_errcheck(r2, h2) == 0) { if (w == 0 && h2_errcheck(r2, h2) == NULL) {
assert(r2->t_window > 0); assert(r2->t_window > 0);
assert(h2->req0->t_window > 0); assert(h2->req0->t_window > 0);
w = h2_win_limit(r2, h2); w = h2_win_limit(r2, h2);
...@@ -316,7 +318,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags, ...@@ -316,7 +318,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags,
AN(H2_SEND_HELD(h2, r2)); AN(H2_SEND_HELD(h2, r2));
if (h2_errcheck(r2, h2)) if (h2_errcheck(r2, h2) != NULL)
return; return;
AN(ftyp); AN(ftyp);
...@@ -341,7 +343,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags, ...@@ -341,7 +343,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags,
if (ftyp->respect_window) { if (ftyp->respect_window) {
tf = h2_do_window(wrk, r2, h2, (len > mfs) ? mfs : len); tf = h2_do_window(wrk, r2, h2, (len > mfs) ? mfs : len);
if (h2_errcheck(r2, h2)) if (h2_errcheck(r2, h2) != NULL)
return; return;
AN(H2_SEND_HELD(h2, r2)); AN(H2_SEND_HELD(h2, r2));
} else } else
...@@ -362,7 +364,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags, ...@@ -362,7 +364,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags,
if (ftyp->respect_window && p != ptr) { if (ftyp->respect_window && p != ptr) {
tf = h2_do_window(wrk, r2, h2, tf = h2_do_window(wrk, r2, h2,
(len > mfs) ? mfs : len); (len > mfs) ? mfs : len);
if (h2_errcheck(r2, h2)) if (h2_errcheck(r2, h2) != NULL)
return; return;
AN(H2_SEND_HELD(h2, r2)); AN(H2_SEND_HELD(h2, r2));
} }
...@@ -383,7 +385,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags, ...@@ -383,7 +385,7 @@ h2_send(struct worker *wrk, struct h2_req *r2, h2_frame ftyp, uint8_t flags,
ftyp = ftyp->continuation; ftyp = ftyp->continuation;
flags &= ftyp->flags; flags &= ftyp->flags;
final_flags &= ftyp->flags; final_flags &= ftyp->flags;
} while (!h2->error && len > 0); } while (h2->error == NULL && len > 0);
} }
} }
...@@ -396,6 +398,7 @@ H2_Send_RST(struct worker *wrk, struct h2_sess *h2, const struct h2_req *r2, ...@@ -396,6 +398,7 @@ H2_Send_RST(struct worker *wrk, struct h2_sess *h2, const struct h2_req *r2,
CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC); CHECK_OBJ_NOTNULL(h2, H2_SESS_MAGIC);
CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC); CHECK_OBJ_NOTNULL(r2, H2_REQ_MAGIC);
AN(H2_SEND_HELD(h2, r2)); AN(H2_SEND_HELD(h2, r2));
AN(h2e);
Lck_Lock(&h2->sess->mtx); Lck_Lock(&h2->sess->mtx);
VSLb(h2->vsl, SLT_Debug, "H2: stream %u: %s", stream, h2e->txt); VSLb(h2->vsl, SLT_Debug, "H2: stream %u: %s", stream, h2e->txt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment