Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[linux] fix: memory-mapped file, stat: No such file or directory #329

Merged
merged 2 commits into from
Jan 9, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions lib/dialects/linux/dproc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1361,27 +1361,52 @@ static int process_id(struct lsof_context *ctx, /* context */
return (0);
}

/* compare mount namespace of this lsof process and the target process */
/*
* compare_mntns() - compare mount namespace of this lsof process and the
* target process
*
* Note: mount namespace path might not be found with legacy linux kernel (e.g.
* linux-2.6) which does not have path "/proc/self/ns" or "/proc/${pid}/ns",
* see Commit 6b4e306aa3dc ("ns: proc files for namespace naming policy.")
*
* return: 0 == mount namespace is the same, or path is not found.
* 1 == mount namespace is different.
*/

static int compare_mntns(int pid) /* pid of the target process */
{
char nspath[NS_PATH_LENGTH];
struct stat sb_self, sb_target;
int ret;

/*
* Get mount namespace of this lsof process, early return if path is not
* found.
*/
if (stat("/proc/self/ns/mnt", &sb_self))
return -1;
return 0;

/*
* Get mount namespace of the target process, early return if path is not
* found.
*/
ret = snprintf(nspath, sizeof(nspath), "/proc/%d/ns/mnt", pid);
if (ret >= sizeof(nspath) || ret <= 0)
return -1;
return 0;

if (stat(nspath, &sb_target))
return -1;
return 0;

/*
* Compare the inode number of mount namespace, to see if target process
* is in a different mount namespace from lsof process.
*/
if (sb_self.st_ino != sb_target.st_ino)
return -1;
return 1;

/*
* mount namespace is the same.
*/
return 0;
}

Expand Down