From d256945fd04bad1d4eaa4443358b3f7c68ad78f2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 10 Jul 2023 10:27:09 +0900 Subject: [PATCH] network/queue: free assigned userdata only when a new request is queued --- src/network/netdev/netdev.c | 7 +++++-- src/network/networkd-queue.c | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 2c3b0f8797..bc82bf3e8d 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -702,7 +702,7 @@ int link_request_stacked_netdev(Link *link, NetDev *netdev) { link->stacked_netdevs_created = false; r = link_queue_request_full(link, REQUEST_TYPE_NETDEV_STACKED, - netdev_ref(netdev), (mfree_func_t) netdev_unref, + netdev, (mfree_func_t) netdev_unref, trivial_hash_func, trivial_compare_func, stacked_netdev_process_request, &link->create_stacked_netdev_messages, @@ -710,9 +710,12 @@ int link_request_stacked_netdev(Link *link, NetDev *netdev) { if (r < 0) return log_link_error_errno(link, r, "Failed to request stacked netdev '%s': %m", netdev->ifname); + if (r == 0) + return 0; + netdev_ref(netdev); log_link_debug(link, "Requested stacked netdev '%s'", netdev->ifname); - return 0; + return 1; } static int independent_netdev_process_request(Request *req, Link *link, void *userdata) { diff --git a/src/network/networkd-queue.c b/src/network/networkd-queue.c index cf2ffa0327..d5193538d8 100644 --- a/src/network/networkd-queue.c +++ b/src/network/networkd-queue.c @@ -134,7 +134,6 @@ static int request_new( .link = link_ref(link), /* link may be NULL, but link_ref() handles it gracefully. */ .type = type, .userdata = userdata, - .free_func = free_func, .hash_func = hash_func, .compare_func = compare_func, .process = process, @@ -153,6 +152,7 @@ static int request_new( return r; req->manager = manager; + req->free_func = free_func; req->counter = counter; if (req->counter) (*req->counter)++; -- 2.25.1