Xinqi Bao's Git

Fixed possible NULL-deref and removed unnecessary XOpenDisplay()
[slstatus.git] / slstatus.c
index c4a9e92..47bd4c9 100644 (file)
@@ -28,6 +28,8 @@
 
 #include "arg.h"
 
+#define LEN(x) (sizeof (x) / sizeof *(x))
+
 struct arg {
        const char *(*func)();
        const char *fmt;
@@ -167,13 +169,13 @@ battery_state(const char *bat)
        if (n != 1)
                return UNKNOWN_STR;
 
-       for (i = 0; i < sizeof(map) / sizeof(*map); i++) {
+       for (i = 0; i < LEN(map); i++) {
                if (!strcmp(map[i].state, state)) {
                        break;
                }
        }
 
-       return (i == sizeof(map) / sizeof(*map)) ? "?" : map[i].symbol;
+       return (i == LEN(map)) ? "?" : map[i].symbol;
 }
 
 static const char *
@@ -378,10 +380,9 @@ kernel_release(void)
 static const char *
 keyboard_indicators(void)
 {
-       Display *dpy = XOpenDisplay(NULL);
        XKeyboardState state;
+
        XGetKeyboardControl(dpy, &state);
-       XCloseDisplay(dpy);
 
        switch (state.led_mask) {
                case 1:
@@ -745,7 +746,7 @@ vol_perc(const char *card)
                close(afd);
                return UNKNOWN_STR;
        }
-       for (i = 0; i < (sizeof(vnames) / sizeof((vnames[0]))); i++) {
+       for (i = 0; i < LEN(vnames); i++) {
                if (devmask & (1 << i) && !strcmp("vol", vnames[i])) {
                        if (ioctl(afd, MIXER_READ(i), &v) == -1) {
                                warn("vol_perc: ioctl");
@@ -877,6 +878,10 @@ main(int argc, char *argv[])
 
        if (!sflag) {
                dpy = XOpenDisplay(NULL);
+               if (!dpy) {
+                       fprintf(stderr, "slstatus: cannot open display");
+                       exit(1);
+               }
        }
 
        setlocale(LC_ALL, "");
@@ -884,8 +889,7 @@ main(int argc, char *argv[])
        while (!done) {
                status_string[0] = '\0';
 
-               for (element = status_string, i = len = 0;
-                    i < sizeof(args) / sizeof(args[0]);
+               for (element = status_string, i = len = 0; i < LEN(args);
                     ++i, element += len) {
                        argument = args[i];
                        len = snprintf(element, sizeof(status_string)-1 - len,