info(udev, "set permissions %s, %#o, uid=%u, gid=%u\n", file, mode, uid, gid);
chmod(file, mode);
chown(file, uid, gid);
- udev_selinux_lsetfilecon(udev, file, mode);
} else {
info(udev, "preserve permissions %s, %#o, uid=%u, gid=%u\n", file, mode, uid, gid);
}
+ /*
+ * Set initial selinux file context only on add events.
+ * We set the proper context on bootup (triger) or for newly
+ * added devices, but we don't change it later, in case
+ * something else has set a custom context in the meantime.
+ */
+ if (strcmp(udev_device_get_action(dev), "add") == 0)
+ udev_selinux_lsetfilecon(udev, file, mode);
/* always update timestamp when we re-use the node, like on media change events */
utimensat(AT_FDCWD, file, NULL, 0);
} else {
if (!add) {
dbg(udev, "removing index: '%s'\n", filename);
- unlink(filename);
- util_delete_path(udev, filename);
+ if (unlink(filename) == 0)
+ rmdir(dirname);
}
target = link_find_prioritized(dev, add, dirname, buf, sizeof(buf));
if (target == NULL) {
info(udev, "no reference left, remove '%s'\n", slink);
- unlink(slink);
- util_delete_path(udev, slink);
+ if (unlink(slink) == 0)
+ util_delete_path(udev, slink);
} else {
info(udev, "creating link '%s' to '%s'\n", slink, target);
node_symlink(udev, target, slink);
info(udev, "removing device node '%s'\n", devnode);
err = util_unlink_secure(udev, devnode);
- util_delete_path(udev, devnode);
+ if (err == 0)
+ util_delete_path(udev, devnode);
out:
return err;
}