From 261fdce39d4aecbe223e01ca0c27d6868ab4b8d3 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Wed, 29 Jan 2014 15:43:11 +0400 Subject: [PATCH] unix: Don't drop whole socket with unlinked path When we can't stat socket name with ENOENT errno this means, that the socket is bound and unlinked. Don't drop the whole socket info, just treat it as nameless. Signed-off-by: Pavel Emelyanov --- sk-unix.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/sk-unix.c b/sk-unix.c index 4a1fe4881..aa6d22f39 100644 --- a/sk-unix.c +++ b/sk-unix.c @@ -402,6 +402,7 @@ static int unix_collect_one(const struct unix_diag_msg *m, struct unix_diag_vfs *uv; struct stat st; char rpath[PATH_MAX]; + bool drop_path = false; if (name[0] != '/') { pr_warn("Relative bind path '%s' " @@ -418,12 +419,16 @@ static int unix_collect_one(const struct unix_diag_msg *m, uv = RTA_DATA(tb[UNIX_DIAG_VFS]); snprintf(rpath, sizeof(rpath), ".%s", name); if (fstatat(mntns_root, rpath, &st, 0)) { - pr_warn("Can't stat socket %#x(%s), skipping: %m (err %d)\n", - m->udiag_ino, rpath, errno); - goto skip; - } + if (errno != ENOENT) { + pr_warn("Can't stat socket %#x(%s), skipping: %m (err %d)\n", + m->udiag_ino, rpath, errno); + goto skip; + } - if ((st.st_ino != uv->udiag_vfs_ino) || + pr_info("unix: Dropping path %s for unlinked sk %#x\n", + name, m->udiag_ino); + drop_path = true; + } else if ((st.st_ino != uv->udiag_vfs_ino) || !phys_stat_dev_match(st.st_dev, uv->udiag_vfs_dev, name)) { pr_info("unix: Dropping path %s for " "unlinked bound " @@ -433,6 +438,10 @@ static int unix_collect_one(const struct unix_diag_msg *m, (int)st.st_ino, (int)uv->udiag_vfs_dev, (int)uv->udiag_vfs_ino); + drop_path = true; + } + + if (drop_path) { /* * When a socket is bound to unlinked file, we * just drop his name, since no one will access