From 2789d05944048a87528e4b26f5992a7046b264c0 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 3 May 2025 14:03:46 +0000 Subject: [PATCH] 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 --- src/pakfire/xfer.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) 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) { -- 2.39.5