From 8ba66e58466586c906bb893ae00a33a5935742dc Mon Sep 17 00:00:00 2001 From: erikzhang Date: Thu, 13 Sep 2018 17:16:07 +0800 Subject: [PATCH] limit array size in `SYSCALL`s --- neo/SmartContract/StateReader.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/neo/SmartContract/StateReader.cs b/neo/SmartContract/StateReader.cs index e6a2e9fe60..2f31b412b3 100644 --- a/neo/SmartContract/StateReader.cs +++ b/neo/SmartContract/StateReader.cs @@ -773,6 +773,8 @@ protected virtual bool Transaction_GetAttributes(ExecutionEngine engine) { Transaction tx = _interface.GetInterface(); if (tx == null) return false; + if (tx.Attributes.Length > ApplicationEngine.MaxArraySize) + return false; engine.CurrentContext.EvaluationStack.Push(tx.Attributes.Select(p => StackItem.FromInterface(p)).ToArray()); return true; } @@ -785,6 +787,8 @@ protected virtual bool Transaction_GetInputs(ExecutionEngine engine) { Transaction tx = _interface.GetInterface(); if (tx == null) return false; + if (tx.Inputs.Length > ApplicationEngine.MaxArraySize) + return false; engine.CurrentContext.EvaluationStack.Push(tx.Inputs.Select(p => StackItem.FromInterface(p)).ToArray()); return true; } @@ -797,6 +801,8 @@ protected virtual bool Transaction_GetOutputs(ExecutionEngine engine) { Transaction tx = _interface.GetInterface(); if (tx == null) return false; + if (tx.Outputs.Length > ApplicationEngine.MaxArraySize) + return false; engine.CurrentContext.EvaluationStack.Push(tx.Outputs.Select(p => StackItem.FromInterface(p)).ToArray()); return true; } @@ -809,6 +815,8 @@ protected virtual bool Transaction_GetReferences(ExecutionEngine engine) { Transaction tx = _interface.GetInterface(); if (tx == null) return false; + if (tx.Inputs.Length > ApplicationEngine.MaxArraySize) + return false; engine.CurrentContext.EvaluationStack.Push(tx.Inputs.Select(p => StackItem.FromInterface(tx.References[p])).ToArray()); return true; } @@ -821,7 +829,10 @@ protected virtual bool Transaction_GetUnspentCoins(ExecutionEngine engine) { Transaction tx = _interface.GetInterface(); if (tx == null) return false; - engine.CurrentContext.EvaluationStack.Push(Blockchain.Default.GetUnspent(tx.Hash).Select(p => StackItem.FromInterface(p)).ToArray()); + TransactionOutput[] outputs = Blockchain.Default.GetUnspent(tx.Hash).ToArray(); + if (outputs.Length > ApplicationEngine.MaxArraySize) + return false; + engine.CurrentContext.EvaluationStack.Push(outputs.Select(p => StackItem.FromInterface(p)).ToArray()); return true; } return false;