diff --git a/parser/transaction.go b/parser/transaction.go index 7778b9b..17296fc 100644 --- a/parser/transaction.go +++ b/parser/transaction.go @@ -276,14 +276,16 @@ func (tx *transaction) ParseFromSlice(data []byte) ([]byte, error) { // TODO: vector. At the moment we're assuming trusted input. // See https://nvd.nist.gov/vuln/detail/CVE-2018-17144 for an example. - tx.transparentInputs = make([]*txIn, txInCount) - for i := 0; i < txInCount; i++ { - ti := &txIn{} - s, err = ti.ParseFromSlice([]byte(s)) - if err != nil { - return nil, errors.Wrap(err, "while parsing transparent input") + if txInCount > 0 { + tx.transparentInputs = make([]*txIn, txInCount) + for i := 0; i < txInCount; i++ { + ti := &txIn{} + s, err = ti.ParseFromSlice([]byte(s)) + if err != nil { + return nil, errors.Wrap(err, "while parsing transparent input") + } + tx.transparentInputs[i] = ti } - tx.transparentInputs[i] = ti } var txOutCount uint64 @@ -291,14 +293,16 @@ func (tx *transaction) ParseFromSlice(data []byte) ([]byte, error) { return nil, errors.New("could not read tx_out_count") } - tx.transparentOutputs = make([]*txOut, txOutCount) - for i := 0; i < txOutCount; i++ { - to := &txOut{} - s, err = to.ParseFromSlice([]byte(s)) - if err != nil { - return nil, errors.Wrap(err, "while parsing transparent output") + if txOutCount > 0 { + tx.transparentOutputs = make([]*txOut, txOutCount) + for i := 0; i < txOutCount; i++ { + to := &txOut{} + s, err = to.ParseFromSlice([]byte(s)) + if err != nil { + return nil, errors.Wrap(err, "while parsing transparent output") + } + tx.transparentOutputs[i] = to } - tx.transparentOutputs[i] = to } if ok := s.ReadUint32(&tx.nLockTime); !ok { @@ -321,14 +325,16 @@ func (tx *transaction) ParseFromSlice(data []byte) ([]byte, error) { return nil, errors.New("could not read nShieldedSpend") } - tx.shieldedSpends = make([]*spend, spendCount) - for i := 0; i < spendCount; i++ { - newSpend := &spend{} - s, err = newSpend.ParseFromSlice([]byte(s)) - if err != nil { - return nil, errors.Wrap(err, "while parsing shielded Spend") + if spendCount > 0 { + tx.shieldedSpends = make([]*spend, spendCount) + for i := 0; i < spendCount; i++ { + newSpend := &spend{} + s, err = newSpend.ParseFromSlice([]byte(s)) + if err != nil { + return nil, errors.Wrap(err, "while parsing shielded Spend") + } + tx.shieldedSpends[i] = newSpend } - tx.shieldedSpends[i] = newSpend } var outputCount uint64 @@ -336,14 +342,16 @@ func (tx *transaction) ParseFromSlice(data []byte) ([]byte, error) { return nil, errors.New("could not read nShieldedOutput") } - tx.shieldedOutputs = make([]*output, outputCount) - for i := 0; i < outputCount; i++ { - newOutput := &output{} - s, err = newOutput.ParseFromSlice([]byte(s)) - if err != nil { - return nil, errors.Wrap(err, "while parsing shielded Output") + if outputCount > 0 { + tx.shieldedOutputs = make([]*output, outputCount) + for i := 0; i < outputCount; i++ { + newOutput := &output{} + s, err = newOutput.ParseFromSlice([]byte(s)) + if err != nil { + return nil, errors.Wrap(err, "while parsing shielded Output") + } + tx.shieldedOutputs[i] = newOutput } - tx.shieldedOutputs[i] = newOutput } }