diff --git a/daemon/daemon.go b/daemon/daemon.go index ac194ee1e60bec4b814ec0cb87bd1f11257a272d..20cdfb8897c3d138463c9f0024086d425b996b09 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -6,6 +6,7 @@ import ( "log" "net" "os" + "runtime/debug" "sort" "sync" "time" @@ -185,19 +186,30 @@ func (d *Daemon) initProviders() { func (d *Daemon) acceptLoop() { for { - conn, err := d.listener.Accept() - if err != nil { - select { - case <-d.shutdown: - return - default: - log.Printf("daemon: accept error: %v", err) - continue + done := func() bool { + defer func() { + if r := recover(); r != nil { + log.Printf("daemon: acceptLoop panic recovered: %v\n%s", r, debug.Stack()) + } + }() + conn, err := d.listener.Accept() + if err != nil { + select { + case <-d.shutdown: + return true + default: + log.Printf("daemon: accept error: %v", err) + return false + } } + rpcConn := daemonrpc.NewConn(conn) + d.addClient(rpcConn) + go d.handleClient(rpcConn) + return false + }() + if done { + return } - rpcConn := daemonrpc.NewConn(conn) - d.addClient(rpcConn) - go d.handleClient(rpcConn) } }