X Tutup
Skip to content

Commit 4c8b81c

Browse files
committed
network: increment reference counters of Link and Request before processing requests
To prevent the request or link is freed while processing requests.
1 parent eb93dc9 commit 4c8b81c

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

src/network/networkd-queue.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,9 @@ int manager_process_requests(sd_event_source *s, void *userdata) {
418418
Request *req;
419419

420420
ORDERED_SET_FOREACH(req, manager->request_queue) {
421+
_unused_ _cleanup_(request_unrefp) Request *ref = request_ref(req);
422+
_cleanup_(link_unrefp) Link *link = link_ref(req->link);
423+
421424
switch (req->type) {
422425
case REQUEST_TYPE_ACTIVATE_LINK:
423426
r = link_process_activation(req, req->link, req->userdata);
@@ -501,10 +504,15 @@ int manager_process_requests(sd_event_source *s, void *userdata) {
501504
processed = true;
502505
request_detach(manager, req);
503506

504-
if (r < 0 && req->link)
505-
link_enter_failed(req->link);
507+
if (r < 0 && link) {
508+
link_enter_failed(link);
509+
/* link_enter_failed() may remove multiple requests,
510+
* hence we need to exit from the loop. */
511+
break;
512+
}
506513
}
507514

515+
/* When at least one request is processed, then another request may be ready now. */
508516
if (!processed)
509517
break;
510518
}

0 commit comments

Comments
 (0)
X Tutup