]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-netlink: do not use serials currently queued
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 26 Nov 2022 01:14:00 +0000 (10:14 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 26 Nov 2022 02:28:27 +0000 (11:28 +0900)
src/libsystemd/sd-netlink/netlink-util.c

index 12cdc99ff28e06297fe9c4f5a697f3bc0705751b..c6091542d28988ac209024040b98c3f0d8c854d8 100644 (file)
@@ -673,6 +673,15 @@ int netlink_open_family(sd_netlink **ret, int family) {
         return 0;
 }
 
+static bool serial_used(sd_netlink *nl, uint32_t serial) {
+        assert(nl);
+
+        return
+                hashmap_contains(nl->reply_callbacks, UINT32_TO_PTR(serial)) ||
+                hashmap_contains(nl->rqueue_by_serial, UINT32_TO_PTR(serial)) ||
+                hashmap_contains(nl->rqueue_partial_by_serial, UINT32_TO_PTR(serial));
+}
+
 void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m) {
         uint32_t picked;
 
@@ -689,7 +698,7 @@ void netlink_seal_message(sd_netlink *nl, sd_netlink_message *m) {
                    such messages */
                 nl->serial = nl->serial == UINT32_MAX ? 1 : nl->serial + 1;
 
-        } while (hashmap_contains(nl->reply_callbacks, UINT32_TO_PTR(picked)));
+        } while (serial_used(nl, picked));
 
         m->hdr->nlmsg_seq = picked;
         message_seal(m);