Skip to content

Commit

Permalink
bufq: make write/pass methods more robust
Browse files Browse the repository at this point in the history
- related to curl#11242 where curl enters busy loop when
  sending http2 data to the server

Closes curl#11247
  • Loading branch information
icing authored and ptitSeb committed Sep 25, 2023
1 parent f873281 commit 58565fb
Showing 1 changed file with 23 additions and 5 deletions.
28 changes: 23 additions & 5 deletions lib/bufq.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,8 @@ ssize_t Curl_bufq_write(struct bufq *q,
break;
}
n = chunk_append(tail, buf, len);
DEBUGASSERT(n);
if(!n)
break;
nwritten += n;
buf += n;
len -= n;
Expand Down Expand Up @@ -528,6 +529,14 @@ ssize_t Curl_bufq_pass(struct bufq *q, Curl_bufq_writer *writer,
}
break;
}
if(!chunk_written) {
if(!nwritten) {
/* treat as blocked */
*err = CURLE_AGAIN;
nwritten = -1;
}
break;
}
Curl_bufq_skip(q, (size_t)chunk_written);
nwritten += chunk_written;
}
Expand All @@ -551,7 +560,8 @@ ssize_t Curl_bufq_write_pass(struct bufq *q,
/* real error, fail */
return -1;
}
/* would block */
/* would block, bufq is full, give up */
break;
}
}

Expand All @@ -562,16 +572,24 @@ ssize_t Curl_bufq_write_pass(struct bufq *q,
/* real error, fail */
return -1;
}
/* no room in bufq, bail out */
goto out;
/* no room in bufq */
break;
}
/* edge case of writer returning 0 (and len is >0)
* break or we might enter an infinite loop here */
if(n == 0)
break;

/* Maybe only part of `data` has been added, continue to loop */
buf += (size_t)n;
len -= (size_t)n;
nwritten += (size_t)n;
}

out:
if(!nwritten && len) {
*err = CURLE_AGAIN;
return -1;
}
return nwritten;
}

Expand Down

0 comments on commit 58565fb

Please sign in to comment.