Move screen unlocking inside cleanup()
authorQuentin Rameau <quinq@fifth.space>
Thu, 1 Sep 2016 11:47:05 +0000 (13:47 +0200)
committerMarkus Teich <markus.teich@stusta.mhn.de>
Fri, 2 Sep 2016 08:50:32 +0000 (10:50 +0200)
slock.c

diff --git a/slock.c b/slock.c
index 97c7489..0682279 100644 (file)
--- a/slock.c
+++ b/slock.c
@@ -234,6 +234,11 @@ unlockscreen(Display *dpy, Lock *lock)
 static void
 cleanup(Display *dpy)
 {
+       int s;
+
+       for (s = 0; s < nscreens; ++s)
+               unlockscreen(dpy, locks[s]);
+
        free(locks);
        XCloseDisplay(dpy);
 }
@@ -305,8 +310,6 @@ lockscreen(Display *dpy, int screen)
                fprintf(stderr, "slock: unable to grab mouse pointer for screen %d\n", screen);
        if (kbgrab != GrabSuccess)
                fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", screen);
-       running = 0;
-       unlockscreen(dpy, lock);
        return NULL;
 }
 
@@ -359,19 +362,21 @@ main(int argc, char **argv) {
 
        /* get number of screens in display "dpy" and blank them */
        nscreens = ScreenCount(dpy);
-       if (!(locks = malloc(sizeof(Lock *) * nscreens))) {
+       if (!(locks = calloc(nscreens, sizeof(Lock *)))) {
                XCloseDisplay(dpy);
                die("slock: out of memory\n");
        }
        for (nlocks = 0, s = 0; s < nscreens; s++) {
                if ((locks[s] = lockscreen(dpy, s)) != NULL)
                        nlocks++;
+               else
+                       break;
        }
        XSync(dpy, 0);
 
-       /* did we actually manage to lock anything? */
-       if (nlocks == 0) {
-               /* nothing to protect */
+       /* did we manage to lock everything? */
+       if (nlocks != nscreens) {
+               running = 0;
                cleanup(dpy);
                return 1;
        }
@@ -400,9 +405,6 @@ main(int argc, char **argv) {
 #endif
 
        /* password ok, unlock everything and quit */
-       for (s = 0; s < nscreens; s++)
-               unlockscreen(dpy, locks[s]);
-
        cleanup(dpy);
 
        return 0;