]> git.ipfire.org Git - thirdparty/curl.git/commit
websocket: fix message send corruption
authorStefan Eissing <stefan@eissing.org>
Thu, 2 Jan 2025 15:34:52 +0000 (16:34 +0100)
committerJay Satiro <raysatiro@yahoo.com>
Thu, 16 Jan 2025 21:19:07 +0000 (16:19 -0500)
commit02edae54e8b3953b8aeb0ff91be86d5db2169670
tree9e329fbbb85321e5dc0f78519d77b74c3cc115ea
parent86f5653721865fc9c0dbab2f30e3b8040af957cd
websocket: fix message send corruption

- Fix a bug in EAGAIN handling when sending frames that led to a
  corrupted last byte of the frame sent.

- Restore sanity to curl_ws_send() behaviour:

  - Partial writes are reported as OK with the actual number of
    payload bytes sent.

  - CURLE_AGAIN is only returned when none of the payload bytes
    (or for 0-length frames, not all of the frame header bytes)
    could be sent.

  - curl_ws_send() now behaves like a common send() call.

- Change 'ws-data' test client to allow concurrent send/recv
  operations and vary frame sizes and repeat count.

- Add DEBUG env var CURL_WS_CHUNK_EAGAIN to simulate blocking
  after a chunk of an encoded websocket frame has been sent.

- Add tests.

Prior to this change data corruption may occur when sending websocket
messages due to two bugs:

1) 3e64569a (precedes 8.10.0) caused a data corruption bug in the last
   byte of frame of large messages.

2) curl_ws_send had non-traditional send behavior and could return
   CURLE_AGAIN with bytes sent and expect the caller to adjust buffer
   and buflen in a subsequent call. That behavior was not documented.

Reported-by: na-trium-144@users.noreply.github.com
Fixes https://github.com/curl/curl/issues/15865
Fixes https://github.com/curl/curl/issues/15865#issuecomment-2569870144
Closes https://github.com/curl/curl/pull/15901
docs/libcurl/libcurl-env-dbg.md
lib/bufq.c
lib/bufq.h
lib/ws.c
lib/ws.h
tests/http/clients/ws-data.c
tests/http/test_20_websockets.py