outbuf.data += p - b_tail(&outbuf);
+ if (outbuf.data - 4 > spop_conn->max_frame_size)
+ goto too_big;
+
/* update the frame's size now */
TRACE_PROTO("SPOP HAPROXY DISCONNECT frame xferred", SPOP_EV_TX_FRAME|SPOP_EV_TX_DISCO, spop_conn->conn, 0, 0, (size_t[]){outbuf.data});
spop_set_frame_size(outbuf.area, outbuf.data - 4);
return ret;
full:
/* Too large to be encoded. For DISCONNECT frame, it is an error */
- if (!b_data(mbuf)) {
- TRACE_ERROR("SPOP HAPROXY DISCO frame too large", SPOP_EV_TX_FRAME|SPOP_EV_TX_DISCO|SPOP_EV_SPOP_CONN_ERR, spop_conn->conn);
- goto fail;
- }
+ if (!b_data(mbuf))
+ goto too_big;
if ((mbuf = br_tail_add(spop_conn->mbuf)) != NULL)
goto retry;
TRACE_STATE("mbuf ring full", SPOP_EV_TX_FRAME|SPOP_EV_SPOP_CONN_BLK, spop_conn->conn);
ret = 0;
goto end;
+
+ too_big:
+ TRACE_ERROR("SPOP HAPROXY DISCO frame too large", SPOP_EV_TX_FRAME|SPOP_EV_TX_DISCO|SPOP_EV_SPOP_CONN_ERR, spop_conn->conn);
+
fail:
spop_conn->state = SPOP_CS_CLOSED;
TRACE_STATE("switching to CLOSED", SPOP_EV_TX_FRAME|SPOP_EV_TX_DISCO|SPOP_EV_SPOP_CONN_END, spop_conn->conn);
outbuf.data += p - b_tail(&outbuf);
+ if (outbuf.data - 4 > spop_conn->max_frame_size)
+ goto too_big;
+
/* update the frame's size now */
TRACE_PROTO("SPOP HAPROXY NOTIFY frame xferred", SPOP_EV_TX_FRAME|SPOP_EV_TX_NOTIFY, spop_conn->conn, spop_strm, 0, (size_t[]){outbuf.data});
spop_set_frame_size(outbuf.area, outbuf.data - 4);
return ret;
full:
/* Too large to be encoded. For NOTIFY frame, it is an error */
- if (!b_data(mbuf)) {
- TRACE_ERROR("SPOP HAPROXY NOTIFY frame too large", SPOP_EV_TX_FRAME|SPOP_EV_TX_NOTIFY|SPOP_EV_SPOP_STRM_ERR, spop_conn->conn, spop_strm);
- spop_strm_error(spop_strm, SPOP_ERR_TOO_BIG);
- goto fail;
- }
+ if (!b_data(mbuf))
+ goto too_big;
if ((mbuf = br_tail_add(spop_conn->mbuf)) != NULL)
goto retry;
TRACE_STATE("mbuf ring full", SPOP_EV_TX_FRAME|SPOP_EV_TX_NOTIFY|SPOP_EV_SPOP_STRM_BLK, spop_conn->conn, spop_strm);
ret = 0;
goto end;
+
+ too_big:
+ TRACE_ERROR("SPOP HAPROXY NOTIFY frame too large", SPOP_EV_TX_FRAME|SPOP_EV_TX_NOTIFY|SPOP_EV_SPOP_STRM_ERR, spop_conn->conn, spop_strm);
+ spop_strm_error(spop_strm, SPOP_ERR_TOO_BIG);
+
fail:
TRACE_DEVEL("leaving on error", SPOP_EV_TX_FRAME|SPOP_EV_TX_NOTIFY|SPOP_EV_SPOP_STRM_ERR, spop_conn->conn, spop_strm);
return 0;