]> git.ipfire.org Git - pakfire.git/commitdiff
xfer: Fix logic error in reading WebSocket messages
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 3 May 2025 14:03:46 +0000 (14:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 3 May 2025 14:03:46 +0000 (14:03 +0000)
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 <michael.tremer@ipfire.org>
src/pakfire/xfer.c

index efbb19fde4066ab3751cf539c76d40e22b95a59d..c78afb7f0c0ef2e2524ed9576ce75b981d7d55cc 100644 (file)
@@ -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) {