diff --git a/derp/derp_server.go b/derp/derp_server.go index 7fabf1013..3e4501795 100644 --- a/derp/derp_server.go +++ b/derp/derp_server.go @@ -548,60 +548,63 @@ func (s *Server) sendServerInfo(bw *bufio.Writer, clientKey key.Public) error { func (s *Server) recvClientKey(br *bufio.Reader) (clientKey key.Public, info *clientInfo, err error) { fl, err := readFrameTypeHeader(br, frameClientInfo) if err != nil { - return key.Public{}, nil, err + return zpub, nil, err } const minLen = keyLen + nonceLen if fl < minLen { - return key.Public{}, nil, errors.New("short client info") + return zpub, nil, errors.New("short client info") } // We don't trust the client at all yet, so limit its input size to limit // things like JSON resource exhausting (http://github.com/golang/go/issues/31789). if fl > 256<<10 { - return key.Public{}, nil, errors.New("long client info") + return zpub, nil, errors.New("long client info") } if _, err := io.ReadFull(br, clientKey[:]); err != nil { - return key.Public{}, nil, err + return zpub, nil, err } var nonce [24]byte if _, err := io.ReadFull(br, nonce[:]); err != nil { - return key.Public{}, nil, fmt.Errorf("nonce: %v", err) + return zpub, nil, fmt.Errorf("nonce: %v", err) } msgLen := int(fl - minLen) msgbox := make([]byte, msgLen) if _, err := io.ReadFull(br, msgbox); err != nil { - return key.Public{}, nil, fmt.Errorf("msgbox: %v", err) + return zpub, nil, fmt.Errorf("msgbox: %v", err) } msg, ok := box.Open(nil, msgbox, &nonce, (*[32]byte)(&clientKey), s.privateKey.B32()) if !ok { - return key.Public{}, nil, fmt.Errorf("msgbox: cannot open len=%d with client key %x", msgLen, clientKey[:]) + return zpub, nil, fmt.Errorf("msgbox: cannot open len=%d with client key %x", msgLen, clientKey[:]) } info = new(clientInfo) if err := json.Unmarshal(msg, info); err != nil { - return key.Public{}, nil, fmt.Errorf("msg: %v", err) + return zpub, nil, fmt.Errorf("msg: %v", err) } return clientKey, info, nil } func (s *Server) recvPacket(br *bufio.Reader, frameLen uint32) (dstKey key.Public, contents []byte, err error) { if frameLen < keyLen { - return key.Public{}, nil, errors.New("short send packet frame") + return zpub, nil, errors.New("short send packet frame") } if _, err := io.ReadFull(br, dstKey[:]); err != nil { - return key.Public{}, nil, err + return zpub, nil, err } packetLen := frameLen - keyLen if packetLen > MaxPacketSize { - return key.Public{}, nil, fmt.Errorf("data packet longer (%d) than max of %v", packetLen, MaxPacketSize) + return zpub, nil, fmt.Errorf("data packet longer (%d) than max of %v", packetLen, MaxPacketSize) } contents = make([]byte, packetLen) if _, err := io.ReadFull(br, contents); err != nil { - return key.Public{}, nil, err + return zpub, nil, err } s.packetsRecv.Add(1) s.bytesRecv.Add(int64(len(contents))) return dstKey, contents, nil } +// zpub is the key.Public zero value. +var zpub key.Public + // sclient is a client connection to the server. // // (The "s" prefix is to more explicitly distinguish it from Client in derp_client.go)