From 06bf51fada16aa8e3ef19b76c6687a48efaaf87c Mon Sep 17 00:00:00 2001 From: Alfonso Acosta Date: Wed, 13 Sep 2023 17:52:26 +0200 Subject: [PATCH] Revert "cli: Remove explicit decoding depths (#950)" (#958) This reverts commit 803bb76c2bb291cd4a469f744aa93095eb3b8710. --- cmd/soroban-cli/src/rpc/mod.rs | 12 ++++++---- cmd/soroban-cli/src/utils/contract_spec.rs | 26 ++++++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/cmd/soroban-cli/src/rpc/mod.rs b/cmd/soroban-cli/src/rpc/mod.rs index 85954369f..e817b2a38 100644 --- a/cmd/soroban-cli/src/rpc/mod.rs +++ b/cmd/soroban-cli/src/rpc/mod.rs @@ -4,13 +4,13 @@ use jsonrpsee_core::params::ObjectParams; use jsonrpsee_core::{self, client::ClientT, rpc_params}; use jsonrpsee_http_client::{HeaderMap, HttpClient, HttpClientBuilder}; use serde_aux::prelude::{deserialize_default_from_null, deserialize_number_from_string}; -use soroban_env_host::xdr::SorobanAuthorizedFunction; use soroban_env_host::xdr::{ self, AccountEntry, AccountId, ContractDataEntry, DiagnosticEvent, Error as XdrError, LedgerEntryData, LedgerFootprint, LedgerKey, LedgerKeyAccount, PublicKey, ReadXdr, SorobanAuthorizationEntry, SorobanResources, Transaction, TransactionEnvelope, TransactionMeta, TransactionMetaV3, TransactionResult, TransactionV1Envelope, Uint256, VecM, WriteXdr, }; +use soroban_env_host::xdr::{DepthLimitedRead, SorobanAuthorizedFunction}; use soroban_sdk::token; use std::{ fmt::Display, @@ -519,8 +519,9 @@ soroban config identity fund {address} --helper-url "# )); } let ledger_entry = &entries[0]; + let mut depth_limit_read = DepthLimitedRead::new(ledger_entry.xdr.as_bytes(), 100); if let LedgerEntryData::Account(entry) = - LedgerEntryData::from_xdr_base64(ledger_entry.xdr.as_bytes())? + LedgerEntryData::read_xdr_base64(&mut depth_limit_read)? { tracing::trace!(account=?entry); Ok(entry) @@ -549,8 +550,11 @@ soroban config identity fund {address} --helper-url "# let error = error_result_xdr .ok_or(Error::MissingError) .and_then(|x| { - TransactionResult::from_xdr_base64(x.as_bytes()) - .map_err(|_| Error::InvalidResponse) + TransactionResult::read_xdr_base64(&mut DepthLimitedRead::new( + x.as_bytes(), + 100, + )) + .map_err(|_| Error::InvalidResponse) }) .map(|r| r.result); tracing::error!(?error); diff --git a/cmd/soroban-cli/src/utils/contract_spec.rs b/cmd/soroban-cli/src/utils/contract_spec.rs index de7272995..da67bedc4 100644 --- a/cmd/soroban-cli/src/utils/contract_spec.rs +++ b/cmd/soroban-cli/src/utils/contract_spec.rs @@ -1,11 +1,14 @@ use base64::{engine::general_purpose::STANDARD as base64, Engine as _}; -use std::{fmt::Display, io}; +use std::{ + fmt::Display, + io::{self, Cursor}, +}; use soroban_env_host::xdr::{ - self, ReadXdr, ScEnvMetaEntry, ScMetaEntry, ScMetaV0, ScSpecEntry, ScSpecFunctionV0, - ScSpecUdtEnumV0, ScSpecUdtErrorEnumV0, ScSpecUdtStructV0, ScSpecUdtUnionV0, StringM, WriteXdr, + self, DepthLimitedRead, ReadXdr, ScEnvMetaEntry, ScMetaEntry, ScMetaV0, ScSpecEntry, + ScSpecFunctionV0, ScSpecUdtEnumV0, ScSpecUdtErrorEnumV0, ScSpecUdtStructV0, ScSpecUdtUnionV0, + StringM, WriteXdr, }; -use soroban_sdk::xdr::VecM; pub struct ContractSpec { pub env_meta_base64: Option, @@ -56,7 +59,10 @@ impl ContractSpec { let mut env_meta_base64 = None; let env_meta = if let Some(env_meta) = env_meta { env_meta_base64 = Some(base64.encode(env_meta)); - VecM::::from_xdr(env_meta)?.into() + let cursor = Cursor::new(env_meta); + let mut depth_limit_read = DepthLimitedRead::new(cursor, 100); + ScEnvMetaEntry::read_xdr_iter(&mut depth_limit_read) + .collect::, xdr::Error>>()? } else { vec![] }; @@ -64,7 +70,10 @@ impl ContractSpec { let mut meta_base64 = None; let meta = if let Some(meta) = meta { meta_base64 = Some(base64.encode(meta)); - VecM::::from_xdr(meta)?.into() + let cursor = Cursor::new(meta); + let mut depth_limit_read = DepthLimitedRead::new(cursor, 100); + ScMetaEntry::read_xdr_iter(&mut depth_limit_read) + .collect::, xdr::Error>>()? } else { vec![] }; @@ -72,7 +81,10 @@ impl ContractSpec { let mut spec_base64 = None; let spec = if let Some(spec) = spec { spec_base64 = Some(base64.encode(spec)); - VecM::::from_xdr(spec)?.into() + let cursor = Cursor::new(spec); + let mut depth_limit_read = DepthLimitedRead::new(cursor, 100); + ScSpecEntry::read_xdr_iter(&mut depth_limit_read) + .collect::, xdr::Error>>()? } else { vec![] };