From 2df6372b6700daca92f2efb0b02fb6bbcd990797 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 13 Apr 2021 14:40:33 -0700 Subject: [PATCH] portlist: de-dup services on same (proto, port) on both IPv4/IPv6 Fixes #1703 Signed-off-by: Brad Fitzpatrick --- portlist/portlist.go | 21 +++++++++++++++++++++ portlist/portlist_linux.go | 6 ------ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/portlist/portlist.go b/portlist/portlist.go index 3b9d6d76c..921f92066 100644 --- a/portlist/portlist.go +++ b/portlist/portlist.go @@ -6,6 +6,7 @@ package portlist import ( "fmt" + "sort" "strings" ) @@ -76,6 +77,7 @@ func GetList(prev List) (List, error) { if err != nil { return nil, fmt.Errorf("listPorts: %s", err) } + pl = sortAndDedup(pl) if pl.sameInodes(prev) { // Nothing changed, skip inode lookup return prev, nil @@ -86,3 +88,22 @@ func GetList(prev List) (List, error) { } return pl, nil } + +// sortAndDedup sorts ps in place (by Port.lessThan) and then returns +// a subset of it with duplicate (Proto, Port) removed. +func sortAndDedup(ps List) List { + sort.Slice(ps, func(i, j int) bool { + return (&ps[i]).lessThan(&ps[j]) + }) + out := ps[:0] + var last Port + for _, p := range ps { + protoPort := Port{Proto: p.Proto, Port: p.Port} + if last == protoPort { + continue + } + out = append(out, p) + last = protoPort + } + return out +} diff --git a/portlist/portlist_linux.go b/portlist/portlist_linux.go index ab7d3b98b..6488c4933 100644 --- a/portlist/portlist_linux.go +++ b/portlist/portlist_linux.go @@ -12,7 +12,6 @@ import ( "os" "path/filepath" "runtime" - "sort" "strconv" "strings" "syscall" @@ -71,11 +70,6 @@ func listPorts() (List, error) { l = append(l, ports...) } - - sort.Slice(l, func(i, j int) bool { - return (&l[i]).lessThan(&l[j]) - }) - return l, nil }