Xinqi Bao's Git

worked around the buffer overrun in smprintf()
[slstatus.git] / slstatus.c
index 90534d9..08866d2 100644 (file)
@@ -78,17 +78,18 @@ setstatus(const char *str)
 static char *
 smprintf(const char *fmt, ...)
 {
-       va_list fmtargs;
+       va_list ap;
        char tmp[120];
        char *ret = NULL;
 
-       va_start(fmtargs, fmt);
-       snprintf(tmp, sizeof(tmp)-1, fmt, fmtargs);
-       tmp[sizeof(tmp)] = '\0';
+       va_start(ap, fmt);
+       vsnprintf(tmp, sizeof(tmp)-1, fmt, ap);
+       tmp[strlen(tmp)+1] = '\0';
+
        if (asprintf(&ret, "%s", tmp) < 0)
                return NULL;
 
-       va_end(fmtargs);
+       va_end(ap);
        return ret;
 }
 
@@ -163,27 +164,14 @@ cpu_perc(void)
 static char *
 datetime(const char *timeformat)
 {
-       time_t tm;
-       size_t bufsize = 64;
-       char *buf = malloc(bufsize);
-       if (buf == NULL) {
-               fprintf(stderr, "Failed to get date/time.\n");
-               return smprintf(UNKNOWN_STR);
-       }
+       time_t t;
+       char timestr[80];
 
-       time(&tm);
-       setlocale(LC_TIME, "");
-       if (!strftime(buf, bufsize, timeformat, localtime(&tm))) {
-               setlocale(LC_TIME, "C");
-               free(buf);
-               fprintf(stderr, "Strftime failed.\n");
+       t = time(NULL);
+       if (strftime(timestr, sizeof(timestr), timeformat, localtime(&t)) == 0)
                return smprintf(UNKNOWN_STR);
-       }
 
-       setlocale(LC_TIME, "C");
-       char *ret = smprintf("%s", buf);
-       free(buf);
-       return ret;
+       return smprintf("%s", timestr);
 }
 
 static char *