From 850ad0959ac63907361c28ab03a03236e0d343c1 Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Wed, 15 Aug 2018 18:17:29 -0700 Subject: [PATCH] chain: ensure eventType from ZMQ response is human-readable In this commit, we fix a small issue where it's possible that we read a malformed message from the ZMQ connection to bitcoind due to it shutting down. To fix this, we ensure that the event type is human readable before attempting to log it. --- chain/bitcoind_conn.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/chain/bitcoind_conn.go b/chain/bitcoind_conn.go index ecc3049..8a90134 100644 --- a/chain/bitcoind_conn.go +++ b/chain/bitcoind_conn.go @@ -221,6 +221,14 @@ func (c *BitcoindConn) blockEventHandler(conn *gozmq.Conn) { } c.rescanClientsMtx.Unlock() default: + // It's possible that the message wasn't fully read if + // bitcoind shuts down, which will produce an unreadable + // event type. To prevent from logging it, we'll make + // sure it conforms to the ASCII standard. + if !isASCII(eventType) { + continue + } + log.Warnf("Received unexpected event type from "+ "rawblock subscription: %v", eventType) } @@ -364,3 +372,14 @@ func (c *BitcoindConn) RemoveClient(id uint64) { delete(c.rescanClients, id) } + +// isASCII is a helper method that checks whether all bytes in `data` would be +// printable ASCII characters if interpreted as a string. +func isASCII(s string) bool { + for _, c := range s { + if c < 32 || c > 126 { + return false + } + } + return true +}