From 46dbd3e967352bcc833fcbb5e8df2d48b6c11c03 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 8 Apr 2013 17:16:18 -0700 Subject: [PATCH] Emergency fix. boost::format doesn't have the thread safety we thought. --- src/cpp/ripple/Amount.cpp | 8 ++++---- src/cpp/ripple/HashedObject.cpp | 3 ++- src/cpp/ripple/ProofOfWork.cpp | 2 +- src/cpp/ripple/SHAMapNodes.cpp | 2 +- src/cpp/ripple/SerializedTransaction.cpp | 4 ++-- src/cpp/ripple/ValidationCollection.cpp | 2 +- src/cpp/ripple/utils.h | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/cpp/ripple/Amount.cpp b/src/cpp/ripple/Amount.cpp index cdf7bfd95..28af36ec5 100644 --- a/src/cpp/ripple/Amount.cpp +++ b/src/cpp/ripple/Amount.cpp @@ -1154,19 +1154,19 @@ std::string STAmount::getFullText() const static boost::format normal("%s/%s/%s"); if (mIsNative) { - return str(nativeFormat % getText()); + return str(boost::format(nativeFormat) % getText()); } else if (!mIssuer) { - return str(noIssuer % getText() % getHumanCurrency()); + return str(boost::format(noIssuer) % getText() % getHumanCurrency()); } else if (mIssuer == ACCOUNT_ONE) { - return str(issuerOne % getText() % getHumanCurrency()); + return str(boost::format(issuerOne) % getText() % getHumanCurrency()); } else { - return str(normal + return str(boost::format(normal) % getText() % getHumanCurrency() % RippleAddress::createHumanAccountID(mIssuer)); diff --git a/src/cpp/ripple/HashedObject.cpp b/src/cpp/ripple/HashedObject.cpp index cc8b21a68..143ad1758 100644 --- a/src/cpp/ripple/HashedObject.cpp +++ b/src/cpp/ripple/HashedObject.cpp @@ -154,7 +154,8 @@ void HashedObjectStore::bulkWrite() case hotTRANSACTION_NODE: type = 'N'; break; default: type = 'U'; } - db->executeSQL(boost::str(fAdd % it->getHash().GetHex() % type % it->getIndex() % sqlEscape(it->getData()))); + db->executeSQL(boost::str(boost::format(fAdd) + % it->getHash().GetHex() % type % it->getIndex() % sqlEscape(it->getData()))); } db->executeSQL("END TRANSACTION;"); diff --git a/src/cpp/ripple/ProofOfWork.cpp b/src/cpp/ripple/ProofOfWork.cpp index 9c3750c92..7ec6a8ef9 100644 --- a/src/cpp/ripple/ProofOfWork.cpp +++ b/src/cpp/ripple/ProofOfWork.cpp @@ -127,7 +127,7 @@ ProofOfWork ProofOfWorkGenerator::getProof() boost::mutex::scoped_lock sl(mLock); - std::string s = boost::str(f % challenge.GetHex() % mTarget.GetHex() % mIterations % now); + std::string s = boost::str(boost::format(f) % challenge.GetHex() % mTarget.GetHex() % mIterations % now); std::string c = mSecret.GetHex() + s; s += "-" + Serializer::getSHA512Half(c).GetHex(); diff --git a/src/cpp/ripple/SHAMapNodes.cpp b/src/cpp/ripple/SHAMapNodes.cpp index 6989e8092..c1ef24948 100644 --- a/src/cpp/ripple/SHAMapNodes.cpp +++ b/src/cpp/ripple/SHAMapNodes.cpp @@ -25,7 +25,7 @@ std::string SHAMapNode::getString() const if ((mDepth == 0) && (mNodeID.isZero())) return "NodeID(root)"; - return str(NodeID + return str(boost::format(NodeID) % boost::lexical_cast(mDepth) % mNodeID.GetHex()); } diff --git a/src/cpp/ripple/SerializedTransaction.cpp b/src/cpp/ripple/SerializedTransaction.cpp index e79b3f6a5..0d7dd34f2 100644 --- a/src/cpp/ripple/SerializedTransaction.cpp +++ b/src/cpp/ripple/SerializedTransaction.cpp @@ -260,7 +260,7 @@ std::string SerializedTransaction::getSQL(Serializer rawTxn, uint32 inLedger, ch static boost::format bfTrans("('%s', '%s', '%s', '%d', '%d', '%c', %s)"); std::string rTxn = sqlEscape(rawTxn.peekData()); - return str(bfTrans + return str(boost::format(bfTrans) % getTransactionID().GetHex() % getTransactionType() % getSourceAccount().humanAccountID() % getSequence() % inLedger % status % rTxn); } @@ -271,7 +271,7 @@ std::string SerializedTransaction::getMetaSQL(Serializer rawTxn, uint32 inLedger static boost::format bfTrans("('%s', '%s', '%s', '%d', '%d', '%c', %s, %s)"); std::string rTxn = sqlEscape(rawTxn.peekData()); - return str(bfTrans + return str(boost::format(bfTrans) % getTransactionID().GetHex() % getTransactionType() % getSourceAccount().humanAccountID() % getSequence() % inLedger % status % rTxn % escapedMetaData); } diff --git a/src/cpp/ripple/ValidationCollection.cpp b/src/cpp/ripple/ValidationCollection.cpp index a9ffab3e1..cb43e6a65 100644 --- a/src/cpp/ripple/ValidationCollection.cpp +++ b/src/cpp/ripple/ValidationCollection.cpp @@ -304,7 +304,7 @@ void ValidationCollection::condWrite() void ValidationCollection::doWrite(Job&) { LoadEvent::autoptr event(theApp->getJobQueue().getLoadEventAP(jtDISK, "ValidationWrite")); - static boost::format insVal("INSERT INTO Validations " + boost::format insVal("INSERT INTO Validations " "(LedgerHash,NodePubKey,SignTime,RawData) VALUES ('%s','%s','%u',%s);"); boost::mutex::scoped_lock sl(mValidationLock); diff --git a/src/cpp/ripple/utils.h b/src/cpp/ripple/utils.h index 19333c3be..d277b0da0 100644 --- a/src/cpp/ripple/utils.h +++ b/src/cpp/ripple/utils.h @@ -162,7 +162,7 @@ inline std::string strHex(const uint64 uiHost) inline static std::string sqlEscape(const std::string& strSrc) { static boost::format f("X'%s'"); - return str(f % strHex(strSrc)); + return str(boost::format(f) % strHex(strSrc)); } inline static std::string sqlEscape(const std::vector& vecSrc)