]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net, pidfd: report EINVAL for ESRCH
authorChristian Brauner <brauner@kernel.org>
Wed, 16 Apr 2025 20:05:40 +0000 (22:05 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 17 Apr 2025 07:43:26 +0000 (09:43 +0200)
dbus-broker relies -EINVAL being returned to indicate ESRCH in [1].
This causes issues for some workloads as reported in [2].
Paper over it until this is fixed in userspace.

Link: https://lore.kernel.org/20250416-gegriffen-tiefbau-70cfecb80ac8@brauner
Link: https://github.com/bus1/dbus-broker/blob/5d34d91b138fc802a016aa68c093eb81ea31139c/src/util/sockopt.c#L241
Link: https://lore.kernel.org/20250415223454.GA1852104@ax162
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
net/core/sock.c

index f67a3c5b09884b322c652e4e302f257adf4b6f1c..b969d2210656473c1d77755ec337d59db90be247 100644 (file)
@@ -1893,8 +1893,16 @@ int sk_getsockopt(struct sock *sk, int level, int optname,
 
                pidfd = pidfd_prepare(peer_pid, 0, &pidfd_file);
                put_pid(peer_pid);
-               if (pidfd < 0)
+               if (pidfd < 0) {
+                       /*
+                        * dbus-broker relies on -EINVAL being returned
+                        * to indicate ESRCH. Paper over it until this
+                        * is fixed in userspace.
+                        */
+                       if (pidfd == -ESRCH)
+                               pidfd = -EINVAL;
                        return pidfd;
+               }
 
                if (copy_to_sockptr(optval, &pidfd, len) ||
                    copy_to_sockptr(optlen, &len, sizeof(int))) {