From 4f59aca33eae1cc9a5e2bf8c0e947eb773abc57f Mon Sep 17 00:00:00 2001 From: Armaan Sandhu Date: Sun, 8 Nov 2026 15:21:36 -0500 Subject: [PATCH 1/2] Don't narrow -i to one IP version when -i4 or -i6 follows it A plain -i selects all IP versions and leaves FnetTy at 0, but a following -i4 or -i6 treated 0 as unset and narrowed the selection to that version, so "-i -i4" listed no IPv6 files. The comment says sequential -i, -i4 and -i6 combine logically, so keep all versions selected. --- Makefile.am | 1 + .../tests/case-20-inet-version-after-all.bash | 25 +++++++++++++++++++ src/arg.c | 12 ++++----- 3 files changed, 32 insertions(+), 6 deletions(-) create mode 100755 lib/dialects/linux/tests/case-20-inet-version-after-all.bash diff --git a/Makefile.am b/Makefile.am index 283fca6f..bf85642f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -155,6 +155,7 @@ LINUX_TESTS = lib/dialects/linux/tests/case-10-mqueue.bash \ lib/dialects/linux/tests/case-20-inet6-ffffffff-handling.bash \ lib/dialects/linux/tests/case-20-inet6-socket-endpoint.bash \ lib/dialects/linux/tests/case-20-inet-socket-endpoint.bash \ + lib/dialects/linux/tests/case-20-inet-version-after-all.bash \ lib/dialects/linux/tests/case-20-mmap.bash \ lib/dialects/linux/tests/case-20-udp-socket-state.bash \ lib/dialects/linux/tests/case-20-udp-state-filter.bash \ diff --git a/lib/dialects/linux/tests/case-20-inet-version-after-all.bash b/lib/dialects/linux/tests/case-20-inet-version-after-all.bash new file mode 100755 index 00000000..83c56310 --- /dev/null +++ b/lib/dialects/linux/tests/case-20-inet-version-after-all.bash @@ -0,0 +1,25 @@ +#!/bin/bash +source tests/common.bash + +if [ -z "$(nc -h 2>&1 | grep '\s-6')" ]; then + echo "nc does not support -6 option, skipping" >> $report + exit 77 +fi + +# -i selects every IP version, so a following -i4 must not drop IPv6 files. +nc -l -6 ::1 10002 > /dev/null < /dev/zero & +server=$! +sleep 1 + +fserver=/tmp/${name}-server-$$ +$lsof -n -P -p $server -a -i -i4 > $fserver +kill -9 $server 2> /dev/null > /dev/null +if ! grep -q "IPv6 .*TCP \[::1\]:10002 (LISTEN)" $fserver; then + echo "IPv6 socket missing with -i -i4" >> $report + cat $fserver >> $report + rm -f $fserver + exit 1 +fi + +rm -f $fserver +exit 0 diff --git a/src/arg.c b/src/arg.c index 2005051c..ddbb1179 100644 --- a/src/arg.c +++ b/src/arg.c @@ -1265,13 +1265,13 @@ int enter_network_address(struct lsof_context *ctx, /* context */ if (!Fnet) { Fnet = 1; FnetTy = ft; - } else { - if (FnetTy) { - if (FnetTy != ft) - FnetTy = 0; - } else - FnetTy = ft; + } else if (FnetTy && FnetTy != ft) { + FnetTy = 0; } + /* + * Otherwise all IP versions (a previous -i) or this one are + * already selected. + */ return (0); } } else if (Fnet) From b4f8349e90ef9d599a449f5ca88ba48c4982b44c Mon Sep 17 00:00:00 2001 From: Armaan Sandhu Date: Sun, 8 Nov 2026 15:34:24 -0500 Subject: [PATCH 2/2] tests: skip the -i -i4 test when IPv6 is not available Some CI containers have no IPv6 address on lo, so nc cannot bind ::1. Skip like case-20-inet6-socket-endpoint does. --- .../linux/tests/case-20-inet-version-after-all.bash | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/dialects/linux/tests/case-20-inet-version-after-all.bash b/lib/dialects/linux/tests/case-20-inet-version-after-all.bash index 83c56310..1f688dcb 100755 --- a/lib/dialects/linux/tests/case-20-inet-version-after-all.bash +++ b/lib/dialects/linux/tests/case-20-inet-version-after-all.bash @@ -7,10 +7,15 @@ if [ -z "$(nc -h 2>&1 | grep '\s-6')" ]; then fi # -i selects every IP version, so a following -i4 must not drop IPv6 files. -nc -l -6 ::1 10002 > /dev/null < /dev/zero & +nc -l -6 ::1 10002 > /dev/null < /dev/zero 2>> $report & server=$! sleep 1 +if ! kill -0 $server 2>/dev/null; then + echo "Maybe ipv6 stack is not available on this system, skipping" >> $report + exit 77 +fi + fserver=/tmp/${name}-server-$$ $lsof -n -P -p $server -a -i -i4 > $fserver kill -9 $server 2> /dev/null > /dev/null