From c4e0e74438e497fa4f5fec6c186ffb33152c4898 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Mon, 2 Jul 2012 10:28:31 +1000 Subject: [PATCH] wtvdec: return error when filetime_to_iso8601/crazytime_to_iso8601 conversion fails Signed-off-by: Michael Niedermayer --- libavformat/wtvdec.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index 338eff8bfb..eb312500c0 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -368,28 +368,30 @@ static int read_probe(AVProbeData *p) /** * Convert win32 FILETIME to ISO-8601 string + * @return <0 on error */ -static void filetime_to_iso8601(char *buf, int buf_size, int64_t value) +static int filetime_to_iso8601(char *buf, int buf_size, int64_t value) { time_t t = (value / 10000000LL) - 11644473600LL; struct tm *tm = gmtime(&t); - if (tm) - strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); - else - buf[0] = '\0'; + if (!tm) + return -1; + strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); + return 0; } /** * Convert crazy time (100ns since 1 Jan 0001) to ISO-8601 string + * @return <0 on error */ -static void crazytime_to_iso8601(char *buf, int buf_size, int64_t value) +static int crazytime_to_iso8601(char *buf, int buf_size, int64_t value) { time_t t = (value / 10000000LL) - 719162LL*86400LL; struct tm *tm = gmtime(&t); - if (tm) - strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); - else - buf[0] = '\0'; + if (!tm) + return -1; + strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", gmtime(&t)); + return 0; } /** @@ -460,10 +462,16 @@ static void get_tag(AVFormatContext *s, AVIOContext *pb, const char *key, int ty int64_t num = avio_rl64(pb); if (!strcmp(key, "WM/EncodingTime") || !strcmp(key, "WM/MediaOriginalBroadcastDateTime")) - filetime_to_iso8601(buf, buf_size, num); + if (filetime_to_iso8601(buf, buf_size, num) < 0) { + av_free(buf); + return; + } else if (!strcmp(key, "WM/WMRVEncodeTime") || !strcmp(key, "WM/WMRVEndTime")) - crazytime_to_iso8601(buf, buf_size, num); + if (crazytime_to_iso8601(buf, buf_size, num) < 0) { + av_free(buf); + return; + } else if (!strcmp(key, "WM/WMRVExpirationDate")) { if (oledate_to_iso8601(buf, buf_size, num) < 0 ) { av_free(buf);