From 40a355a42d4a9444dc753c04c6608dade2f06a23 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 03:13:27 +0200 Subject: Adding upstream version 125.0.1. Signed-off-by: Daniel Baumann --- toolkit/components/uniffi-js/UniFFIPointer.cpp | 38 ++++++++++++++------------ 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'toolkit/components/uniffi-js') diff --git a/toolkit/components/uniffi-js/UniFFIPointer.cpp b/toolkit/components/uniffi-js/UniFFIPointer.cpp index 87a1d5fe69..c3a1eba93d 100644 --- a/toolkit/components/uniffi-js/UniFFIPointer.cpp +++ b/toolkit/components/uniffi-js/UniFFIPointer.cpp @@ -40,12 +40,12 @@ already_AddRefed UniFFIPointer::Read( MOZ_LOG(sUniFFIPointerLogger, LogLevel::Info, ("[UniFFI] Reading Pointer from buffer")); + CheckedUint32 end = CheckedUint32(aPosition) + 8; uint8_t data_ptr[8]; - if (!aArrayBuff.CopyDataTo( - data_ptr, - [aPosition](size_t aLength) -> Maybe> { - CheckedUint32 end = aPosition + 8; - if (!end.isValid() || end.value() > aLength) { + if (!end.isValid() || + !aArrayBuff.CopyDataTo( + data_ptr, [&](size_t aLength) -> Maybe> { + if (end.value() > aLength) { return Nothing(); } return Some(std::make_pair(aPosition, 8)); @@ -72,18 +72,22 @@ void UniFFIPointer::Write(const ArrayBuffer& aArrayBuff, uint32_t aPosition, MOZ_LOG(sUniFFIPointerLogger, LogLevel::Info, ("[UniFFI] Writing Pointer to buffer")); - aArrayBuff.ProcessData([&](const Span& aData, - JS::AutoCheckCannotGC&&) { - CheckedUint32 end = aPosition + 8; - if (!end.isValid() || end.value() > aData.Length()) { - aError.ThrowRangeError("position is out of range"); - return; - } - // in Rust and Read(), a u64 is read as BigEndian and then converted to - // a pointer we do the reverse here - const auto& data_ptr = aData.Subspan(aPosition, 8); - mozilla::BigEndian::writeUint64(data_ptr.Elements(), (uint64_t)GetPtr()); - }); + CheckedUint32 end = CheckedUint32(aPosition) + 8; + if (!end.isValid() || !aArrayBuff.ProcessData([&](const Span& aData, + JS::AutoCheckCannotGC&&) { + if (end.value() > aData.Length()) { + return false; + } + // in Rust and Read(), a u64 is read as BigEndian and then converted to + // a pointer we do the reverse here + const auto& data_ptr = aData.Subspan(aPosition, 8); + mozilla::BigEndian::writeUint64(data_ptr.Elements(), + (uint64_t)GetPtr()); + return true; + })) { + aError.ThrowRangeError("position is out of range"); + return; + } } UniFFIPointer::UniFFIPointer(void* aPtr, const UniFFIPointerType* aType) { -- cgit v1.2.3