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
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…
Reference in New Issue