Xinqi Bao's Git

Properly handle *snprintf() errors
[slstatus.git] / slstatus.c
index e8d367b..35bdcd6 100644 (file)
@@ -1,4 +1,5 @@
 /* See LICENSE file for copyright and license details. */
+#include <errno.h>
 #include <locale.h>
 #include <signal.h>
 #include <stdio.h>
@@ -53,7 +54,7 @@ main(int argc, char *argv[])
        struct sigaction act;
        struct timespec start, current, diff, intspec, wait;
        size_t i, len;
-       int sflag;
+       int sflag, ret;
        char status[MAXLEN];
 
        sflag = 0;
@@ -88,12 +89,16 @@ main(int argc, char *argv[])
                for (i = len = 0; i < LEN(args); i++) {
                        const char * res = args[i].func(args[i].args);
                        res = (res == NULL) ? unknown_str : res;
-                       len += snprintf(status + len, sizeof(status) - len,
-                                       args[i].fmt, res);
-
-                       if (len >= sizeof(status)) {
-                               status[sizeof(status) - 1] = '\0';
+                       if ((ret = snprintf(status + len, sizeof(status) - len,
+                                           args[i].fmt, res)) < 0) {
+                               fprintf(stderr, "snprintf: %s\n",
+                                       strerror(errno));
+                               break;
+                       } else if ((size_t)ret >= sizeof(status) - len) {
+                               fprintf(stderr, "snprintf: Output truncated\n");
+                               break;
                        }
+                       len += ret;
                }
 
                if (sflag) {