From 4b613ec212bfd06fd9d9487bd37b0791fa6dff9e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 12 Nov 2019 14:57:48 +0900 Subject: [PATCH 1/3] udev: ignore ENOENT when chmod_and_chown() device node --- src/udev/udev-rules.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index ab54067b3f..92eb136e69 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -2333,6 +2333,8 @@ static int apply_static_dev_perms(const char *devnode, uid_t uid, gid_t gid, mod gid = 0; r = chmod_and_chown(device_node, mode, uid, gid); + if (r == -ENOENT) + return 0; if (r < 0) return log_error_errno(errno, "Failed to chown '%s' %u %u: %m", device_node, uid, gid); From ffdc9c891f00f79aa7df3ac25ad141db74686fbe Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 12 Nov 2019 14:58:19 +0900 Subject: [PATCH 2/3] udev: fix error code in the log message --- src/udev/udev-rules.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 92eb136e69..5dbf2e1576 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -2336,8 +2336,7 @@ static int apply_static_dev_perms(const char *devnode, uid_t uid, gid_t gid, mod if (r == -ENOENT) return 0; if (r < 0) - return log_error_errno(errno, "Failed to chown '%s' %u %u: %m", - device_node, uid, gid); + return log_error_errno(r, "Failed to chown '%s' %u %u: %m", device_node, uid, gid); else log_debug("chown '%s' %u:%u with mode %#o", device_node, uid, gid, mode); From b64b83d13eedfdfc616c16c4a108ef28bf6d3b33 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 12 Nov 2019 14:58:25 +0900 Subject: [PATCH 3/3] udev: ignore error caused by device disconnection During an add or change event, the device may be disconnected. Fixes #13976. --- src/udev/udev-node.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index 2d725707d0..a34b8d6945 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -296,8 +296,11 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac, else mode |= S_IFCHR; - if (lstat(devnode, &stats) < 0) + if (lstat(devnode, &stats) < 0) { + if (errno == ENOENT) + return 0; /* this is necessarily racey, so ignore missing the device */ return log_device_debug_errno(dev, errno, "cannot stat() node %s: %m", devnode); + } if ((mode != MODE_INVALID && (stats.st_mode & S_IFMT) != (mode & S_IFMT)) || stats.st_rdev != devnum) return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EEXIST), @@ -322,11 +325,13 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac, r = chmod_and_chown(devnode, mode, uid, gid); if (r < 0) - log_device_warning_errno(dev, r, "Failed to set owner/mode of %s to uid=" UID_FMT ", gid=" GID_FMT ", mode=%#o: %m", - devnode, - uid_is_valid(uid) ? uid : stats.st_uid, - gid_is_valid(gid) ? gid : stats.st_gid, - mode != MODE_INVALID ? mode & 0777 : stats.st_mode & 0777); + log_device_full(dev, r == -ENOENT ? LOG_DEBUG : LOG_ERR, r, + "Failed to set owner/mode of %s to uid=" UID_FMT + ", gid=" GID_FMT ", mode=%#o: %m", + devnode, + uid_is_valid(uid) ? uid : stats.st_uid, + gid_is_valid(gid) ? gid : stats.st_gid, + mode != MODE_INVALID ? mode & 0777 : stats.st_mode & 0777); } else log_device_debug(dev, "Preserve permissions of %s, uid=" UID_FMT ", gid=" GID_FMT ", mode=%#o", devnode, @@ -343,7 +348,8 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac, q = mac_selinux_apply(devnode, label); if (q < 0) - log_device_error_errno(dev, q, "SECLABEL: failed to set SELinux label '%s': %m", label); + log_device_full(dev, q == -ENOENT ? LOG_DEBUG : LOG_ERR, q, + "SECLABEL: failed to set SELinux label '%s': %m", label); else log_device_debug(dev, "SECLABEL: set SELinux label '%s'", label); @@ -352,7 +358,8 @@ static int node_permissions_apply(sd_device *dev, bool apply_mac, q = mac_smack_apply(devnode, SMACK_ATTR_ACCESS, label); if (q < 0) - log_device_error_errno(dev, q, "SECLABEL: failed to set SMACK label '%s': %m", label); + log_device_full(dev, q == -ENOENT ? LOG_DEBUG : LOG_ERR, q, + "SECLABEL: failed to set SMACK label '%s': %m", label); else log_device_debug(dev, "SECLABEL: set SMACK label '%s'", label);