To reproduce run `slock & slock`. The first gets the password and exits, but the second did not manage to grab keyboard and mouse. The actual bug is that it did not understand that it didn't, so it just hangs there and keeps the
screen blank unitl it is killed.

A patch for this is attatched. If it does not manage to lock any screen
(maybe because they are already locked) it exits with code 1.
diff --git a/slock.c b/slock.c
index bf75045..787b880 100644
--- a/slock.c
+++ b/slock.c
@@ -1,3 +1,4 @@
+
 /* See LICENSE file for license details. */
 #define _XOPEN_SOURCE 500
 #if HAVE_SHADOW_H
@@ -237,9 +238,9 @@ lockscreen(Display *dpy, int screen) {
 				break;
 			usleep(1000);
 		}
-		running = (len > 0);
 	}
 
+	running &= (len > 0);
 	if(!running) {
 		unlockscreen(dpy, lock);
 		lock = NULL;
@@ -286,10 +287,20 @@ main(int argc, char **argv) {
 	locks = malloc(sizeof(Lock *) * nscreens);
 	if(locks == NULL)
 		die("slock: malloc: %s", strerror(errno));
-	for(screen = 0; screen < nscreens; screen++)
-		locks[screen] = lockscreen(dpy, screen);
+	int nlocks = 0;
+	for(screen = 0; screen < nscreens; screen++) {
+		if ( (locks[screen] = lockscreen(dpy, screen)) != NULL)
+			nlocks++;
+	}
 	XSync(dpy, False);
 
+	/* Did we actually manage to lock something? */
+	if (nlocks == 0) { // nothing to protect
+		free(locks);
+		XCloseDisplay(dpy);
+		return 1;
+	}
+
 	/* Everything is now blank. Now wait for the correct password. */
 #ifdef HAVE_BSD_AUTH
 	readpw(dpy);

Reply via email to