From fd1cb318e39023f7179e40df11a46e82e40d9ace Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 21 Jan 2026 17:22:47 -0500 Subject: [PATCH] Check that max parameters length is multiple of sizeof(int32) (#6253) --- src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 10f0d4a03e..6b956de8a0 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -118,15 +118,18 @@ locateField(STObject const& obj, Slice const& locator) if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + static_assert(maxWasmParamLength % sizeof(int32_t) == 0); int32_t locBuf[maxWasmParamLength / sizeof(int32_t)]; int32_t const* locPtr = &locBuf[0]; int32_t const locSize = locator.size() / sizeof(int32_t); - uintptr_t p = reinterpret_cast(locator.data()); - if (p & (alignof(int32_t) - 1)) // unaligned - memcpy(&locBuf[0], locator.data(), locator.size()); - else - locPtr = reinterpret_cast(locator.data()); + { + uintptr_t const p = reinterpret_cast(locator.data()); + if (p & (alignof(int32_t) - 1)) // unaligned + memcpy(&locBuf[0], locator.data(), locator.size()); + else + locPtr = reinterpret_cast(locator.data()); + } STBase const* field = nullptr; auto const& knownSFields = SField::getKnownCodeToField();