From d0bb1ab2b084f3db774ff41ca3bd45673576d80c Mon Sep 17 00:00:00 2001 From: JamesRay <66258875@qq.com> Date: Wed, 5 Sep 2018 14:13:25 +0800 Subject: [PATCH] Filter out empty addresses in persistent_peers/seeds lists (#2323) Fixes #2320 --- CHANGELOG_PENDING.md | 1 + libs/common/string_test.go | 19 ------------------- node/node.go | 33 ++++++++++++++++++++++++++++----- node/node_test.go | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+), 24 deletions(-) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 844dc8696..11e5fc8d5 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -23,6 +23,7 @@ BREAKING CHANGES: - [state] Implement BFT time - [p2p] update secret connection to use a little endian encoded nonce - [libs/clist] Panics if list extends beyond MaxLength +- [common] SplitAndTrim was deleted FEATURES: - [types] allow genesis file to have 0 validators ([#2015](https://github.com/tendermint/tendermint/issues/2015)) diff --git a/libs/common/string_test.go b/libs/common/string_test.go index 5d1b68feb..0fc677a91 100644 --- a/libs/common/string_test.go +++ b/libs/common/string_test.go @@ -31,25 +31,6 @@ func TestIsHex(t *testing.T) { } } -func TestSplitAndTrim(t *testing.T) { - testCases := []struct { - s string - sep string - cutset string - expected []string - }{ - {"a,b,c", ",", " ", []string{"a", "b", "c"}}, - {" a , b , c ", ",", " ", []string{"a", "b", "c"}}, - {" a, b, c ", ",", " ", []string{"a", "b", "c"}}, - {" , ", ",", " ", []string{"", ""}}, - {" ", ",", " ", []string{""}}, - } - - for _, tc := range testCases { - assert.Equal(t, tc.expected, SplitAndTrim(tc.s, tc.sep, tc.cutset), "%s", tc.s) - } -} - func TestIsASCIIText(t *testing.T) { notASCIIText := []string{ "", "\xC2", "\xC2\xA2", "\xFF", "\x80", "\xF0", "\n", "\t", diff --git a/node/node.go b/node/node.go index 330095f8a..76f23dfdd 100644 --- a/node/node.go +++ b/node/node.go @@ -40,6 +40,7 @@ import ( "github.com/tendermint/tendermint/version" _ "net/http/pprof" + "strings" ) //------------------------------------------------------------------------------ @@ -323,7 +324,7 @@ func NewNode(config *cfg.Config, // TODO persistent peers ? so we can have their DNS addrs saved pexReactor := pex.NewPEXReactor(addrBook, &pex.PEXReactorConfig{ - Seeds: cmn.SplitAndTrim(config.P2P.Seeds, ",", " "), + Seeds: splitAndTrimEmpty(config.P2P.Seeds, ",", " "), SeedMode: config.P2P.SeedMode, }) pexReactor.SetLogger(p2pLogger) @@ -375,7 +376,7 @@ func NewNode(config *cfg.Config, return nil, err } if config.TxIndex.IndexTags != "" { - txIndexer = kv.NewTxIndex(store, kv.IndexTags(cmn.SplitAndTrim(config.TxIndex.IndexTags, ",", " "))) + txIndexer = kv.NewTxIndex(store, kv.IndexTags(splitAndTrimEmpty(config.TxIndex.IndexTags, ",", " "))) } else if config.TxIndex.IndexAllTags { txIndexer = kv.NewTxIndex(store, kv.IndexAllTags()) } else { @@ -444,7 +445,7 @@ func (n *Node) OnStart() error { n.addrBook.AddOurAddress(nodeInfo.NetAddress()) // Add private IDs to addrbook to block those peers being added - n.addrBook.AddPrivateIDs(cmn.SplitAndTrim(n.config.P2P.PrivatePeerIDs, ",", " ")) + n.addrBook.AddPrivateIDs(splitAndTrimEmpty(n.config.P2P.PrivatePeerIDs, ",", " ")) // Start the RPC server before the P2P server // so we can eg. receive txs for the first block @@ -469,7 +470,7 @@ func (n *Node) OnStart() error { // Always connect to persistent peers if n.config.P2P.PersistentPeers != "" { - err = n.sw.DialPeersAsync(n.addrBook, cmn.SplitAndTrim(n.config.P2P.PersistentPeers, ",", " "), true) + err = n.sw.DialPeersAsync(n.addrBook, splitAndTrimEmpty(n.config.P2P.PersistentPeers, ",", " "), true) if err != nil { return err } @@ -551,7 +552,7 @@ func (n *Node) ConfigureRPC() { func (n *Node) startRPC() ([]net.Listener, error) { n.ConfigureRPC() - listenAddrs := cmn.SplitAndTrim(n.config.RPC.ListenAddress, ",", " ") + listenAddrs := splitAndTrimEmpty(n.config.RPC.ListenAddress, ",", " ") coreCodec := amino.NewCodec() ctypes.RegisterAmino(coreCodec) @@ -749,3 +750,25 @@ func saveGenesisDoc(db dbm.DB, genDoc *types.GenesisDoc) { } db.SetSync(genesisDocKey, bytes) } + + +// splitAndTrimEmpty slices s into all subslices separated by sep and returns a +// slice of the string s with all leading and trailing Unicode code points +// contained in cutset removed. If sep is empty, SplitAndTrim splits after each +// UTF-8 sequence. First part is equivalent to strings.SplitN with a count of +// -1. also filter out empty strings, only return non-empty strings. +func splitAndTrimEmpty(s, sep, cutset string) []string { + if s == "" { + return []string{} + } + + spl := strings.Split(s, sep) + nonEmptyStrings := make([]string, 0, len(spl)) + for i := 0; i < len(spl); i++ { + element := strings.Trim(spl[i], cutset) + if element != "" { + nonEmptyStrings = append(nonEmptyStrings, element) + } + } + return nonEmptyStrings +} diff --git a/node/node_test.go b/node/node_test.go index ca074e1bc..d4e35f735 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -56,3 +56,22 @@ func TestNodeStartStop(t *testing.T) { t.Fatal("timed out waiting for shutdown") } } + +func TestSplitAndTrimEmpty(t *testing.T) { + testCases := []struct { + s string + sep string + cutset string + expected []string + }{ + {"a,b,c", ",", " ", []string{"a", "b", "c"}}, + {" a , b , c ", ",", " ", []string{"a", "b", "c"}}, + {" a, b, c ", ",", " ", []string{"a", "b", "c"}}, + {" a, ", ",", " ", []string{"a"}}, + {" ", ",", " ", []string{}}, + } + + for _, tc := range testCases { + assert.Equal(t, tc.expected, splitAndTrimEmpty(tc.s, tc.sep, tc.cutset), "%s", tc.s) + } +}