From 6e9a3bc55ab421364db88435f77f968290b0547e Mon Sep 17 00:00:00 2001 From: Michael Biebl Date: Thu, 14 Nov 2019 14:05:13 +0100 Subject: [PATCH] udev: ignore error caused by device disconnection During an add or change event, the device may be disconnected. Closes: #944586 --- debian/patches/series | 3 + ...ev-fix-error-code-in-the-log-message.patch | 23 +++++++ ...ENT-when-chmod_and_chown-device-node.patch | 22 ++++++ ...error-caused-by-device-disconnection.patch | 69 +++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 debian/patches/udev-fix-error-code-in-the-log-message.patch create mode 100644 debian/patches/udev-ignore-ENOENT-when-chmod_and_chown-device-node.patch create mode 100644 debian/patches/udev-ignore-error-caused-by-device-disconnection.patch diff --git a/debian/patches/series b/debian/patches/series index 5d23f9981..3d044f674 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -80,6 +80,9 @@ logind-drop.patch logind-fix-emission-of-PropertiesChanged-on-seats.patch logind-fix-emission-of-PropertiesChanged-for-users.patch Revert-sysusers-properly-mark-generated-accounts-as-locke.patch +udev-ignore-ENOENT-when-chmod_and_chown-device-node.patch +udev-fix-error-code-in-the-log-message.patch +udev-ignore-error-caused-by-device-disconnection.patch debian/Use-Debian-specific-config-files.patch debian/Bring-tmpfiles.d-tmp.conf-in-line-with-Debian-defaul.patch debian/Make-run-lock-tmpfs-an-API-fs.patch diff --git a/debian/patches/udev-fix-error-code-in-the-log-message.patch b/debian/patches/udev-fix-error-code-in-the-log-message.patch new file mode 100644 index 000000000..ddd2e52d7 --- /dev/null +++ b/debian/patches/udev-fix-error-code-in-the-log-message.patch @@ -0,0 +1,23 @@ +From: Yu Watanabe +Date: Tue, 12 Nov 2019 14:58:19 +0900 +Subject: udev: fix error code in the log message + +(cherry picked from commit ffdc9c891f00f79aa7df3ac25ad141db74686fbe) +--- + 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 39d7af8..71288e9 100644 +--- a/src/udev/udev-rules.c ++++ b/src/udev/udev-rules.c +@@ -2316,8 +2316,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); + diff --git a/debian/patches/udev-ignore-ENOENT-when-chmod_and_chown-device-node.patch b/debian/patches/udev-ignore-ENOENT-when-chmod_and_chown-device-node.patch new file mode 100644 index 000000000..27392b4dc --- /dev/null +++ b/debian/patches/udev-ignore-ENOENT-when-chmod_and_chown-device-node.patch @@ -0,0 +1,22 @@ +From: Yu Watanabe +Date: Tue, 12 Nov 2019 14:57:48 +0900 +Subject: udev: ignore ENOENT when chmod_and_chown() device node + +(cherry picked from commit 4b613ec212bfd06fd9d9487bd37b0791fa6dff9e) +--- + 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 efea16e..39d7af8 100644 +--- a/src/udev/udev-rules.c ++++ b/src/udev/udev-rules.c +@@ -2313,6 +2313,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); diff --git a/debian/patches/udev-ignore-error-caused-by-device-disconnection.patch b/debian/patches/udev-ignore-error-caused-by-device-disconnection.patch new file mode 100644 index 000000000..60b64e534 --- /dev/null +++ b/debian/patches/udev-ignore-error-caused-by-device-disconnection.patch @@ -0,0 +1,69 @@ +From: Yu Watanabe +Date: Tue, 12 Nov 2019 14:58:25 +0900 +Subject: udev: ignore error caused by device disconnection + +During an add or change event, the device may be disconnected. + +Fixes #13976. + +(cherry picked from commit b64b83d13eedfdfc616c16c4a108ef28bf6d3b33) +--- + 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 f161402..ce95e20 100644 +--- a/src/udev/udev-node.c ++++ b/src/udev/udev-node.c +@@ -298,8 +298,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), +@@ -324,11 +327,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, +@@ -345,7 +350,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); + +@@ -354,7 +360,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); + -- 2.39.5