fix: 所有UDP插件添加ReadDeadline防止无限阻塞

SNMP/BACnet/DNS/IPMI/TFTP 的 conn.Read() 在目标不响应时
无限阻塞(goroutine 泄漏),导致整个扫描无法结束。

在 Write 前设置 ReadDeadline 确保超时后返回。
This commit is contained in:
ZacharyZcR
2026-06-13 21:42:49 +08:00
parent 2a9a3c36e2
commit 1a7770530d
5 changed files with 20 additions and 0 deletions
+4
View File
@@ -34,6 +34,10 @@ func (p *BACnetPlugin) Scan(ctx context.Context, info *common.HostInfo, session
} }
defer conn.Close() defer conn.Close()
if dl, ok := conn.(interface{ SetReadDeadline(time.Time) error }); ok {
_ = dl.SetReadDeadline(time.Now().Add(timeout))
}
if _, err := conn.Write(bacnetWhoIs); err != nil { if _, err := conn.Write(bacnetWhoIs); err != nil {
return &ScanResult{Success: false, Service: "bacnet"} return &ScanResult{Success: false, Service: "bacnet"}
} }
+4
View File
@@ -34,6 +34,10 @@ func (p *DNSPlugin) Scan(ctx context.Context, info *common.HostInfo, session *co
} }
defer conn.Close() defer conn.Close()
if dl, ok := conn.(interface{ SetReadDeadline(time.Time) error }); ok {
_ = dl.SetReadDeadline(time.Now().Add(timeout))
}
if _, err := conn.Write(query); err != nil { if _, err := conn.Write(query); err != nil {
return &ScanResult{Success: false, Service: "dns"} return &ScanResult{Success: false, Service: "dns"}
} }
+4
View File
@@ -53,6 +53,10 @@ func (p *IPMIPlugin) rmcpPing(ctx context.Context, target string, timeout time.D
0x00, // data length = 0 0x00, // data length = 0
} }
if dl, ok := conn.(interface{ SetReadDeadline(time.Time) error }); ok {
_ = dl.SetReadDeadline(time.Now().Add(timeout))
}
if _, err := conn.Write(ping); err != nil { if _, err := conn.Write(ping); err != nil {
return nil return nil
} }
+4
View File
@@ -75,6 +75,10 @@ func (p *SNMPPlugin) probe(ctx context.Context, target, community string, timeou
} }
defer conn.Close() defer conn.Close()
if dl, ok := conn.(interface{ SetReadDeadline(time.Time) error }); ok {
_ = dl.SetReadDeadline(time.Now().Add(timeout))
}
pkt := buildSNMPGetRequest(community, []int{1, 3, 6, 1, 2, 1, 1, 1, 0}) pkt := buildSNMPGetRequest(community, []int{1, 3, 6, 1, 2, 1, 1, 1, 0})
if _, err := conn.Write(pkt); err != nil { if _, err := conn.Write(pkt); err != nil {
return nil return nil
+4
View File
@@ -33,6 +33,10 @@ func (p *TFTPPlugin) Scan(ctx context.Context, info *common.HostInfo, session *c
} }
defer conn.Close() defer conn.Close()
if dl, ok := conn.(interface{ SetReadDeadline(time.Time) error }); ok {
_ = dl.SetReadDeadline(time.Now().Add(timeout))
}
if _, err := conn.Write(buildTFTPReadRequest("probe")); err != nil { if _, err := conn.Write(buildTFTPReadRequest("probe")); err != nil {
return &ScanResult{Success: false, Service: "tftp"} return &ScanResult{Success: false, Service: "tftp"}
} }