lavf: Check the return value of strftime
authorMartin Storsjö <martin@martin.st>
Fri, 24 Oct 2014 07:43:20 +0000 (10:43 +0300)
committerMartin Storsjö <martin@martin.st>
Sat, 25 Oct 2014 21:14:54 +0000 (00:14 +0300)
If the buffer provided to strftime is too small, the buffer contents
are indeterminate - it does not guarantee actually null terminating
the buffer.

Signed-off-by: Martin Storsjö <martin@martin.st>
libavformat/mov.c
libavformat/mxfdec.c
libavformat/wtv.c

index efc9314087d05a08dd6ff5ef4b0b9bd83384c9f1..a5b39f29dd2b2aeae64b4bcf7b5b200db1c11db6 100644 (file)
@@ -743,8 +743,8 @@ static void mov_metadata_creation_time(AVDictionary **metadata, time_t time)
         time -= 2082844800;  /* seconds between 1904-01-01 and Epoch */
         ptm = gmtime(&time);
         if (!ptm) return;
-        strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
-        av_dict_set(metadata, "creation_time", buffer, 0);
+        if (strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm))
+            av_dict_set(metadata, "creation_time", buffer, 0);
     }
 }
 
index 9aedd477f49cc0e5112b28ceee24afd5d08d5f01..ff88f919a6907719ff4fdf246aab69149b9a02a9 100644 (file)
@@ -1735,7 +1735,8 @@ static int mxf_timestamp_to_str(uint64_t timestamp, char **str)
     *str = av_mallocz(32);
     if (!*str)
         return AVERROR(ENOMEM);
-    strftime(*str, 32, "%Y-%m-%d %H:%M:%S", &time);
+    if (!strftime(*str, 32, "%Y-%m-%d %H:%M:%S", &time))
+        str[0] = '\0';
 
     return 0;
 }
index fa864e840afa37a5ff6feca56822d88f0f2fba52..90984cfda0b2a673f0c2fdf8f980174cb6b426c3 100644 (file)
@@ -429,9 +429,10 @@ static void 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", tm);
-    else
+    if (tm) {
+        if (!strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", tm))
+            buf[0] = '\0';
+    } else
         buf[0] = '\0';
 }
 
@@ -442,9 +443,10 @@ static void 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", tm);
-    else
+    if (tm) {
+        if (!strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", tm))
+            buf[0] = '\0';
+    } else
         buf[0] = '\0';
 }
 
@@ -455,9 +457,10 @@ static void oledate_to_iso8601(char *buf, int buf_size, int64_t value)
 {
     time_t t = 631112400LL + 86400*av_int2double(value);
     struct tm *tm = gmtime(&t);
-    if (tm)
-        strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", tm);
-    else
+    if (tm) {
+        if (!strftime(buf, buf_size, "%Y-%m-%d %H:%M:%S", tm))
+            buf[0] = '\0';
+    } else
         buf[0] = '\0';
 }