xeth: fixed nil pointer of filter retrieval
This fix addresses an issue with filters that were (possibly) not yet added to the filter queues but were expected. I've added additional nil checks making sure it doesn't crash and swapped the installation of the filter around so it's installed before use. Closes #1665
This commit is contained in:
		
							parent
							
								
									e56cbc225e
								
							
						
					
					
						commit
						b9359981f4
					
				
							
								
								
									
										46
									
								
								xeth/xeth.go
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								xeth/xeth.go
									
									
									
									
									
								
							| @ -532,8 +532,10 @@ func (self *XEth) NewLogFilter(earliest, latest int64, skip, max int, address [] | ||||
| 	self.logMu.Lock() | ||||
| 	defer self.logMu.Unlock() | ||||
| 
 | ||||
| 	var id int | ||||
| 	filter := core.NewFilter(self.backend) | ||||
| 	id := self.filterManager.InstallFilter(filter) | ||||
| 	self.logQueue[id] = &logQueue{timeout: time.Now()} | ||||
| 
 | ||||
| 	filter.SetEarliestBlock(earliest) | ||||
| 	filter.SetLatestBlock(latest) | ||||
| 	filter.SetSkip(skip) | ||||
| @ -544,10 +546,10 @@ func (self *XEth) NewLogFilter(earliest, latest int64, skip, max int, address [] | ||||
| 		self.logMu.Lock() | ||||
| 		defer self.logMu.Unlock() | ||||
| 
 | ||||
| 		self.logQueue[id].add(logs...) | ||||
| 		if queue := self.logQueue[id]; queue != nil { | ||||
| 			queue.add(logs...) | ||||
| 		} | ||||
| 	} | ||||
| 	id = self.filterManager.InstallFilter(filter) | ||||
| 	self.logQueue[id] = &logQueue{timeout: time.Now()} | ||||
| 
 | ||||
| 	return id | ||||
| } | ||||
| @ -556,16 +558,18 @@ func (self *XEth) NewTransactionFilter() int { | ||||
| 	self.transactionMu.Lock() | ||||
| 	defer self.transactionMu.Unlock() | ||||
| 
 | ||||
| 	var id int | ||||
| 	filter := core.NewFilter(self.backend) | ||||
| 	id := self.filterManager.InstallFilter(filter) | ||||
| 	self.transactionQueue[id] = &hashQueue{timeout: time.Now()} | ||||
| 
 | ||||
| 	filter.TransactionCallback = func(tx *types.Transaction) { | ||||
| 		self.transactionMu.Lock() | ||||
| 		defer self.transactionMu.Unlock() | ||||
| 
 | ||||
| 		self.transactionQueue[id].add(tx.Hash()) | ||||
| 		if queue := self.transactionQueue[id]; queue != nil { | ||||
| 			queue.add(tx.Hash()) | ||||
| 		} | ||||
| 	} | ||||
| 	id = self.filterManager.InstallFilter(filter) | ||||
| 	self.transactionQueue[id] = &hashQueue{timeout: time.Now()} | ||||
| 	return id | ||||
| } | ||||
| 
 | ||||
| @ -573,16 +577,18 @@ func (self *XEth) NewBlockFilter() int { | ||||
| 	self.blockMu.Lock() | ||||
| 	defer self.blockMu.Unlock() | ||||
| 
 | ||||
| 	var id int | ||||
| 	filter := core.NewFilter(self.backend) | ||||
| 	id := self.filterManager.InstallFilter(filter) | ||||
| 	self.blockQueue[id] = &hashQueue{timeout: time.Now()} | ||||
| 
 | ||||
| 	filter.BlockCallback = func(block *types.Block, logs state.Logs) { | ||||
| 		self.blockMu.Lock() | ||||
| 		defer self.blockMu.Unlock() | ||||
| 
 | ||||
| 		self.blockQueue[id].add(block.Hash()) | ||||
| 		if queue := self.blockQueue[id]; queue != nil { | ||||
| 			queue.add(block.Hash()) | ||||
| 		} | ||||
| 	} | ||||
| 	id = self.filterManager.InstallFilter(filter) | ||||
| 	self.blockQueue[id] = &hashQueue{timeout: time.Now()} | ||||
| 	return id | ||||
| } | ||||
| 
 | ||||
| @ -1022,16 +1028,24 @@ func (m callmsg) Value() *big.Int               { return m.value } | ||||
| func (m callmsg) Data() []byte                  { return m.data } | ||||
| 
 | ||||
| type logQueue struct { | ||||
| 	mu sync.Mutex | ||||
| 
 | ||||
| 	logs    state.Logs | ||||
| 	timeout time.Time | ||||
| 	id      int | ||||
| } | ||||
| 
 | ||||
| func (l *logQueue) add(logs ...*state.Log) { | ||||
| 	l.mu.Lock() | ||||
| 	defer l.mu.Unlock() | ||||
| 
 | ||||
| 	l.logs = append(l.logs, logs...) | ||||
| } | ||||
| 
 | ||||
| func (l *logQueue) get() state.Logs { | ||||
| 	l.mu.Lock() | ||||
| 	defer l.mu.Unlock() | ||||
| 
 | ||||
| 	l.timeout = time.Now() | ||||
| 	tmp := l.logs | ||||
| 	l.logs = nil | ||||
| @ -1039,16 +1053,24 @@ func (l *logQueue) get() state.Logs { | ||||
| } | ||||
| 
 | ||||
| type hashQueue struct { | ||||
| 	mu sync.Mutex | ||||
| 
 | ||||
| 	hashes  []common.Hash | ||||
| 	timeout time.Time | ||||
| 	id      int | ||||
| } | ||||
| 
 | ||||
| func (l *hashQueue) add(hashes ...common.Hash) { | ||||
| 	l.mu.Lock() | ||||
| 	defer l.mu.Unlock() | ||||
| 
 | ||||
| 	l.hashes = append(l.hashes, hashes...) | ||||
| } | ||||
| 
 | ||||
| func (l *hashQueue) get() []common.Hash { | ||||
| 	l.mu.Lock() | ||||
| 	defer l.mu.Unlock() | ||||
| 
 | ||||
| 	l.timeout = time.Now() | ||||
| 	tmp := l.hashes | ||||
| 	l.hashes = nil | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user