From 0b24a3567e7ac4d7674fb43a8f4875ac7c0a5458 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Fri, 17 May 2024 15:22:35 +0800 Subject: [PATCH] [linux] Maintain original output for pidfd in linux 6.9 --- 00DIST | 3 +++ lib/dialects/linux/dproc.c | 14 ++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/00DIST b/00DIST index d5a03498..9a296113 100644 --- a/00DIST +++ b/00DIST @@ -5605,6 +5605,9 @@ Supplement Regenerated the 4.04 distribution to correct a non- [linux] Do not embed kernel version in CFLAGS (#314) + [linux] Linux 6.9 changed the pidfs appearence in procfs. Try + to maintain original output in lsof (#317) + Vic Abell July 14, 2018 diff --git a/lib/dialects/linux/dproc.c b/lib/dialects/linux/dproc.c index cb6bb64f..9dc325f6 100644 --- a/lib/dialects/linux/dproc.c +++ b/lib/dialects/linux/dproc.c @@ -1273,6 +1273,10 @@ static int process_id(struct lsof_context *ctx, /* context */ #endif /* defined(HASEPTOPTS) */ if (rest && rest[0] == '[' && rest[1] == 'p') fdinfo_mask |= FDINFO_PID; + else if (Lf->ntype == N_REGLR && rest && *rest && strcmp(pbuf, "pidfd") == 0) { + // https://github.com/lsof-org/lsof/issues/317 + fdinfo_mask |= FDINFO_PID; + } if ((av = get_fdinfo(ctx, pathi, fdinfo_mask, &fi)) & FDINFO_POS) { @@ -1338,6 +1342,16 @@ static int process_id(struct lsof_context *ctx, /* context */ Lf->sf |= SELPTYINFO; } #endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */ + else if (Lf->ntype == N_REGLR && rest && *rest && Lf->nm && + strcmp(Lf->nm, "pidfd") == 0) { + // https://github.com/lsof-org/lsof/issues/317 + // pidfd since Linux 6.9 becomes a regular file: + // /proc/PID/fd/3 -> pidfd:[PID] + // rest points to "[PID]" + (void)snpf(rest, sizeof(pbuf) - (rest - pbuf), + "[pidfd:%d]", fi.pid); + enter_nm(ctx, rest); + } if (Lf->sf) link_lfile(ctx);