A recent fix was introduced to ensure that a streamdesc instance won't
be attached to an already completed QCS which is eligible to purging.
This was performed by skipping application protocol decoding if a QCS is
in such a state. Here is the patch responsible for this change.
caf60ac696a29799631a76beb16d0072f65eef12
BUG/MEDIUM: mux-quic: do not attach on already closed stream
However, this is too restrictive, in particular for unidirection stream
where no streamdesc is never attached. To fix this behavior, first
qcs_attach_sc() API has been modified. Instead of returning a streamdesc
instance, it returns either 0 on success or a negative error code.
There should be no functional changes with this patch. It is only to be
able to extend qcs_attach_sc() with the possibility of skipping
streamdesc instantiation while still keeping a success return value.
This should be backported wherever the above patch has been merged. For
the record, it was scheduled for immediate backport on 3.1, plus merging
on older releases up to 2.8 after a period of observation.
int _qcc_report_glitch(struct qcc *qcc, int inc);
struct qcs *qcc_init_stream_local(struct qcc *qcc, int bidi);
void qcs_send_metadata(struct qcs *qcs);
-struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin);
+int qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin);
int qcs_is_close_local(struct qcs *qcs);
int qcs_is_close_remote(struct qcs *qcs);
htx_to_buf(htx, &htx_buf);
htx = NULL;
- if (!qcs_attach_sc(qcs, &htx_buf, fin)) {
+ if (qcs_attach_sc(qcs, &htx_buf, fin)) {
len = -1;
goto out;
}
htx->flags |= HTX_FL_EOM;
htx_to_buf(htx, &htx_buf);
- if (!qcs_attach_sc(qcs, &htx_buf, fin))
+ if (qcs_attach_sc(qcs, &htx_buf, fin))
return -1;
b_free(&htx_buf);
* the first received request data. <fin> must be set if the whole request is
* already received.
*
- * Returns the newly allocated instance on success or NULL on error.
+ * Returns 0 on success else a negative error code.
*/
-struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
+int qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
{
struct qcc *qcc = qcs->qcc;
struct session *sess = qcc->conn->owner;
if (!sc_new_from_endp(qcs->sd, sess, buf)) {
TRACE_DEVEL("leaving on error", QMUX_EV_STRM_RECV, qcc->conn, qcs);
- return NULL;
+ return -1;
}
/* QC_SF_HREQ_RECV must be set once for a stream. Else, nb_hreq counter
}
TRACE_LEAVE(QMUX_EV_STRM_RECV, qcc->conn, qcs);
- return qcs->sd->sc;
+ return 0;
}
/* Use this function for a stream <id> which is not in <qcc> stream tree. It