str_format_time: do not hard-code buffer length - fix #2242
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Sat, 25 Oct 2008 13:08:58 +0000 (16:08 +0300)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Sat, 25 Oct 2008 13:08:58 +0000 (16:08 +0300)
src/text/strings.c

index 6840834..82e29db 100644 (file)
@@ -641,22 +641,38 @@ char *vlc_b64_decode( const char *psz_src )
     return p_dst;
 }
 
-/****************************************************************************
- * String formating functions
- ****************************************************************************/
+/**
+ * Formats current time into a heap-allocated string.
+ * @param tformat time format (as with C strftime())
+ * @return an allocated string (must be free()'d), or NULL on memory error.
+ */
 char *str_format_time( const char *tformat )
 {
-    char buffer[255];
     time_t curtime;
     struct tm loctime;
 
+    if (strcmp (tformat, "") == 0)
+        return strdup (""); /* corner case w.r.t. strftime() return value */
+
     /* Get the current time.  */
-    curtime = time( NULL );
+    time( &curtime );
 
     /* Convert it to local time representation.  */
     localtime_r( &curtime, &loctime );
-    strftime( buffer, 255, tformat, &loctime );
-    return strdup( buffer );
+    for (size_t buflen = strlen (tformat) + 32;; buflen += 32)
+    {
+        char *str = malloc (buflen);
+        if (str == NULL)
+            return NULL;
+
+        size_t len = strftime (str, buflen, tformat, &loctime);
+        if (len > 0)
+        {
+            char *ret = realloc (str, len + 1);
+            return ret ? ret : str; /* <- this cannot fail */
+        }
+    }
+    assert (0);
 }
 
 #define INSERT_STRING( string )                                     \