net/netstat: add nil checks to Windows OSMetadata implementation

The API documentation does claim to output empty strings under certain
conditions, but we're sometimes seeing nil pointers in the wild, not empty
strings.

Fixes https://github.com/tailscale/corp/issues/8878

Signed-off-by: Aaron Klotz <aaron@tailscale.com>
pull/7088/head
Aaron Klotz 1 year ago
parent 8c03a31d10
commit 4a869048bf

@ -224,6 +224,7 @@ type moduleInfoConstraint interface {
_MIB_TCPROW_OWNER_MODULE | _MIB_TCP6ROW_OWNER_MODULE _MIB_TCPROW_OWNER_MODULE | _MIB_TCP6ROW_OWNER_MODULE
} }
// moduleInfo may return "", nil indicating a successful call but with empty data
func moduleInfo[entryType moduleInfoConstraint](entry *entryType, proc *windows.LazyProc) (string, error) { func moduleInfo[entryType moduleInfoConstraint](entry *entryType, proc *windows.LazyProc) (string, error) {
var buf []byte var buf []byte
var desiredLen uint32 var desiredLen uint32
@ -249,6 +250,12 @@ func moduleInfo[entryType moduleInfoConstraint](entry *entryType, proc *windows.
} }
basicInfo := (*_TCPIP_OWNER_MODULE_BASIC_INFO)(addr) basicInfo := (*_TCPIP_OWNER_MODULE_BASIC_INFO)(addr)
// GetOwnerModuleFromTcp*Entry is apparently using nil as an empty result
// under certain circumstances, so we check all the things.
if basicInfo == nil || basicInfo.moduleName == nil {
return "", nil
}
return windows.UTF16PtrToString(basicInfo.moduleName), nil return windows.UTF16PtrToString(basicInfo.moduleName), nil
} }

Loading…
Cancel
Save