LCOV - code coverage report
Current view: top level - src/consensus - tx_check.cpp (source / functions) Hit Total Coverage
Test: fuzz_coverage.info Lines: 29 29 100.0 %
Date: 2023-10-05 15:40:34 Functions: 1 1 100.0 %
Branches: 60 92 65.2 %

           Branch data     Line data    Source code
       1                 :            : // Copyright (c) 2017-2021 The Bitcoin Core developers
       2                 :            : // Distributed under the MIT software license, see the accompanying
       3                 :            : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4                 :            : 
       5                 :            : #include <consensus/tx_check.h>
       6                 :            : 
       7                 :            : #include <consensus/amount.h>
       8                 :            : #include <primitives/transaction.h>
       9                 :            : #include <consensus/validation.h>
      10                 :            : 
      11                 :     497401 : bool CheckTransaction(const CTransaction& tx, TxValidationState& state)
      12                 :            : {
      13                 :            :     // Basic checks that don't depend on any context
      14         [ +  + ]:     497401 :     if (tx.vin.empty())
      15   [ +  -  +  -  :      22981 :         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-vin-empty");
                   +  - ]
      16         [ +  + ]:     474420 :     if (tx.vout.empty())
      17   [ +  -  +  -  :      11775 :         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-vout-empty");
                   +  - ]
      18                 :            :     // Size limits (this doesn't take the witness into account, as that hasn't been checked for malleability)
      19         [ +  + ]:     462645 :     if (::GetSerializeSize(tx, PROTOCOL_VERSION | SERIALIZE_TRANSACTION_NO_WITNESS) * WITNESS_SCALE_FACTOR > MAX_BLOCK_WEIGHT)
      20   [ +  -  +  -  :         35 :         return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-oversize");
                   +  - ]
      21                 :            : 
      22                 :            :     // Check for negative or overflow output values (see CVE-2010-5139)
      23                 :     462610 :     CAmount nValueOut = 0;
      24         [ +  + ]:   14835779 :     for (const auto& txout : tx.vout)
      25                 :            :     {
      26         [ +  + ]:   14393336 :         if (txout.nValue < 0)
      27   [ +  -  +  -  :       1202 :             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-vout-negative");
                   +  - ]
      28         [ +  + ]:   14392134 :         if (txout.nValue > MAX_MONEY)
      29   [ +  -  +  -  :      18885 :             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-vout-toolarge");
                   +  - ]
      30                 :   14373249 :         nValueOut += txout.nValue;
      31         [ +  + ]:   14373249 :         if (!MoneyRange(nValueOut))
      32   [ +  -  +  -  :         80 :             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-txouttotal-toolarge");
                   +  - ]
      33                 :            :     }
      34                 :            : 
      35                 :            :     // Check for duplicate inputs (see CVE-2018-17144)
      36                 :            :     // While Consensus::CheckTxInputs does check if all inputs of a tx are available, and UpdateCoins marks all inputs
      37                 :            :     // of a tx as spent, it does not check if the tx has duplicate inputs.
      38                 :            :     // Failure to run this check will result in either a crash or an inflation bug, depending on the implementation of
      39                 :            :     // the underlying coins database.
      40                 :     442443 :     std::set<COutPoint> vInOutPoints;
      41         [ +  + ]:    5177476 :     for (const auto& txin : tx.vin) {
      42   [ +  -  +  + ]:    4740689 :         if (!vInOutPoints.insert(txin.prevout).second)
      43   [ +  -  +  -  :       5656 :             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-inputs-duplicate");
                   +  - ]
      44                 :            :     }
      45                 :            : 
      46   [ +  -  +  + ]:     436787 :     if (tx.IsCoinBase())
      47                 :            :     {
      48   [ +  -  +  +  :     157049 :         if (tx.vin[0].scriptSig.size() < 2 || tx.vin[0].scriptSig.size() > 100)
             +  -  +  + ]
      49   [ +  -  +  -  :        214 :             return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-cb-length");
                   +  - ]
      50                 :     156835 :     }
      51                 :            :     else
      52                 :            :     {
      53         [ +  + ]:    4844830 :         for (const auto& txin : tx.vin)
      54   [ +  -  +  + ]:    4565169 :             if (txin.prevout.IsNull())
      55   [ +  -  +  -  :         77 :                 return state.Invalid(TxValidationResult::TX_CONSENSUS, "bad-txns-prevout-null");
                   -  + ]
      56                 :            :     }
      57                 :            : 
      58                 :     436496 :     return true;
      59                 :     497401 : }

Generated by: LCOV version 1.14