1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

lavf/segment: fix crash when failing to open segment list

This happens because segment_end() returns an error, so seg_write_packet
never proceeds to segment_start(), and seg->avf->pb is never re-set,
so we crash with a null pb when av_write_trailer flushes the packet
queue.

This doesn't seem to be clearly recoverable, so I'm just failing more
gracefully.

Repro:
ffmpeg -i input.ts -f segment -c copy -segment_list /noaxx.m3u8 test-%05d.ts

(assuming you don't have write access to /)
This commit is contained in:
Rodger Combs 2017-01-20 20:15:03 -06:00
parent e371f031b9
commit 2b20290061
No known key found for this signature in database
GPG Key ID: E3E54DCDCD3CB843

View File

@ -354,6 +354,9 @@ static int segment_end(AVFormatContext *s, int write_trailer, int is_last)
int i; int i;
int err; int err;
if (!oc || !oc->pb)
return AVERROR(EINVAL);
av_write_frame(oc, NULL); /* Flush any buffered data (fragmented mp4) */ av_write_frame(oc, NULL); /* Flush any buffered data (fragmented mp4) */
if (write_trailer) if (write_trailer)
ret = av_write_trailer(oc); ret = av_write_trailer(oc);
@ -850,7 +853,7 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
int64_t usecs; int64_t usecs;
int64_t wrapped_val; int64_t wrapped_val;
if (!seg->avf) if (!seg->avf || !seg->avf->pb)
return AVERROR(EINVAL); return AVERROR(EINVAL);
calc_times: calc_times: