From: Michael Tremer Date: Sat, 3 May 2025 14:03:46 +0000 (+0000) Subject: xfer: Fix logic error in reading WebSocket messages X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2789d05944048a87528e4b26f5992a7046b264c0;p=pakfire.git xfer: Fix logic error in reading WebSocket messages After the message was read we never cleared the buffer which resulted that on every message, the callback was called with the entire buffer. Usually that meant that only the first JSON message was parsed and handled. Again and again and again... Signed-off-by: Michael Tremer --- diff --git a/src/pakfire/xfer.c b/src/pakfire/xfer.c index efbb19fd..c78afb7f 100644 --- a/src/pakfire/xfer.c +++ b/src/pakfire/xfer.c @@ -1052,14 +1052,24 @@ static int pakfire_xfer_socket_recv(struct pakfire_xfer* xfer) { DEBUG(xfer->ctx, "The message is binary\n"); } - // Once we have received the entire message we call the callback - if (xfer->callbacks.recv) { - r = xfer->callbacks.recv(xfer, xfer->recv_buffer.data, xfer->recv_buffer.length, xfer->callbacks.data); - if (r) - return r; + // If we don't have a callback, we log an error and throw away the message + if (!xfer->callbacks.recv) { + ERROR(xfer->ctx, "No receive callback set. Ignoring message.\n"); + r = -ENOTSUP; + goto ERROR; } - return 0; + // Once we have received the entire message we call the callback + r = xfer->callbacks.recv(xfer, + xfer->recv_buffer.data, xfer->recv_buffer.length, xfer->callbacks.data); + if (r < 0) + goto ERROR; + +ERROR: + // Clear the buffer + pakfire_buffer_clear(&xfer->recv_buffer); + + return r; } static int __pakfire_xfer_socket(sd_event_source* s, int fd, uint32_t events, void* data) {