tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 570ec34c7ace0099bc87b3c2c1fa71588c0fbcc6
parent e8f3db7856c69758dc84834bdaf809fe932f9458
Author: Chun-Min Chang <chun.m.chang@gmail.com>
Date:   Wed,  3 Dec 2025 17:40:34 +0000

Bug 1999390 - Construct no EncodedVideoChunk if requested size is invalid r=media-playback-reviewers,alwu

Differential Revision: https://phabricator.services.mozilla.com/D273931

Diffstat:
Mdom/media/webcodecs/EncodedVideoChunk.cpp | 23++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/dom/media/webcodecs/EncodedVideoChunk.cpp b/dom/media/webcodecs/EncodedVideoChunk.cpp @@ -155,15 +155,15 @@ already_AddRefed<EncodedVideoChunk> EncodedVideoChunk::Constructor( return nullptr; } - auto buffer = ProcessTypedArrays( + auto res = ProcessTypedArrays( aInit.mData, - [&](const Span<uint8_t>& aData, - JS::AutoCheckCannotGC&&) -> RefPtr<MediaAlignedByteBuffer> { + [&](const Span<uint8_t>& aData, JS::AutoCheckCannotGC&&) + -> Result<RefPtr<MediaAlignedByteBuffer>, MediaResult> { // Make sure it's in uint32_t's range. CheckedUint32 byteLength(aData.Length()); if (!byteLength.isValid()) { - aRv.Throw(NS_ERROR_INVALID_ARG); - return nullptr; + return Err(MediaResult(NS_ERROR_INVALID_ARG, + "requested size exceeds uint32_t limit")); } if (aData.Length() == 0) { LOGW("Buffer for constructing EncodedVideoChunk is empty!"); @@ -174,12 +174,21 @@ already_AddRefed<EncodedVideoChunk> EncodedVideoChunk::Constructor( // Instead of checking *buf, size comparision is used to allow // constructing a zero-sized EncodedVideoChunk. if (!buf || buf->Size() != aData.Length()) { - aRv.Throw(NS_ERROR_OUT_OF_MEMORY); - return nullptr; + return Err(MediaResult(NS_ERROR_OUT_OF_MEMORY, + "failed to allocate buffer: OOM or " + "exceeds internal size limit")); } return buf; }); + if (res.isErr()) { + MediaResult err = res.unwrapErr(); + LOGE("Failed to process buffer for EncodedVideoChunk constructor: %s", + err.Description().get()); + aRv.Throw(err.Code()); + return nullptr; + } + RefPtr<MediaAlignedByteBuffer> buffer = res.unwrap(); RefPtr<EncodedVideoChunk> chunk(new EncodedVideoChunk( global, buffer.forget(), aInit.mType, aInit.mTimestamp, OptionalToMaybe(aInit.mDuration)));