MINOR: mux-quic: change return value of qcs_attach_sc()

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.
  caf60ac696
  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.
This commit is contained in:
Amaury Denoyelle 2025-01-03 16:16:45 +01:00
parent 4f2554903b
commit af00be8e0f
4 changed files with 7 additions and 7 deletions

View File

@ -21,7 +21,7 @@ void qcc_set_error(struct qcc *qcc, int err, int app);
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);

View File

@ -915,7 +915,7 @@ static ssize_t h3_headers_to_htx(struct qcs *qcs, const struct buffer *buf,
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;
}

View File

@ -77,7 +77,7 @@ static ssize_t hq_interop_rcv_buf(struct qcs *qcs, struct buffer *b, int fin)
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);

View File

@ -899,9 +899,9 @@ void qcs_send_metadata(struct qcs *qcs)
* 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;
@ -913,7 +913,7 @@ struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
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
@ -959,7 +959,7 @@ struct stconn *qcs_attach_sc(struct qcs *qcs, struct buffer *buf, char fin)
}
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