From: Yu Watanabe Date: Mon, 28 Feb 2022 02:21:24 +0000 (+0900) Subject: network: increment reference counters of Link and Request before processing requests X-Git-Tag: v251-rc1~164^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4c8b81caa518df34d4e69f6660fc4fbdf0b42ce4;p=thirdparty%2Fsystemd.git network: increment reference counters of Link and Request before processing requests To prevent the request or link is freed while processing requests. --- diff --git a/src/network/networkd-queue.c b/src/network/networkd-queue.c index ac378ba675d..ecfb7acdd2d 100644 --- a/src/network/networkd-queue.c +++ b/src/network/networkd-queue.c @@ -418,6 +418,9 @@ int manager_process_requests(sd_event_source *s, void *userdata) { Request *req; ORDERED_SET_FOREACH(req, manager->request_queue) { + _unused_ _cleanup_(request_unrefp) Request *ref = request_ref(req); + _cleanup_(link_unrefp) Link *link = link_ref(req->link); + switch (req->type) { case REQUEST_TYPE_ACTIVATE_LINK: r = link_process_activation(req, req->link, req->userdata); @@ -501,10 +504,15 @@ int manager_process_requests(sd_event_source *s, void *userdata) { processed = true; request_detach(manager, req); - if (r < 0 && req->link) - link_enter_failed(req->link); + if (r < 0 && link) { + link_enter_failed(link); + /* link_enter_failed() may remove multiple requests, + * hence we need to exit from the loop. */ + break; + } } + /* When at least one request is processed, then another request may be ready now. */ if (!processed) break; }