mirror of
https://github.com/tendermint/tendermint.git
synced 2026-08-19 13:46:17 +00:00
defensive copy + layout change
This commit is contained in:
+16
-9
@@ -211,17 +211,24 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error {
|
||||
// indexes can be preserved.
|
||||
addedCopy := make([]Tx, len(t.added))
|
||||
copy(addedCopy, t.added)
|
||||
sort.Sort(Txs(addedCopy))
|
||||
|
||||
removedCopy := make([]Tx, len(t.removed))
|
||||
copy(removedCopy, t.removed)
|
||||
sort.Sort(Txs(removedCopy))
|
||||
|
||||
unmodifiedCopy := make([]Tx, len(t.unmodified))
|
||||
copy(unmodifiedCopy, t.unmodified)
|
||||
|
||||
sort.Sort(otxs)
|
||||
sort.Sort(Txs(addedCopy))
|
||||
sort.Sort(Txs(removedCopy))
|
||||
sort.Sort(Txs(unmodifiedCopy))
|
||||
|
||||
// make a defensive copy of otxs so that the order of
|
||||
// the caller's data is not altered.
|
||||
otxsCopy := make([]Tx, len(otxs))
|
||||
copy(otxsCopy, otxs)
|
||||
sort.Sort(Txs(otxsCopy))
|
||||
|
||||
unmodifiedIdx, addedIdx, removedIdx := 0, 0, 0
|
||||
for i := 0; i < len(otxs); i++ {
|
||||
for i := 0; i < len(otxsCopy); i++ {
|
||||
if addedIdx == len(addedCopy) &&
|
||||
removedIdx == len(removedCopy) &&
|
||||
unmodifiedIdx == len(unmodifiedCopy) {
|
||||
@@ -234,9 +241,9 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error {
|
||||
// iterate over the sorted addedIndex until we reach a value that sorts
|
||||
// higher than the value we are examining in the original list.
|
||||
for addedIdx < len(addedCopy) {
|
||||
switch bytes.Compare(addedCopy[addedIdx], otxs[i]) {
|
||||
switch bytes.Compare(addedCopy[addedIdx], otxsCopy[i]) {
|
||||
case 0:
|
||||
return fmt.Errorf("existing transaction incorrectly marked as added, transaction hash: %x", otxs[i].Hash())
|
||||
return fmt.Errorf("existing transaction incorrectly marked as added, transaction hash: %x", otxsCopy[i].Hash())
|
||||
case -1:
|
||||
addedIdx++
|
||||
case 1:
|
||||
@@ -258,7 +265,7 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error {
|
||||
// The same logic applies for the unmodified check.
|
||||
|
||||
if removedIdx < len(removedCopy) {
|
||||
switch bytes.Compare(removedCopy[removedIdx], otxs[i]) {
|
||||
switch bytes.Compare(removedCopy[removedIdx], otxsCopy[i]) {
|
||||
case 0:
|
||||
removedIdx++
|
||||
case -1:
|
||||
@@ -266,7 +273,7 @@ func (t TxRecordSet) Validate(maxSizeBytes int64, otxs Txs) error {
|
||||
}
|
||||
}
|
||||
if unmodifiedIdx < len(unmodifiedCopy) {
|
||||
switch bytes.Compare(unmodifiedCopy[unmodifiedIdx], otxs[i]) {
|
||||
switch bytes.Compare(unmodifiedCopy[unmodifiedIdx], otxsCopy[i]) {
|
||||
case 0:
|
||||
unmodifiedIdx++
|
||||
case -1:
|
||||
|
||||
Reference in New Issue
Block a user