From: Lennart Poettering Date: Sat, 13 May 2023 14:44:50 +0000 (-0700) Subject: watchdog: always disarm watchdog properly before closing it X-Git-Tag: v254-rc1~476 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f81048f8f5058e86b1c54e39eb59a1ac7ee3bd4b;p=thirdparty%2Fsystemd.git watchdog: always disarm watchdog properly before closing it If we change the watchdog device we should disarm the old one first. Similar, if we open the watchdog, but then fail setting it up, disarm it before closing it again. --- diff --git a/src/shared/watchdog.c b/src/shared/watchdog.c index 4445efb125f..4c1a9687183 100644 --- a/src/shared/watchdog.c +++ b/src/shared/watchdog.c @@ -318,9 +318,10 @@ static int open_watchdog(void) { STRV_FOREACH(wd, try_order) { watchdog_fd = open(*wd, O_WRONLY|O_CLOEXEC); if (watchdog_fd >= 0) { - r = free_and_strdup(&watchdog_device, *wd); - if (r < 0) - return log_oom_debug(); + if (free_and_strdup(&watchdog_device, *wd) < 0) { + r = log_oom_debug(); + goto close_and_fail; + } break; } @@ -342,8 +343,12 @@ static int open_watchdog(void) { r = update_timeout(); if (r < 0) - watchdog_close(true); + goto close_and_fail; + + return 0; +close_and_fail: + watchdog_close(/* disarm= */ true); return r; } @@ -356,7 +361,7 @@ int watchdog_set_device(const char *path) { r = free_and_strdup(&watchdog_device, path); if (r > 0) /* watchdog_device changed */ - watchdog_fd = safe_close(watchdog_fd); + watchdog_close(/* disarm= */ true); return r; }