From 191e76a55824220a25fd91b3a08796cecf61e40f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 29 Sep 2013 11:34:07 -0700 Subject: [PATCH] Fix a crash if a client requests an order book snapshot before we have a published ledger. --- src/ripple_app/rpc/RPCHandler.cpp | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/ripple_app/rpc/RPCHandler.cpp b/src/ripple_app/rpc/RPCHandler.cpp index ac326f383..02eded514 100644 --- a/src/ripple_app/rpc/RPCHandler.cpp +++ b/src/ripple_app/rpc/RPCHandler.cpp @@ -3492,24 +3492,27 @@ Json::Value RPCHandler::doSubscribe (Json::Value params, LoadType* loadType, App if (bSnapshot) { Ledger::pointer lpLedger = getApp().getLedgerMaster ().getPublishedLedger (); - const Json::Value jvMarker = Json::Value (Json::nullValue); - - if (bBoth) + if (lpLedger) { - Json::Value jvBids (Json::objectValue); - Json::Value jvAsks (Json::objectValue); + const Json::Value jvMarker = Json::Value (Json::nullValue); - mNetOps->getBookPage (lpLedger, uTakerPaysCurrencyID, uTakerPaysIssuerID, uTakerGetsCurrencyID, uTakerGetsIssuerID, raTakerID.getAccountID (), false, 0, jvMarker, jvBids); + if (bBoth) + { + Json::Value jvBids (Json::objectValue); + Json::Value jvAsks (Json::objectValue); - if (jvBids.isMember ("offers")) jvResult["bids"] = jvBids["offers"]; + mNetOps->getBookPage (lpLedger, uTakerPaysCurrencyID, uTakerPaysIssuerID, uTakerGetsCurrencyID, uTakerGetsIssuerID, raTakerID.getAccountID (), false, 0, jvMarker, jvBids); - mNetOps->getBookPage (lpLedger, uTakerGetsCurrencyID, uTakerGetsIssuerID, uTakerPaysCurrencyID, uTakerPaysIssuerID, raTakerID.getAccountID (), false, 0, jvMarker, jvAsks); + if (jvBids.isMember ("offers")) jvResult["bids"] = jvBids["offers"]; - if (jvAsks.isMember ("offers")) jvResult["asks"] = jvAsks["offers"]; - } - else - { - mNetOps->getBookPage (lpLedger, uTakerPaysCurrencyID, uTakerPaysIssuerID, uTakerGetsCurrencyID, uTakerGetsIssuerID, raTakerID.getAccountID (), false, 0, jvMarker, jvResult); + mNetOps->getBookPage (lpLedger, uTakerGetsCurrencyID, uTakerGetsIssuerID, uTakerPaysCurrencyID, uTakerPaysIssuerID, raTakerID.getAccountID (), false, 0, jvMarker, jvAsks); + + if (jvAsks.isMember ("offers")) jvResult["asks"] = jvAsks["offers"]; + } + else + { + mNetOps->getBookPage (lpLedger, uTakerPaysCurrencyID, uTakerPaysIssuerID, uTakerGetsCurrencyID, uTakerGetsIssuerID, raTakerID.getAccountID (), false, 0, jvMarker, jvResult); + } } } }