Existing logic in __scm_send() related to filling an struct scm_cookie with a proper struct pid reference is already pretty tricky. Let's simplify it a bit by introducing a new helper. This helper will be extended in one of the next patches. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Willem de Bruijn Cc: Leon Romanovsky Cc: Arnd Bergmann Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn --- include/net/scm.h | 10 ++++++++++ net/core/scm.c | 11 ++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/net/scm.h b/include/net/scm.h index 84c4707e78a5..856eb3a380f6 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -88,6 +88,16 @@ static __inline__ void scm_destroy(struct scm_cookie *scm) __scm_destroy(scm); } +static __inline__ int __scm_replace_pid(struct scm_cookie *scm, struct pid *pid) +{ + /* drop all previous references */ + scm_destroy_cred(scm); + + scm->pid = get_pid(pid); + scm->creds.pid = pid_vnr(pid); + return 0; +} + static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm, bool forcecreds) { diff --git a/net/core/scm.c b/net/core/scm.c index 0225bd94170f..0e71d5a249a1 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -189,15 +189,20 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p) if (err) goto error; - p->creds.pid = creds.pid; if (!p->pid || pid_vnr(p->pid) != creds.pid) { struct pid *pid; err = -ESRCH; pid = find_get_pid(creds.pid); if (!pid) goto error; - put_pid(p->pid); - p->pid = pid; + + err = __scm_replace_pid(p, pid); + /* Release what we get from find_get_pid() as + * __scm_replace_pid() takes all necessary refcounts. + */ + put_pid(pid); + if (err) + goto error; } err = -EINVAL; -- 2.43.0