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
aed1b6da
Commit
aed1b6da
authored
Aug 30, 2014
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
decomp: fix heap overflow and cleanup (fixes #12052)
parent
5033a463
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
38 additions
and
25 deletions
+38
-25
modules/stream_filter/decomp.c
modules/stream_filter/decomp.c
+38
-25
No files found.
modules/stream_filter/decomp.c
View file @
aed1b6da
...
...
@@ -183,16 +183,19 @@ static int Peek (stream_t *, const uint8_t **, unsigned int);
*/
static
int
Read
(
stream_t
*
stream
,
void
*
buf
,
unsigned
int
buflen
)
{
stream_sys_t
*
p_sys
=
stream
->
p_sys
;
block_t
*
peeked
;
ssize_t
length
;
stream_sys_t
*
sys
=
stream
->
p_sys
;
unsigned
ret
=
0
;
if
(
buf
==
NULL
)
/* caller skips data, get big enough peek buffer */
buflen
=
Peek
(
stream
,
&
(
const
uint8_t
*
){
NULL
},
buflen
);
if
((
peeked
=
p_sys
->
peeked
)
!=
NULL
)
block_t
*
peeked
=
sys
->
peeked
;
if
(
peeked
!=
NULL
)
{
/* dequeue peeked data */
length
=
(
buflen
>
peeked
->
i_buffer
)
?
peeked
->
i_buffer
:
buflen
;
size_t
length
=
peeked
->
i_buffer
;
if
(
length
>
buflen
)
length
=
buflen
;
if
(
buf
!=
NULL
)
{
memcpy
(
buf
,
peeked
->
p_buffer
,
length
);
...
...
@@ -201,24 +204,25 @@ static int Read (stream_t *stream, void *buf, unsigned int buflen)
buflen
-=
length
;
peeked
->
p_buffer
+=
length
;
peeked
->
i_buffer
-=
length
;
if
(
peeked
->
i_buffer
==
0
)
{
block_Release
(
peeked
);
p_
sys
->
peeked
=
NULL
;
sys
->
peeked
=
NULL
;
}
p_sys
->
offset
+=
length
;
if
(
buflen
>
0
)
length
+=
Read
(
stream
,
((
char
*
)
buf
)
+
length
,
buflen
-
length
);
return
length
;
sys
->
offset
+=
length
;
ret
+=
length
;
}
assert
((
buf
!=
NULL
)
||
(
buflen
==
0
));
length
=
net_Read
(
stream
,
p_sys
->
read_fd
,
NULL
,
buf
,
buflen
,
false
);
if
(
length
<
0
)
return
0
;
p_sys
->
offset
+=
length
;
return
length
;
ssize_t
val
=
net_Read
(
stream
,
sys
->
read_fd
,
NULL
,
buf
,
buflen
,
false
);
if
(
val
>
0
)
{
sys
->
offset
+=
val
;
ret
+=
val
;
}
return
ret
;
}
/**
...
...
@@ -226,23 +230,32 @@ static int Read (stream_t *stream, void *buf, unsigned int buflen)
*/
static
int
Peek
(
stream_t
*
stream
,
const
uint8_t
**
pbuf
,
unsigned
int
len
)
{
stream_sys_t
*
p_sys
=
stream
->
p_sys
;
block_t
*
peeked
=
p_sys
->
peeked
;
size_t
curlen
=
0
;
int
fd
=
p_sys
->
read_fd
;
stream_sys_t
*
sys
=
stream
->
p_sys
;
block_t
*
peeked
=
sys
->
peeked
;
size_t
curlen
;
if
(
peeked
==
NULL
)
peeked
=
block_Alloc
(
len
);
else
if
((
curlen
=
peeked
->
i_buffer
)
<
len
)
if
(
peeked
!=
NULL
)
{
curlen
=
peeked
->
i_buffer
;
if
(
curlen
<
len
)
peeked
=
block_Realloc
(
peeked
,
0
,
len
);
}
else
{
curlen
=
0
;
peeked
=
block_Alloc
(
len
);
}
if
((
p_sys
->
peeked
=
peeked
)
==
NULL
)
sys
->
peeked
=
peeked
;
if
(
unlikely
(
peeked
==
NULL
))
return
0
;
while
(
curlen
<
len
)
{
ssize_t
val
=
net_Read
(
stream
,
fd
,
NULL
,
peeked
->
p_buffer
+
curlen
,
len
-
curlen
,
false
);
ssize_t
val
;
val
=
net_Read
(
stream
,
sys
->
read_fd
,
NULL
,
peeked
->
p_buffer
+
curlen
,
len
-
curlen
,
false
);
if
(
val
<=
0
)
break
;
curlen
+=
val
;
...
...
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