chiark / gitweb /
udevd: create static device links only when the target exists
authorYin Kangkai <kangkai.yin@intel.com>
Thu, 5 Aug 2010 08:17:00 +0000 (16:17 +0800)
committerMartin Pitt <martin.pitt@ubuntu.com>
Sun, 8 Aug 2010 18:35:46 +0000 (20:35 +0200)
For example, not all systems have PROC_KCORE enabled. Avoid a broken symbolic
link in those cases.

Signed-off-by: Yin Kangkai <kangkai.yin@intel.com>
Signed-off-by: Martin Pitt <martin.pitt@ubuntu.com>
udev/udevd.c

index 6dc97955d62612e2bedd15db6c633787136a5bc3..61b76f5c3ece88f4b41e67eb890277176cd222f6 100644 (file)
@@ -900,10 +900,14 @@ static void static_dev_create_links(struct udev *udev, DIR *dir)
        unsigned int i;
 
        for (i = 0; i < ARRAY_SIZE(stdlinks); i++) {
-               udev_selinux_setfscreateconat(udev, dirfd(dir), stdlinks[i].link, S_IFLNK);
-               if (symlinkat(stdlinks[i].target, dirfd(dir), stdlinks[i].link) < 0 && errno == EEXIST)
-                       utimensat(dirfd(dir), stdlinks[i].link, NULL, AT_SYMLINK_NOFOLLOW);
-               udev_selinux_resetfscreatecon(udev);
+               struct stat sb;
+
+               if (stat(stdlinks[i].target, &sb) == 0) {
+                       udev_selinux_setfscreateconat(udev, dirfd(dir), stdlinks[i].link, S_IFLNK);
+                       if (symlinkat(stdlinks[i].target, dirfd(dir), stdlinks[i].link) < 0 && errno == EEXIST)
+                               utimensat(dirfd(dir), stdlinks[i].link, NULL, AT_SYMLINK_NOFOLLOW);
+                       udev_selinux_resetfscreatecon(udev);
+               }
        }
 }