Skip to content

Commit c799976

Browse files
committed
Merge #16128: Delete error-prone CScript constructor only used with FindAndDelete
e1a5569 Delete error-prone CScript constructor (Gregory Sanders) Pull request description: The behavior of this constructor is not the expected behavior compared to the other constructors which directly interpret the vector as a CScript, rather than serialize it into a new CScript. It has only four uses in the entire codebase. Delete this constructor and replace its four uses with the more clear serialization construction. ACKs for top commit: Empact: ACK bitcoin/bitcoin@e1a5569 sipa: Concept and code review ACK e1a5569, but I'd like to make sure we have tests covering the FindAndDelete usage. Tree-SHA512: b6721e343c867ca401a80ec87c25939d7f1fc798f3bf7e5feb0ea6f8280eecb6bd65afc8286912c76ff8119ccea50ad7726b1a4137cae70c9d4fed7d960e10d3
2 parents 345f42a + e1a5569 commit c799976

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

src/qt/coincontroldialog.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,8 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
418418

419419
if (amount > 0)
420420
{
421-
CTxOut txout(amount, static_cast<CScript>(std::vector<unsigned char>(24, 0)));
421+
// Assumes a p2pkh script size
422+
CTxOut txout(amount, CScript() << std::vector<unsigned char>(24, 0));
422423
txDummy.vout.push_back(txout);
423424
fDust |= IsDust(txout, model->node().getDustRelayFee());
424425
}
@@ -509,7 +510,8 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
509510
// Never create dust outputs; if we would, just add the dust to the fee.
510511
if (nChange > 0 && nChange < MIN_CHANGE)
511512
{
512-
CTxOut txout(nChange, static_cast<CScript>(std::vector<unsigned char>(24, 0)));
513+
// Assumes a p2pkh script size
514+
CTxOut txout(nChange, CScript() << std::vector<unsigned char>(24, 0));
513515
if (IsDust(txout, model->node().getDustRelayFee()))
514516
{
515517
nPayFee += nChange;

src/script/interpreter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -926,7 +926,7 @@ bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript&
926926

927927
// Drop the signature in pre-segwit scripts but not segwit scripts
928928
if (sigversion == SigVersion::BASE) {
929-
int found = FindAndDelete(scriptCode, CScript(vchSig));
929+
int found = FindAndDelete(scriptCode, CScript() << vchSig);
930930
if (found > 0 && (flags & SCRIPT_VERIFY_CONST_SCRIPTCODE))
931931
return set_error(serror, SCRIPT_ERR_SIG_FINDANDDELETE);
932932
}
@@ -992,7 +992,7 @@ bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript&
992992
{
993993
valtype& vchSig = stacktop(-isig-k);
994994
if (sigversion == SigVersion::BASE) {
995-
int found = FindAndDelete(scriptCode, CScript(vchSig));
995+
int found = FindAndDelete(scriptCode, CScript() << vchSig);
996996
if (found > 0 && (flags & SCRIPT_VERIFY_CONST_SCRIPTCODE))
997997
return set_error(serror, SCRIPT_ERR_SIG_FINDANDDELETE);
998998
}

src/script/script.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,9 @@ class CScript : public CScriptBase
437437

438438
explicit CScript(opcodetype b) { operator<<(b); }
439439
explicit CScript(const CScriptNum& b) { operator<<(b); }
440-
explicit CScript(const std::vector<unsigned char>& b) { operator<<(b); }
440+
// delete non-existent constructor to defend against future introduction
441+
// e.g. via prevector
442+
explicit CScript(const std::vector<unsigned char>& b) = delete;
441443

442444

443445
CScript& operator<<(int64_t b) { return push_int64(b); }

0 commit comments

Comments
 (0)