From: Christian Brauner Date: Wed, 16 Apr 2025 20:05:40 +0000 (+0200) Subject: net, pidfd: report EINVAL for ESRCH X-Git-Tag: v6.16-rc1~220^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b590c928cca7bdc7fd580d52e42bfdc3ac5eeacb;p=thirdparty%2Flinux.git net, pidfd: report EINVAL for ESRCH 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 [1] Link: https://lore.kernel.org/20250415223454.GA1852104@ax162 [2] Tested-by: Nathan Chancellor Signed-off-by: Christian Brauner --- diff --git a/net/core/sock.c b/net/core/sock.c index f67a3c5b09884..b969d22106564 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -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))) {