Skip to content

Commit f4ed9bc

Browse files
add panic handlers
1 parent 5b2a13d commit f4ed9bc

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

client.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"fmt"
66
"math/rand"
77
"net"
8+
"os"
9+
"runtime/debug"
810
"strings"
911
"time"
1012

@@ -108,7 +110,14 @@ func applyOpts(options ...ClientOption) clientOpts {
108110
return conf
109111
}
110112

111-
func (c *client) run(ctx context.Context, params *lookupParams) error {
113+
func (c *client) run(ctx context.Context, params *lookupParams) (err error) {
114+
defer func() {
115+
if rerr := recover(); rerr != nil {
116+
fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack())
117+
err = fmt.Errorf("panic in zeroconf run loop: %s", rerr)
118+
}
119+
}()
120+
112121
ctx, cancel := context.WithCancel(ctx)
113122
done := make(chan struct{})
114123
go func() {
@@ -118,7 +127,7 @@ func (c *client) run(ctx context.Context, params *lookupParams) error {
118127

119128
// If previous probe was ok, it should be fine now. In case of an error later on,
120129
// the entries' queue is closed.
121-
err := c.periodicQuery(ctx, params)
130+
err = c.periodicQuery(ctx, params)
122131
cancel()
123132
<-done
124133
return err
@@ -165,6 +174,12 @@ var cleanupFreq = 10 * time.Second
165174

166175
// Start listeners and waits for the shutdown signal from exit channel
167176
func (c *client) mainloop(ctx context.Context, params *lookupParams) {
177+
defer func() {
178+
if rerr := recover(); rerr != nil {
179+
fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack())
180+
}
181+
}()
182+
168183
// start listening for responses
169184
msgCh := make(chan *dns.Msg, 32)
170185
if c.ipv4conn != nil {
@@ -313,6 +328,12 @@ func (c *client) shutdown() {
313328
// Data receiving routine reads from connection, unpacks packets into dns.Msg
314329
// structures and sends them to a given msgCh channel
315330
func (c *client) recv(ctx context.Context, l interface{}, msgCh chan *dns.Msg) {
331+
defer func() {
332+
if rerr := recover(); rerr != nil {
333+
fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack())
334+
}
335+
}()
336+
316337
var readFrom func([]byte) (n int, src net.Addr, err error)
317338

318339
switch pConn := l.(type) {

server.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"math/rand"
77
"net"
88
"os"
9+
"runtime/debug"
910
"strings"
1011
"sync"
1112
"time"
@@ -309,7 +310,14 @@ func (s *Server) recv6(c *ipv6.PacketConn) {
309310
}
310311

311312
// parsePacket is used to parse an incoming packet
312-
func (s *Server) parsePacket(packet []byte, ifIndex int, from net.Addr) error {
313+
func (s *Server) parsePacket(packet []byte, ifIndex int, from net.Addr) (err error) {
314+
defer func() {
315+
if rerr := recover(); rerr != nil {
316+
fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack())
317+
err = fmt.Errorf("panic in mDNS packet handling: %s", rerr)
318+
}
319+
}()
320+
313321
var msg dns.Msg
314322
if err := msg.Unpack(packet); err != nil {
315323
// log.Printf("[ERR] zeroconf: Failed to unpack packet: %v", err)
@@ -548,8 +556,14 @@ func (s *Server) serviceTypeName(resp *dns.Msg, ttl uint32) {
548556
}
549557

550558
// Perform probing & announcement
551-
//TODO: implement a proper probing & conflict resolution
559+
// TODO: implement a proper probing & conflict resolution
552560
func (s *Server) probe() {
561+
defer func() {
562+
if rerr := recover(); rerr != nil {
563+
fmt.Fprintf(os.Stderr, "caught panic: %s\n%s\n", rerr, debug.Stack())
564+
}
565+
}()
566+
553567
defer s.refCount.Done()
554568

555569
q := new(dns.Msg)

0 commit comments

Comments
 (0)