← Commit list

f2d008811d

Stefan Eissing
Stefan Eissing
2026-01-08
SUCCESS Duration: 339s

Subject

ngtcp2: stabilize recv

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

lib/vquic/curl_ngtcp2.c+22 -13
@@ -1396,6 +1396,7 @@ static CURLcode cf_ngtcp2_recv(struct Curl_cfilter *cf, struct Curl_easy *data,
struct cf_call_data save;
struct pkt_io_ctx pktx;
CURLcode result = CURLE_OK;
+ int i;
(void)ctx;
(void)buf;
@@ -1422,21 +1423,29 @@ static CURLcode cf_ngtcp2_recv(struct Curl_cfilter *cf, struct Curl_easy *data,
cf_ngtcp2_ack_stream(cf, data, stream);
- if(cf_progress_ingress(cf, data, &pktx)) {
- result = CURLE_RECV_ERROR;
- goto out;
- }
+ /* first check for results/closed already known without touching
+ * the connection. For an already failed/closed stream, errors on
+ * the connection do not count.
+ * Then handle incoming data and check for failed/closed again.
+ */
+ for(i = 0; i < 2; ++i) {
+ if(stream->xfer_result) {
+ CURL_TRC_CF(data, cf, "[%" PRId64 "] xfer write failed", stream->id);
+ cf_ngtcp2_stream_close(cf, data, stream);
+ result = stream->xfer_result;
+ goto out;
+ }
+ else if(stream->closed) {
+ result = recv_closed_stream(cf, data, stream, pnread);
+ goto out;
+ }
- if(stream->xfer_result) {
- CURL_TRC_CF(data, cf, "[%" PRId64 "] xfer write failed", stream->id);
- cf_ngtcp2_stream_close(cf, data, stream);
- result = stream->xfer_result;
- goto out;
- }
- else if(stream->closed) {
- result = recv_closed_stream(cf, data, stream, pnread);
- goto out;
+ if(!i && cf_progress_ingress(cf, data, &pktx)) {
+ result = CURLE_RECV_ERROR;
+ goto out;
+ }
}
+
result = CURLE_AGAIN;
out: