mirror of https://github.com/mpv-player/mpv
stream_libarchive: fix hangs when demuxer does out of bound seeks
This happened with a .flac file inside an archive. It tried to seek
beyond the end of the archive entry in a format where seeking isn't
supported. stream_libarchive handles these situations by skipping data.
But when the end of the archive is reached, archive_read_data() returns
0. While libarchive didn't bother to fucking document this, they do say
it's supposed to work like read(), so I guess a return value of 0 really
means EOF. So change the "< 0" to "<= 0". Also add some error logging.
The same file actually worked without out of bounds reads when
extracted, so there still might be something very wrong.
(cherry picked from commit 7e85dc2167
)
This commit is contained in:
parent
4f47596043
commit
e74ffab36e
|
@ -432,8 +432,15 @@ static int archive_entry_seek(stream_t *s, int64_t newpos)
|
|||
int size = MPMIN(newpos - s->pos, sizeof(buffer));
|
||||
locale_t oldlocale = uselocale(p->mpa->locale);
|
||||
int r = archive_read_data(p->mpa->arch, buffer, size);
|
||||
if (r < 0) {
|
||||
MP_ERR(s, "%s\n", archive_error_string(p->mpa->arch));
|
||||
if (r <= 0) {
|
||||
if (r == 0 && newpos > p->entry_size) {
|
||||
MP_ERR(s, "demuxer trying to seek beyond end of archive "
|
||||
"entry\n");
|
||||
} else if (r == 0) {
|
||||
MP_ERR(s, "end of archive entry reached while seeking\n");
|
||||
} else {
|
||||
MP_ERR(s, "%s\n", archive_error_string(p->mpa->arch));
|
||||
}
|
||||
uselocale(oldlocale);
|
||||
if (mp_archive_check_fatal(p->mpa, r)) {
|
||||
mp_archive_free(p->mpa);
|
||||
|
|
Loading…
Reference in New Issue