Commit 2608f118 authored by Carl Eugen Hoyos's avatar Carl Eugen Hoyos

lavf/wav: Print an error if files >4G are written.

Additionally, don't write an incorrect shorter size for such files.

Fixes part of ticket #4543.
parent 101f26e7
...@@ -425,7 +425,7 @@ static int wav_write_trailer(AVFormatContext *s) ...@@ -425,7 +425,7 @@ static int wav_write_trailer(AVFormatContext *s)
avio_flush(pb); avio_flush(pb);
if (s->pb->seekable) { if (s->pb->seekable) {
if (wav->write_peak != 2) { if (wav->write_peak != 2 && avio_tell(pb) - wav->data < UINT32_MAX) {
ff_end_tag(pb, wav->data); ff_end_tag(pb, wav->data);
avio_flush(pb); avio_flush(pb);
} }
...@@ -440,12 +440,16 @@ static int wav_write_trailer(AVFormatContext *s) ...@@ -440,12 +440,16 @@ static int wav_write_trailer(AVFormatContext *s)
data_size = file_size - wav->data; data_size = file_size - wav->data;
if (wav->rf64 == RF64_ALWAYS || (wav->rf64 == RF64_AUTO && file_size - 8 > UINT32_MAX)) { if (wav->rf64 == RF64_ALWAYS || (wav->rf64 == RF64_AUTO && file_size - 8 > UINT32_MAX)) {
rf64 = 1; rf64 = 1;
} else { } else if (file_size - 8 <= UINT32_MAX) {
avio_seek(pb, 4, SEEK_SET); avio_seek(pb, 4, SEEK_SET);
avio_wl32(pb, (uint32_t)(file_size - 8)); avio_wl32(pb, (uint32_t)(file_size - 8));
avio_seek(pb, file_size, SEEK_SET); avio_seek(pb, file_size, SEEK_SET);
avio_flush(pb); avio_flush(pb);
} else {
av_log(s, AV_LOG_ERROR,
"Filesize %"PRId64" invalid for wav, output file will be broken\n",
file_size);
} }
number_of_samples = av_rescale(wav->maxpts - wav->minpts + wav->last_duration, number_of_samples = av_rescale(wav->maxpts - wav->minpts + wav->last_duration,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment