[vlc-commits] [Git][videolan/vlc][master] 2 commits: contrib: ebml: avoid reading more than 2^32 at once
Steve Lhomme (@robUx4)
gitlab at videolan.org
Thu May 7 13:43:36 UTC 2026
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
c79852da by Steve Lhomme at 2026-05-07T12:48:37+00:00
contrib: ebml: avoid reading more than 2^32 at once
Backport for a patch on the master branch.
- - - - -
b91572e7 by Steve Lhomme at 2026-05-07T12:48:37+00:00
demux: mkv: fix vlc_stream_Read() return checks
It returns a ssize_t, not an int. Once the sign has been checked we can cast it to size_t.
It can only be casted to uint32 if the original size was not larger than a uint32.
- - - - -
3 changed files:
- + contrib/src/ebml/0001-IOCallback-avoid-reading-more-than-2-32-at-once.patch
- contrib/src/ebml/rules.mak
- modules/demux/mkv/stream_io_callback.cpp
Changes:
=====================================
contrib/src/ebml/0001-IOCallback-avoid-reading-more-than-2-32-at-once.patch
=====================================
@@ -0,0 +1,51 @@
+From 1a8c6d1e2518fe19d1d1d206b6df03470abb8e09 Mon Sep 17 00:00:00 2001
+From: Steve Lhomme <slhomme at matroska.org>
+Date: Sun, 2 Oct 2022 09:24:27 +0200
+Subject: [PATCH] IOCallback: avoid reading more than 2^32 at once
+
+In practice it should never happen as 2^32+1 buffers are not possible on any
+known platform. But better safe than sorry. Or memory mapped files could reach
+this code ?
+
+(cherry picked from commit 40b4797829f6a35c1ea0a160ba7feed7443acb7d)
+---
+ src/IOCallback.cpp | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/src/IOCallback.cpp b/src/IOCallback.cpp
+index 13ed635..4fbaeee 100644
+--- a/src/IOCallback.cpp
++++ b/src/IOCallback.cpp
+@@ -33,6 +33,7 @@
+ \author Moritz Bunkus <moritz @ bunkus.org>
+ */
+
++#include <limits>
+ #include <sstream>
+ #include <stdexcept>
+
+@@ -64,10 +65,17 @@ void IOCallback::readFully(void*Buffer,size_t Size)
+ if(Buffer == nullptr)
+ throw;
+
+- if(read(Buffer,Size) != Size) {
+- stringstream Msg;
+- Msg<<"EOF in readFully("<<Buffer<<","<<Size<<")";
+- throw runtime_error(Msg.str());
++ char *readBuf = static_cast<char *>(Buffer);
++ uint32_t readSize = static_cast<uint32_t>(std::min<size_t>(std::numeric_limits<uint32>::max(), Size));
++ while (readSize != 0) {
++ if(read(readBuf,readSize) != readSize) {
++ stringstream Msg;
++ Msg<<"EOF in readFully("<<Buffer<<","<<Size<<")";
++ throw runtime_error(Msg.str());
++ }
++ Size -= readSize;
++ readBuf += readSize;
++ readSize = static_cast<uint32_t>(std::min<size_t>(std::numeric_limits<uint32>::max(), Size));
+ }
+ }
+
+--
+2.52.0.windows.1
+
=====================================
contrib/src/ebml/rules.mak
=====================================
@@ -14,6 +14,7 @@ $(TARBALLS)/libebml-$(EBML_VERSION).tar.xz:
ebml: libebml-$(EBML_VERSION).tar.xz .sum-ebml
$(UNPACK)
+ $(APPLY) $(SRC)/ebml/0001-IOCallback-avoid-reading-more-than-2-32-at-once.patch
$(APPLY) $(SRC)/ebml/0001-EbmlString-ReadFully-use-automatic-memory-management.patch
$(APPLY) $(SRC)/ebml/0002-EbmlUnicodeString-use-std-string-when-reading-instea.patch
$(APPLY) $(SRC)/ebml/0001-EbmlMaster-fix-leak-when-reading-upper-level-element.patch
=====================================
modules/demux/mkv/stream_io_callback.cpp
=====================================
@@ -36,11 +36,13 @@ vlc_stream_io_callback::vlc_stream_io_callback( stream_t *s_, bool b_owner_ )
uint32 vlc_stream_io_callback::read( void *p_buffer, size_t i_size )
{
- if( i_size <= 0 || mb_eof )
+ assert( i_size <= std::numeric_limits<uint32>::max() );
+
+ if( i_size == 0 || mb_eof )
return 0;
- int i_ret = vlc_stream_Read( s, p_buffer, i_size );
- return i_ret < 0 || i_ret < i_size ? 0 : i_ret;
+ ssize_t i_ret = vlc_stream_Read( s, p_buffer, i_size );
+ return i_ret < 0 || static_cast<size_t>(i_ret) < i_size ? 0 : static_cast<uint32>(i_ret);
}
void vlc_stream_io_callback::setFilePointer(int64_t i_offset, seek_mode mode )
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/d8f3c77caaf827e00f3569b9d8383f62c9a88d8a...b91572e7424a472bbf80d3ad5025fc20ca3fbd1d
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/d8f3c77caaf827e00f3569b9d8383f62c9a88d8a...b91572e7424a472bbf80d3ad5025fc20ca3fbd1d
You're receiving this email because of your account on code.videolan.org.
More information about the vlc-commits
mailing list