ubusd: fix tx_queue linked list usage
authorAlexander Van Parys <alexander.vanparys_ext@softathome.com>
Wed, 30 Jun 2021 18:12:46 +0000 (20:12 +0200)
committerPetr Štetiar <ynezz@true.cz>
Thu, 1 Jul 2021 11:52:24 +0000 (13:52 +0200)
Use the correct parameters for list_add_tail when enqueueing a message
in the tx_queue. Previously, list_add_tail(list, entry) was used instead
of list_add_tail(entry, list). Due to this, the list would only contain
the latest entry, and previously inserted entries were left dangling.

Reset the tx_queue offset after a message from the tx_queue has been sent
completely.

Signed-off-by: Alexander Van Parys <alexander.vanparys_ext@softathome.com>
(cherry picked from commit 4fc532c8a55ba8217ad67d7fd47c5eb9a8aba044)

ubusd.c
ubusd_main.c

diff --git a/ubusd.c b/ubusd.c
index 0e1b0c961b0688b565fda9272ae93d1a378e26fb..1d76b72e42867de81f2527bc288bc017535b5f0b 100644 (file)
--- a/ubusd.c
+++ b/ubusd.c
@@ -154,7 +154,7 @@ static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)
        INIT_LIST_HEAD(&ubl->list);
        ubl->msg = ubus_msg_ref(ub);
 
-       list_add_tail(&cl->tx_queue, &ubl->list);
+       list_add_tail(&ubl->list, &cl->tx_queue);
        cl->txq_len += ub->len;
 }
 
index 3acb29d0e905f4f58d9db1f72b1d8f64d313c539..e102186b43ab9cc006c3f58c8245e877482049c7 100644 (file)
@@ -76,6 +76,7 @@ static void client_cb(struct uloop_fd *sock, unsigned int events)
                if (cl->txq_ofs < ub->len + sizeof(ub->hdr))
                        break;
 
+               cl->txq_ofs = 0;
                ubus_msg_list_free(ubl);
        }