From ab7b9b914c381ab8b18fffa062e8588c647ed07f Mon Sep 17 00:00:00 2001 From: Pedro Pombeiro Date: Tue, 26 Jun 2018 11:13:12 +0200 Subject: [PATCH] Recover from panics which can get sent from goleveldb due to bad arguments. Closes #1059 --- mailserver/mailserver.go | 13 +++++++++++++ t/e2e/whisper/whisper_mailbox_test.go | 15 ++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/mailserver/mailserver.go b/mailserver/mailserver.go index 03358d66b..562992258 100644 --- a/mailserver/mailserver.go +++ b/mailserver/mailserver.go @@ -156,8 +156,19 @@ func (s *WMailServer) Close() { } } +func recoverLevelDBPanics(calleMethodName string) { + // Recover from possible goleveldb panics + if r := recover(); r != nil { + if errString, ok := r.(string); ok { + log.Error(fmt.Sprintf("recovered from panic in %s: %s", calleMethodName, errString)) + } + } +} + // Archive a whisper envelope. func (s *WMailServer) Archive(env *whisper.Envelope) { + defer recoverLevelDBPanics("Archive") + key := NewDbKey(env.Expiry-env.TTL, env.Hash()) rawEnvelope, err := rlp.EncodeToBytes(env) if err != nil { @@ -188,6 +199,8 @@ func (s *WMailServer) DeliverMail(peer *whisper.Peer, request *whisper.Envelope) return } + defer recoverLevelDBPanics("DeliverMail") + if ok, lower, upper, bloom := s.validateRequest(peer.ID(), request); ok { s.processRequest(peer, lower, upper, bloom) if err := s.sendHistoricMessageResponse(peer, request); err != nil { diff --git a/t/e2e/whisper/whisper_mailbox_test.go b/t/e2e/whisper/whisper_mailbox_test.go index 6e8a35824..0a836973e 100644 --- a/t/e2e/whisper/whisper_mailbox_test.go +++ b/t/e2e/whisper/whisper_mailbox_test.go @@ -111,7 +111,7 @@ func (s *WhisperMailboxSuite) TestRequestMessageFromMailboxAsync() { senderWhisperService.SubscribeEnvelopeEvents(events) // Request messages (including the previous one, expired) from mailbox. - result := s.requestHistoricMessages(senderWhisperService, rpcClient, mailboxPeerStr, MailServerKeyID, topic.String()) + result := s.requestHistoricMessagesFromLast12Hours(senderWhisperService, rpcClient, mailboxPeerStr, MailServerKeyID, topic.String()) requestID := common.BytesToHash(result) // And we receive message, it comes from mailbox. @@ -282,8 +282,8 @@ func (s *WhisperMailboxSuite) TestRequestMessagesInGroupChat() { s.Require().Empty(messages) // Request each one messages from mailbox using enode. - s.requestHistoricMessages(bobWhisperService, bobRPCClient, mailboxEnode, bobMailServerKeyID, groupChatTopic.String()) - s.requestHistoricMessages(charlieWhisperService, charlieRPCClient, mailboxEnode, charlieMailServerKeyID, groupChatTopic.String()) + s.requestHistoricMessagesFromLast12Hours(bobWhisperService, bobRPCClient, mailboxEnode, bobMailServerKeyID, groupChatTopic.String()) + s.requestHistoricMessagesFromLast12Hours(charlieWhisperService, charlieRPCClient, mailboxEnode, charlieMailServerKeyID, groupChatTopic.String()) // Bob receive p2p message from group chat filter. messages = s.getMessagesByMessageFilterIDWithTracer(bobRPCClient, bobGroupChatMessageFilterID, bobTracer, groupChatMessageHash) @@ -515,11 +515,16 @@ func (s *WhisperMailboxSuite) addSymKey(rpcCli *rpc.Client, symkey string) strin return symkeyID } -// requestHistoricMessages asks a mailnode to resend messages. -func (s *WhisperMailboxSuite) requestHistoricMessages(w *whisper.Whisper, rpcCli *rpc.Client, mailboxEnode, mailServerKeyID, topic string) []byte { +// requestHistoricMessagesFromLast12Hours asks a mailnode to resend messages from last 12 hours. +func (s *WhisperMailboxSuite) requestHistoricMessagesFromLast12Hours(w *whisper.Whisper, rpcCli *rpc.Client, mailboxEnode, mailServerKeyID, topic string) []byte { currentTime := w.GetCurrentTime() from := currentTime.Add(-12 * time.Hour) to := currentTime + return s.requestHistoricMessages(w, rpcCli, mailboxEnode, mailServerKeyID, topic, from, to) +} + +// requestHistoricMessages asks a mailnode to resend messages. +func (s *WhisperMailboxSuite) requestHistoricMessages(w *whisper.Whisper, rpcCli *rpc.Client, mailboxEnode, mailServerKeyID, topic string, from, to time.Time) []byte { resp := rpcCli.CallRaw(`{ "jsonrpc": "2.0", "id": 2,