[FFmpeg-cvslog] wtv: detect ole date overflow

Peter Ross git at videolan.org
Mon May 9 02:28:45 CEST 2011


ffmpeg | branch: master | Peter Ross <pross at xvid.org> | Sun May  8 20:13:59 2011 +0200| [8acab7ae5bbcb589c556425453ac3d851d35021f] | committer: Michael Niedermayer

wtv: detect ole date overflow

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8acab7ae5bbcb589c556425453ac3d851d35021f
---

 libavformat/wtvdec.c |   18 +++++++++++++-----
 1 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c
index c775dfb..19d5b54 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);



More information about the ffmpeg-cvslog mailing list