in lib/handler.go [37:68]
func (s *Server) handleConnection() {
buffer := s.bufPool.Get().([]byte)
bytesRead, peer, err := s.conn.ReadFromUDP(buffer)
if err != nil || bytesRead == 0 {
s.bufPool.Put(buffer)
msg := "error reading from %s: %v"
glog.Errorf(msg, peer, err)
s.logger.LogErr(time.Now(), nil, nil, peer, ErrRead, err)
return
}
go func() {
defer func() {
// always release this routine's buffer back to the pool
s.bufPool.Put(buffer)
if r := recover(); r != nil {
glog.Errorf("Panicked handling v%d packet from %s: %s", s.config.Version, peer, r)
glog.Errorf("Offending packet: %x", buffer[:bytesRead])
err, _ := r.(error)
s.logger.LogErr(time.Now(), nil, nil, peer, ErrPanic, err)
glog.Errorf("%s: %s", r, debug.Stack())
}
}()
if s.config.Version == 4 {
s.handleRawPacketV4(buffer[:bytesRead], peer)
} else if s.config.Version == 6 {
s.handleRawPacketV6(buffer[:bytesRead], peer)
}
}()
}