diff options
author | Peter Ross <pross@xvid.org> | 2011-05-08 20:13:59 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-05-09 02:25:40 +0200 |
commit | 8acab7ae5bbcb589c556425453ac3d851d35021f (patch) | |
tree | ac8a7870f34af4ce8bed7415ae5152fbdb5a854c /libavformat/wtvdec.c | |
parent | 3dd779eb0affdd6d597291a5cc6215a138f71495 (diff) | |
download | ffmpeg-8acab7ae5bbcb589c556425453ac3d851d35021f.tar.gz |
wtv: detect ole date overflow
Diffstat (limited to 'libavformat/wtvdec.c')
-rw-r--r-- | libavformat/wtvdec.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index c775dfba2e..19d5b54ce0 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -398,11 +398,16 @@ static void crazytime_to_iso8601(char *buf, int buf_size, int64_t value) /** * Convert OLE DATE to ISO-8601 string + * @return <0 on error */ -static void oledate_to_iso8601(char *buf, int buf_size, int64_t value) +static int oledate_to_iso8601(char *buf, int buf_size, int64_t value) { time_t t = 631112400LL + 86400*av_int2dbl(value); - strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); + struct tm result; + if (!gmtime_r(&t, &result)) + return -1; + strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", &result); + return 0; } static void get_attachment(AVFormatContext *s, AVIOContext *pb, int length) @@ -463,9 +468,12 @@ static void get_tag(AVFormatContext *s, AVIOContext *pb, const char *key, int ty else if (!strcmp(key, "WM/WMRVEncodeTime") || !strcmp(key, "WM/WMRVEndTime")) crazytime_to_iso8601(buf, buf_size, num); - else if (!strcmp(key, "WM/WMRVExpirationDate")) - oledate_to_iso8601(buf, buf_size, num); - else if (!strcmp(key, "WM/WMRVBitrate")) + else if (!strcmp(key, "WM/WMRVExpirationDate")) { + if (oledate_to_iso8601(buf, buf_size, num) < 0 ) { + av_free(buf); + return; + } + } else if (!strcmp(key, "WM/WMRVBitrate")) snprintf(buf, buf_size, "%f", av_int2dbl(num)); else snprintf(buf, buf_size, "%"PRIi64, num); |