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..3a7a1204 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,15 @@ 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/FD -> pidfd:[INODE] + (void)snpf(rest, sizeof(pbuf) - (rest - pbuf), + "[pidfd:%d]", fi.pid); + enter_nm(ctx, rest); + } if (Lf->sf) link_lfile(ctx); diff --git a/lib/dialects/linux/tests/case-20-inet6-ffffffff-handling.bash b/lib/dialects/linux/tests/case-20-inet6-ffffffff-handling.bash index a3a62822..1e3f459b 100755 --- a/lib/dialects/linux/tests/case-20-inet6-ffffffff-handling.bash +++ b/lib/dialects/linux/tests/case-20-inet6-ffffffff-handling.bash @@ -30,7 +30,7 @@ expectation="n[${v6addr}]:$port" result=1 if "${lsof}" -p "${pid}" -a -d fd -P -n -F n \ | tee -a "${report}" \ - | fgrep -q "$expectation"; then + | grep -Fq "$expectation"; then result=0 fi diff --git a/lib/dialects/linux/tests/case-20-pidfd-pid.bash b/lib/dialects/linux/tests/case-20-pidfd-pid.bash index fe439e5e..ceeddb41 100755 --- a/lib/dialects/linux/tests/case-20-pidfd-pid.bash +++ b/lib/dialects/linux/tests/case-20-pidfd-pid.bash @@ -11,7 +11,7 @@ $TARGET | ( exit 77 fi line=$($lsof -p $pid -a -d $fd -F pfn| tr '\n' ' ') - if ! fgrep -q "p${pid} f${fd} n[pidfd:$pid]" <<<"$line"; then + if ! grep -Fq "p${pid} f${fd} n[pidfd:$pid]" <<<"$line"; then $lsof -p $pid -a -d $fd -F pfn echo echo $line