fsck: consider a fsck implementation linked to /bin/true non-existant
authorLennart Poettering <lennart@poettering.net>
Tue, 24 Jun 2014 17:37:22 +0000 (19:37 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 25 Jun 2014 08:04:36 +0000 (10:04 +0200)
src/fsck/fsck.c
src/shared/generator.c
src/shared/path-util.c

index 0b572e5..e8596d9 100644 (file)
@@ -302,15 +302,11 @@ int main(int argc, char *argv[]) {
         type = udev_device_get_property_value(udev_device, "ID_FS_TYPE");
         if (type) {
                 r = fsck_exists(type);
-                if (r < 0) {
-                        if (r == -ENOENT) {
-                                log_info("fsck.%s doesn't exist, not checking file system on %s",
-                                         type, device);
-                                return EXIT_SUCCESS;
-                        } else
-                                log_warning("fsck.%s cannot be used for %s: %s",
-                                            type, device, strerror(-r));
-                }
+                if (r == -ENOENT) {
+                        log_info("fsck.%s doesn't exist, not checking file system on %s", type, device);
+                        return EXIT_SUCCESS;
+                } else if (r < 0)
+                        log_warning("fsck.%s cannot be used for %s: %s", type, device, strerror(-r));
         }
 
         if (arg_show_progress)
index 5ac7b5f..dcfddaa 100644 (file)
@@ -49,10 +49,13 @@ int generator_write_fsck_deps(
         if (!isempty(fstype) && !streq(fstype, "auto")) {
                 int r;
                 r = fsck_exists(fstype);
-                if (r < 0) {
-                        log_warning("Checking was requested for %s, but fsck.%s cannot be used: %s", what, fstype, strerror(-r));
+                if (r == -ENOENT) {
                         /* treat missing check as essentially OK */
-                        return r == -ENOENT ? 0 : r;
+                        log_debug("Checking was requested for %s, but fsck.%s does not exist: %s", what, fstype, strerror(-r));
+                        return 0;
+                } else if (r < 0) {
+                        log_warning("Checking was requested for %s, but fsck.%s cannot be used: %s", what, fstype, strerror(-r));
+                        return r;
                 }
         }
 
index fd35e0c..e68d367 100644 (file)
@@ -541,7 +541,7 @@ int path_is_os_tree(const char *path) {
 int find_binary(const char *name, char **filename) {
         assert(name);
 
-        if (strchr(name, '/')) {
+        if (is_path(name)) {
                 if (access(name, X_OK) < 0)
                         return -errno;
 
@@ -626,8 +626,25 @@ bool paths_check_timestamp(const char* const* paths, usec_t *timestamp, bool upd
 }
 
 int fsck_exists(const char *fstype) {
+        _cleanup_free_ char *p = NULL, *d = NULL;
         const char *checker;
+        int r;
 
         checker = strappenda("fsck.", fstype);
-        return find_binary(checker, NULL);
+
+        r = find_binary(checker, &p);
+        if (r < 0)
+                return r;
+
+        /* An fsck that is linked to /bin/true is a non-existant
+         * fsck */
+
+        r = readlink_malloc(p, &d);
+        if (r >= 0 &&
+            (path_equal(d, "/bin/true") ||
+             path_equal(d, "/usr/bin/true") ||
+             path_equal(d, "/dev/null")))
+                return -ENOENT;
+
+        return 0;
 }