Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
59c9e830
Commit
59c9e830
authored
Apr 27, 2013
by
Denis Charmet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add try/catch when reading elements with libmatroska.
parent
6053dcfa
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
370 additions
and
253 deletions
+370
-253
modules/demux/mkv/demux.cpp
modules/demux/mkv/demux.cpp
+21
-6
modules/demux/mkv/matroska_segment.cpp
modules/demux/mkv/matroska_segment.cpp
+257
-209
modules/demux/mkv/matroska_segment_parse.cpp
modules/demux/mkv/matroska_segment_parse.cpp
+92
-38
No files found.
modules/demux/mkv/demux.cpp
View file @
59c9e830
...
...
@@ -464,16 +464,24 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( demux_t *p_demux, EbmlS
EbmlElement
*
p_l0
,
*
p_l1
,
*
p_l2
;
bool
b_keep_stream
=
false
,
b_keep_segment
=
false
;
/
/ verify the EBML Header
p_l0
=
p_estream
->
FindNextID
(
EBML_INFO
(
EbmlHead
),
UINT64_MAX
);
/
* verify the EBML Header... it shouldn't be bigger than 1kB */
p_l0
=
p_estream
->
FindNextID
(
EBML_INFO
(
EbmlHead
),
1024
);
if
(
p_l0
==
NULL
)
{
msg_Err
(
p_demux
,
"No EBML header found"
);
return
NULL
;
}
// verify we can read this Segment, we only support Matroska version 1 for now
p_l0
->
Read
(
*
p_estream
,
EBML_CLASS_CONTEXT
(
EbmlHead
),
i_upper_lvl
,
p_l0
,
true
);
/* verify we can read this Segment */
try
{
p_l0
->
Read
(
*
p_estream
,
EBML_CLASS_CONTEXT
(
EbmlHead
),
i_upper_lvl
,
p_l0
,
true
);
}
catch
(...)
{
msg_Err
(
p_demux
,
"EBML Header Read failed"
);
return
NULL
;
}
EDocType
doc_type
=
GetChild
<
EDocType
>
(
*
static_cast
<
EbmlHead
*>
(
p_l0
));
if
(
std
::
string
(
doc_type
)
!=
"matroska"
&&
std
::
string
(
doc_type
)
!=
"webm"
)
...
...
@@ -519,8 +527,15 @@ matroska_stream_c *demux_sys_t::AnalyseAllSegmentsFound( demux_t *p_demux, EbmlS
// find the families of this segment
KaxInfo
*
p_info
=
static_cast
<
KaxInfo
*>
(
p_l1
);
b_keep_segment
=
b_initial
;
p_info
->
Read
(
*
p_estream
,
EBML_CLASS_CONTEXT
(
KaxInfo
),
i_upper_lvl
,
p_l2
,
true
);
try
{
p_info
->
Read
(
*
p_estream
,
EBML_CLASS_CONTEXT
(
KaxInfo
),
i_upper_lvl
,
p_l2
,
true
);
}
catch
(...)
{
msg_Err
(
p_demux
,
"KaxInfo found but corrupted"
);
break
;
}
for
(
size_t
i
=
0
;
i
<
p_info
->
ListSize
();
i
++
)
{
EbmlElement
*
l
=
(
*
p_info
)[
i
];
...
...
modules/demux/mkv/matroska_segment.cpp
View file @
59c9e830
This diff is collapsed.
Click to expand it.
modules/demux/mkv/matroska_segment_parse.cpp
View file @
59c9e830
...
...
@@ -86,26 +86,33 @@ void matroska_segment_c::ParseSeekHead( KaxSeekHead *seekhead )
msg_Dbg
(
&
sys
.
demuxer
,
"| | + Seek"
);
#endif
ep
->
Down
();
while
(
(
l
=
ep
->
Get
()
)
!=
NULL
)
try
{
if
(
MKV_IS_ID
(
l
,
KaxSeekID
)
)
while
(
(
l
=
ep
->
Get
()
)
!=
NULL
)
{
KaxSeekID
&
sid
=
*
(
KaxSeekID
*
)
l
;
sid
.
ReadData
(
es
.
I_O
()
);
id
=
EbmlId
(
sid
.
GetBuffer
(),
sid
.
GetSize
()
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxSeekPosition
)
)
{
KaxSeekPosition
&
spos
=
*
(
KaxSeekPosition
*
)
l
;
spos
.
ReadData
(
es
.
I_O
()
);
i_pos
=
(
int64_t
)
segment
->
GetGlobalPosition
(
uint64
(
spos
)
);
}
else
{
/* Many mkvmerge files hit this case. It seems to be a broken SeekHead */
msg_Dbg
(
&
sys
.
demuxer
,
"| | + Unknown (%s)"
,
typeid
(
*
l
).
name
()
);
if
(
MKV_IS_ID
(
l
,
KaxSeekID
)
)
{
KaxSeekID
&
sid
=
*
(
KaxSeekID
*
)
l
;
sid
.
ReadData
(
es
.
I_O
()
);
id
=
EbmlId
(
sid
.
GetBuffer
(),
sid
.
GetSize
()
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxSeekPosition
)
)
{
KaxSeekPosition
&
spos
=
*
(
KaxSeekPosition
*
)
l
;
spos
.
ReadData
(
es
.
I_O
()
);
i_pos
=
(
int64_t
)
segment
->
GetGlobalPosition
(
uint64
(
spos
)
);
}
else
{
/* Many mkvmerge files hit this case. It seems to be a broken SeekHead */
msg_Dbg
(
&
sys
.
demuxer
,
"| | + Unknown (%s)"
,
typeid
(
*
l
).
name
()
);
}
}
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Error while reading %s"
,
typeid
(
*
l
).
name
()
);
}
ep
->
Up
();
if
(
i_pos
>=
0
)
...
...
@@ -713,7 +720,15 @@ void matroska_segment_c::ParseTracks( KaxTracks *tracks )
int
i_upper_level
=
0
;
/* Master elements */
tracks
->
Read
(
es
,
EBML_CONTEXT
(
tracks
),
i_upper_level
,
el
,
true
);
try
{
tracks
->
Read
(
es
,
EBML_CONTEXT
(
tracks
),
i_upper_level
,
el
,
true
);
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Couldn't read tracks"
);
return
;
}
for
(
size_t
i
=
0
;
i
<
tracks
->
ListSize
();
i
++
)
{
...
...
@@ -741,7 +756,15 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
/* Master elements */
m
=
static_cast
<
EbmlMaster
*>
(
info
);
m
->
Read
(
es
,
EBML_CONTEXT
(
info
),
i_upper_level
,
el
,
true
);
try
{
m
->
Read
(
es
,
EBML_CONTEXT
(
info
),
i_upper_level
,
el
,
true
);
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Couldn't read info"
);
return
;
}
for
(
size_t
i
=
0
;
i
<
m
->
ListSize
();
i
++
)
{
...
...
@@ -854,28 +877,35 @@ void matroska_segment_c::ParseInfo( KaxInfo *info )
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslate
)
)
{
KaxChapterTranslate
*
p_trans
=
static_cast
<
KaxChapterTranslate
*>
(
l
);
chapter_translation_c
*
p_translate
=
new
chapter_translation_c
();
p_trans
->
Read
(
es
,
EBML_CONTEXT
(
p_trans
),
i_upper_level
,
el
,
true
);
for
(
size_t
j
=
0
;
j
<
p_trans
->
ListSize
();
j
++
)
try
{
EbmlElement
*
l
=
(
*
p_trans
)[
j
];
p_trans
->
Read
(
es
,
EBML_CONTEXT
(
p_trans
),
i_upper_level
,
el
,
true
);
chapter_translation_c
*
p_translate
=
new
chapter_translation_c
();
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateEditionUID
)
)
{
p_translate
->
editions
.
push_back
(
uint64
(
*
static_cast
<
KaxChapterTranslateEditionUID
*>
(
l
)
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateCodec
)
)
{
p_translate
->
codec_id
=
uint32
(
*
static_cast
<
KaxChapterTranslateCodec
*>
(
l
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateID
)
)
for
(
size_t
j
=
0
;
j
<
p_trans
->
ListSize
();
j
++
)
{
p_translate
->
p_translated
=
new
KaxChapterTranslateID
(
*
static_cast
<
KaxChapterTranslateID
*>
(
l
)
);
EbmlElement
*
l
=
(
*
p_trans
)[
j
];
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateEditionUID
)
)
{
p_translate
->
editions
.
push_back
(
uint64
(
*
static_cast
<
KaxChapterTranslateEditionUID
*>
(
l
)
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateCodec
)
)
{
p_translate
->
codec_id
=
uint32
(
*
static_cast
<
KaxChapterTranslateCodec
*>
(
l
)
);
}
else
if
(
MKV_IS_ID
(
l
,
KaxChapterTranslateID
)
)
{
p_translate
->
p_translated
=
new
KaxChapterTranslateID
(
*
static_cast
<
KaxChapterTranslateID
*>
(
l
)
);
}
}
}
translations
.
push_back
(
p_translate
);
translations
.
push_back
(
p_translate
);
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Error while reading Chapter Tranlate"
);
}
}
else
{
...
...
@@ -1039,7 +1069,15 @@ void matroska_segment_c::ParseAttachments( KaxAttachments *attachments )
EbmlElement
*
el
;
int
i_upper_level
=
0
;
attachments
->
Read
(
es
,
EBML_CONTEXT
(
attachments
),
i_upper_level
,
el
,
true
);
try
{
attachments
->
Read
(
es
,
EBML_CONTEXT
(
attachments
),
i_upper_level
,
el
,
true
);
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Error while reading attachments"
);
return
;
}
KaxAttached
*
attachedFile
=
FindChild
<
KaxAttached
>
(
*
attachments
);
...
...
@@ -1089,7 +1127,15 @@ void matroska_segment_c::ParseChapters( KaxChapters *chapters )
int
i_upper_level
=
0
;
/* Master elements */
chapters
->
Read
(
es
,
EBML_CONTEXT
(
chapters
),
i_upper_level
,
el
,
true
);
try
{
chapters
->
Read
(
es
,
EBML_CONTEXT
(
chapters
),
i_upper_level
,
el
,
true
);
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Error while reading chapters"
);
return
;
}
for
(
size_t
i
=
0
;
i
<
chapters
->
ListSize
();
i
++
)
{
...
...
@@ -1150,7 +1196,15 @@ void matroska_segment_c::ParseCluster( bool b_update_start_time )
/* Master elements */
m
=
static_cast
<
EbmlMaster
*>
(
cluster
);
m
->
Read
(
es
,
EBML_CONTEXT
(
cluster
),
i_upper_level
,
el
,
true
);
try
{
m
->
Read
(
es
,
EBML_CONTEXT
(
cluster
),
i_upper_level
,
el
,
true
);
}
catch
(...)
{
msg_Err
(
&
sys
.
demuxer
,
"Error while reading cluster"
);
return
;
}
for
(
unsigned
int
i
=
0
;
i
<
m
->
ListSize
();
i
++
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment