From 07f5bf26129e1c0bd9f02d1ab10c2ecb9cd08431 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Tue, 14 Aug 2012 13:31:46 -0700 Subject: [PATCH] Enforce SendMax restrictions in transaction engine. --- src/Transaction.cpp | 2 +- src/TransactionEngine.cpp | 9 +++++++++ src/TransactionEngine.h | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Transaction.cpp b/src/Transaction.cpp index d600bfefae..da778890c3 100644 --- a/src/Transaction.cpp +++ b/src/Transaction.cpp @@ -500,7 +500,7 @@ Transaction::pointer Transaction::setPayment( mTransaction->setITFieldAccount(sfDestination, naDstAccountID); mTransaction->setITFieldAmount(sfAmount, saAmount); - if (saAmount != saSendMax) + if (saAmount != saSendMax || saAmount.getCurrency() != saSendMax.getCurrency()) { mTransaction->setITFieldAmount(sfSendMax, saSendMax); } diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index 197c6c9472..598af8b3aa 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -3279,6 +3279,14 @@ TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction return tenREDUNDANT; } + else if (bMax + && ((saMaxAmount == saDstAmount && saMaxAmount.getCurrency() == saDstAmount.getCurrency()) + || (saDstAmount.isNative() && saMaxAmount.isNative()))) + { + Log(lsINFO) << "doPayment: Invalid transaction: bad SendMax."; + + return tenINVALID; + } SLE::pointer sleDst = entryCache(ltACCOUNT_ROOT, Ledger::getAccountRootIndex(uDstAccountID)); if (!sleDst) @@ -3309,6 +3317,7 @@ TransactionEngineResult TransactionEngine::doPayment(const SerializedTransaction entryModify(sleDst); } + // XXX Should bMax be sufficient to imply ripple? bool bRipple = bPaths || bMax || !saDstAmount.isNative(); if (!bRipple) diff --git a/src/TransactionEngine.h b/src/TransactionEngine.h index 02e8dfb762..832f09e5e0 100644 --- a/src/TransactionEngine.h +++ b/src/TransactionEngine.h @@ -41,6 +41,7 @@ enum TransactionEngineResult // Invalid: Ledger won't allow. tenCLAIMED = -200, tenBAD_RIPPLE, + tenCREATED, tenEXPIRED, tenMSG_SET, terALREADY,