Xinqi Bao's Git

Properly handle *snprintf() errors
[slstatus.git] / slstatus.c
index 19bc127..35bdcd6 100644 (file)
@@ -1,5 +1,4 @@
 /* See LICENSE file for copyright and license details. */
-#include <err.h>
 #include <errno.h>
 #include <locale.h>
 #include <signal.h>
@@ -21,7 +20,7 @@ struct arg {
 
 char *argv0;
 char buf[1024];
-static unsigned short int done;
+static int done;
 static Display *dpy;
 
 #include "config.h"
@@ -55,9 +54,10 @@ main(int argc, char *argv[])
        struct sigaction act;
        struct timespec start, current, diff, intspec, wait;
        size_t i, len;
-       int sflag = 0;
+       int sflag, ret;
        char status[MAXLEN];
 
+       sflag = 0;
        ARGBEGIN {
                case 's':
                        sflag = 1;
@@ -78,7 +78,7 @@ main(int argc, char *argv[])
        sigaction(SIGTERM, &act, NULL);
 
        if (!sflag && !(dpy = XOpenDisplay(NULL))) {
-               fprintf(stderr, "slstatus: cannot open display");
+               fprintf(stderr, "Cannot open display");
                return 1;
        }
 
@@ -89,16 +89,21 @@ 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) {
                        printf("%s\n", status);
+                       fflush(stdout);
                } else {
                        XStoreName(dpy, DefaultRootWindow(dpy), status);
                        XSync(dpy, False);