X-Git-Url: https://git.novaco.in/?p=NovacoinLibrary.git;a=blobdiff_plain;f=Novacoin%2FCScript.cs;h=8757bb74ae445273e62b947a04a3ff91e419cb5a;hp=e2e17e0ecd621db34e031c0713a7df8a97a73dad;hb=6c6e3b0c68e764ea520dde48d5e44c757f1dabbb;hpb=f1d2e217ae6e24a84edfa98ca3471a8a836ecaa7 diff --git a/Novacoin/CScript.cs b/Novacoin/CScript.cs index e2e17e0..8757bb7 100644 --- a/Novacoin/CScript.cs +++ b/Novacoin/CScript.cs @@ -352,14 +352,14 @@ namespace Novacoin /// /// Legacy mode flag /// Amount of sigops - public int GetSigOpCount(bool fAccurate) + public uint GetSigOpCount(bool fAccurate) { var wCodeBytes = new ByteQueue(codeBytes); instruction opcode; // Current instruction byte[] pushArgs; // OP_PUSHDATAn argument - int nCount = 0; + uint nCount = 0; var lastOpcode = instruction.OP_INVALIDOPCODE; // Scan instructions sequence @@ -373,7 +373,7 @@ namespace Novacoin { if (fAccurate && lastOpcode >= instruction.OP_1 && lastOpcode <= instruction.OP_16) { - nCount += ScriptCode.DecodeOP_N(lastOpcode); + nCount += (uint)ScriptCode.DecodeOP_N(lastOpcode); } else { @@ -391,7 +391,7 @@ namespace Novacoin /// /// pay-to-script-hash scriptPubKey /// SigOps count - public int GetSigOpCount(CScript scriptSig) + public uint GetSigOpCount(CScript scriptSig) { if (!IsPayToScriptHash) { @@ -402,12 +402,19 @@ namespace Novacoin // get the last item that the scriptSig // pushes onto the stack: ByteQueue wScriptSig = scriptSig.GetByteQueue(); + int nScriptSigSize = scriptSig.Size; instruction opcode; // Current instruction - byte[] pushArgs; // OP_PUSHDATAn argument + byte[] pushArgs = new byte[0]; // OP_PUSHDATAn argument + - while (ScriptCode.GetOp(ref wScriptSig, out opcode, out pushArgs)) + while (wScriptSig.Index < nScriptSigSize) { + if (!ScriptCode.GetOp(ref wScriptSig, out opcode, out pushArgs)) + { + return 0; + } + if (opcode > instruction.OP_16) { return 0;