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..1f688dcb --- /dev/null +++ b/lib/dialects/linux/tests/case-20-inet-version-after-all.bash @@ -0,0 +1,30 @@ +#!/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 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 +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)