]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
watchdog: always disarm watchdog properly before closing it
authorLennart Poettering <lennart@poettering.net>
Sat, 13 May 2023 14:44:50 +0000 (07:44 -0700)
committerMike Yuan <me@yhndnzj.com>
Mon, 15 May 2023 13:55:19 +0000 (21:55 +0800)
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.

src/shared/watchdog.c

index 4445efb125f4f4de8332891cceee8bdf56a21f73..4c1a96871832fe45fcb2b22f1d15c3553b903af3 100644 (file)
@@ -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;
 }