summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2016-05-29 04:00:27 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2016-05-29 04:42:04 +0200
commitdac030d3aa1bdf73267dbf374d5d9387dad740bb (patch)
tree1af28498960af15d603a69ee6f2f4d2fd5a31b3f /libavformat
parent17d320800b70a78f4e90cd96564154e829db8b8d (diff)
avformat/movenc: Fix potential track width/height overflows
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/movenc.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f96712435e..49cd1bdd5a 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2444,24 +2444,28 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov,
/* Track width and height, for visual only */
if (st && (track->par->codec_type == AVMEDIA_TYPE_VIDEO ||
track->par->codec_type == AVMEDIA_TYPE_SUBTITLE)) {
+ int64_t track_width_1616;
if (track->mode == MODE_MOV) {
- avio_wb32(pb, track->par->width << 16);
- avio_wb32(pb, track->height << 16);
+ track_width_1616 = track->par->width * 0x10000ULL;
} else {
- int64_t track_width_1616 = av_rescale(st->sample_aspect_ratio.num,
+ track_width_1616 = av_rescale(st->sample_aspect_ratio.num,
track->par->width * 0x10000LL,
st->sample_aspect_ratio.den);
if (!track_width_1616 ||
track->height != track->par->height ||
track_width_1616 > UINT32_MAX)
track_width_1616 = track->par->width * 0x10000ULL;
- if (track_width_1616 > UINT32_MAX) {
- av_log(mov->fc, AV_LOG_WARNING, "track width too large\n");
- track_width_1616 = 0;
- }
- avio_wb32(pb, track_width_1616);
- avio_wb32(pb, track->height * 0x10000U);
}
+ if (track_width_1616 > UINT32_MAX) {
+ av_log(mov->fc, AV_LOG_WARNING, "track width is too large\n");
+ track_width_1616 = 0;
+ }
+ avio_wb32(pb, track_width_1616);
+ if (track->height > 0xFFFF) {
+ av_log(mov->fc, AV_LOG_WARNING, "track height is too large\n");
+ avio_wb32(pb, 0);
+ } else
+ avio_wb32(pb, track->height * 0x10000U);
} else {
avio_wb32(pb, 0);
avio_wb32(pb, 0);