On Thu, May 21, 2020 at 11:58:37AM +0100, Stuart Henderson wrote:
> I've written a patch to add bsd-auth support back to slock 1.4 which
> I've been using for a while. Tidied the make variable handling a bit
> as well, no need to patch to use ?=, they can just be overridden with
> MAKE_FLAGS. OK?
I would prefer if this used the libc version of explicit_bzero instead
of the local copy. For this, set COMPATSRC to empty in compat.mk (why do
you add a COPTSFLAG=-Os via a patch?).
While the updated slock seems to work fine from the command line, it
doesn't lock at all if I use it from a i3 binding. I have been using
bindsym $mod+Mod1+l exec "slock"
in my ~/.i3/config for many years without issue, but this breaks with
this update. In my xsession-errors I see:
slock: unable to grab mouse pointer for screen 0
slock: unable to grab keyboard for screen 0
I haven't looked more closely into why this happens, but I would
appreciate a workaround for this so I can keep a binding for the lock.
Out of curiosity: what prompted this update?
>
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/x11/slock/Makefile,v
> retrieving revision 1.17
> diff -u -p -r1.17 Makefile
> --- Makefile 12 Jul 2019 20:51:21 -0000 1.17
> +++ Makefile 21 May 2020 10:58:17 -0000
> @@ -2,9 +2,7 @@
>
> COMMENT= simple X screen locker
>
> -# slock-1.4 drops bsd-auth support; CVE-2016-6866 doesn't affect
> HAVE_BSD_AUTH
> -DISTNAME= slock-1.3
> -REVISION= 1
> +DISTNAME= slock-1.4
>
> CATEGORIES= x11
>
> @@ -19,9 +17,11 @@ WANTLIB= X11 c Xext Xrandr
>
> MASTER_SITES= http://dl.suckless.org/tools/
>
> -MAKE_ENV= CC="${CC}" \
> - LDFLAGS="${LDFLAGS}"
> -FAKE_FLAGS= DESTDIR=""
> +MAKE_FLAGS= CC="${CC}" \
> + COPTFLAGS="${CFLAGS}" \
> + MANPREFIX=${PREFIX}/man \
> + X11INC=${X11BASE}/include \
> + X11LIB=${X11BASE}/lib
>
> NO_TEST= Yes
>
> Index: distinfo
> ===================================================================
> RCS file: /cvs/ports/x11/slock/distinfo,v
> retrieving revision 1.10
> diff -u -p -r1.10 distinfo
> --- distinfo 5 Mar 2016 19:17:01 -0000 1.10
> +++ distinfo 21 May 2020 10:58:17 -0000
> @@ -1,2 +1,2 @@
> -SHA256 (slock-1.3.tar.gz) = urSjrqQEaqD9A2HDZJt5uQylMbxd+uPEpsD+Q2FSvRg=
> -SIZE (slock-1.3.tar.gz) = 5943
> +SHA256 (slock-1.4.tar.gz) = tThJ28YBCamH16SbjaGXMFwpMH/XTBLcGK8NMEQ5Lmo=
> +SIZE (slock-1.4.tar.gz) = 6889
> Index: patches/patch-Makefile
> ===================================================================
> RCS file: /cvs/ports/x11/slock/patches/patch-Makefile,v
> retrieving revision 1.5
> diff -u -p -r1.5 patch-Makefile
> --- patches/patch-Makefile 5 Mar 2016 19:17:01 -0000 1.5
> +++ patches/patch-Makefile 21 May 2020 10:58:17 -0000
> @@ -1,6 +1,8 @@
> -$OpenBSD: patch-Makefile,v 1.5 2016/03/05 19:17:01 jung Exp $
> ---- Makefile.orig Fri Feb 12 20:29:02 2016
> -+++ Makefile Fri Feb 26 21:06:04 2016
> +$OpenBSD$
> +
> +Index: Makefile
> +--- Makefile.orig
> ++++ Makefile
> @@ -15,8 +15,7 @@ options:
> @echo "CC = ${CC}"
>
> @@ -9,7 +11,7 @@ $OpenBSD: patch-Makefile,v 1.5 2016/03/0
> - @${CC} -c ${CFLAGS} $<
> + ${CC} -c ${CFLAGS} $<
>
> - ${OBJ}: config.h config.mk
> + ${OBJ}: config.h config.mk arg.h util.h
>
> @@ -25,8 +24,7 @@ config.h:
> @cp config.def.h $@
> Index: patches/patch-config_def_h
> ===================================================================
> RCS file: patches/patch-config_def_h
> diff -N patches/patch-config_def_h
> --- patches/patch-config_def_h 5 Mar 2016 19:17:01 -0000 1.2
> +++ /dev/null 1 Jan 1970 00:00:00 -0000
> @@ -1,11 +0,0 @@
> -$OpenBSD: patch-config_def_h,v 1.2 2016/03/05 19:17:01 jung Exp $
> ---- config.def.h.orig Fri Feb 12 20:29:02 2016
> -+++ config.def.h Fri Feb 26 20:57:47 2016
> -@@ -1,6 +1,6 @@
> - static const char *colorname[NUMCOLS] = {
> - "black", /* after initialization */
> -- "#005577", /* during input */
> -+ "#404040", /* during input */
> - "#CC3333", /* failed/cleared the input */
> - };
> - static const Bool failonclear = True;
> Index: patches/patch-config_mk
> ===================================================================
> RCS file: /cvs/ports/x11/slock/patches/patch-config_mk,v
> retrieving revision 1.9
> diff -u -p -r1.9 patch-config_mk
> --- patches/patch-config_mk 13 Aug 2016 14:00:00 -0000 1.9
> +++ patches/patch-config_mk 21 May 2020 10:58:17 -0000
> @@ -1,44 +1,23 @@
> -$OpenBSD: patch-config_mk,v 1.9 2016/08/13 14:00:00 tb Exp $
> ---- config.mk.orig Fri Feb 12 20:29:02 2016
> -+++ config.mk Sat Aug 13 15:38:13 2016
> -@@ -4,28 +4,28 @@ VERSION = 1.3
> - # Customize below to fit your system
> -
> - # paths
> --PREFIX = /usr/local
> --MANPREFIX = ${PREFIX}/share/man
> -+PREFIX ?= /usr/local
> -+MANPREFIX = ${PREFIX}/man
> -
> --X11INC = /usr/X11R6/include
> --X11LIB = /usr/X11R6/lib
> -+X11INC = ${X11BASE}/include
> -+X11LIB = ${X11BASE}/lib
> +$OpenBSD$
> +
> +Index: config.mk
> +--- config.mk.orig
> ++++ config.mk
> +@@ -12,12 +12,13 @@ X11LIB = /usr/X11R6/lib
>
> # includes and libs
> --INCS = -I. -I/usr/include -I${X11INC}
> + INCS = -I. -I/usr/include -I${X11INC}
> -LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
> -+INCS = -I${X11INC}
> -+LIBS = -L${X11LIB} -lX11 -lXext -lXrandr
> ++LIBS = -L/usr/lib -L${X11LIB} -lX11 -lXext -lXrandr
>
> # flags
> --CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_SHADOW_H
> +-CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
> -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
> -LDFLAGS = -s ${LIBS}
> -+CPPFLAGS += -DVERSION=\"${VERSION}\" -DHAVE_BSD_AUTH -D_BSD_SOURCE
> -+CFLAGS += -std=c99 -pedantic -Wall ${INCS} ${CPPFLAGS}
> -+LDFLAGS += ${LIBS}
> ++COPTFLAGS = -Os
> ++CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_BSD_AUTH
> -D_BSD_SOURCE
> ++CFLAGS = -std=c99 -pedantic -Wall ${INCS} ${CPPFLAGS} ${COPTFLAGS}
> ++LDFLAGS = ${LIBS}
> + COMPATSRC = explicit_bzero.c
>
> - # On *BSD remove -DHAVE_SHADOW_H from CPPFLAGS and add -DHAVE_BSD_AUTH
> # On OpenBSD and Darwin remove -lcrypt from LIBS
> -
> - # compiler and linker
> --CC = cc
> -+CC ?= cc
> -
> - # Install mode. On BSD systems MODE=2755 and GROUP=auth
> - # On others MODE=4755 and GROUP=root
> --#MODE=2755
> --#GROUP=auth
> -+MODE=2755
> -+GROUP=auth
> Index: patches/patch-slock_c
> ===================================================================
> RCS file: /cvs/ports/x11/slock/patches/patch-slock_c,v
> retrieving revision 1.3
> diff -u -p -r1.3 patch-slock_c
> --- patches/patch-slock_c 13 Aug 2016 14:00:00 -0000 1.3
> +++ patches/patch-slock_c 21 May 2020 10:58:17 -0000
> @@ -1,33 +1,119 @@
> -$OpenBSD: patch-slock_c,v 1.3 2016/08/13 14:00:00 tb Exp $
> ---- slock.c.orig Fri Feb 12 20:29:02 2016
> -+++ slock.c Sat Aug 13 15:37:49 2016
> -@@ -47,7 +47,7 @@ static Bool rr;
> - static int rrevbase;
> - static int rrerrbase;
> -
> --static void
> -+static void __attribute__((__noreturn__, __format__(printf, 1, 2)))
> - die(const char *errstr, ...)
> +$OpenBSD$
> +
> +Add back bsd-auth support, removed in 04143fd68dbc
> +
> +Index: slock.c
> +--- slock.c.orig
> ++++ slock.c
> +@@ -19,6 +19,11 @@
> + #include <X11/Xlib.h>
> + #include <X11/Xutil.h>
> +
> ++#if HAVE_BSD_AUTH
> ++#include <login_cap.h>
> ++#include <bsd_auth.h>
> ++#endif
> ++
> + #include "arg.h"
> + #include "util.h"
> +
> +@@ -83,6 +88,7 @@ dontkillme(void)
> + }
> + #endif
> +
> ++#ifndef HAVE_BSD_AUTH
> + static const char *
> + gethash(void)
> {
> - va_list ap;
> -@@ -172,10 +172,12 @@ readpw(Display *dpy, const char *pws)
> - break;
> - case XK_Escape:
> - len = 0;
> -+ explicit_bzero(passwd, sizeof(passwd));
> - break;
> - case XK_BackSpace:
> - if (len)
> - --len;
> -+ explicit_bzero(passwd + len, 1);
> - break;
> - default:
> - if (num && !iscntrl((int)buf[0]) && (len + num
> < sizeof(passwd))) {
> -@@ -185,6 +187,7 @@ readpw(Display *dpy, const char *pws)
> - break;
> - }
> - color = len ? INPUT : (failure || failonclear ? FAILED
> : INIT);
> -+ explicit_bzero(buf, sizeof(buf));
> - if (running && oldc != color) {
> - for (screen = 0; screen < nscreens; screen++) {
> - XSetWindowBackground(dpy,
> locks[screen]->win, locks[screen]->colors[color]);
> +@@ -123,13 +129,21 @@ gethash(void)
> +
> + return hash;
> + }
> ++#endif /* HAVE_BSD_AUTH */
> +
> + static void
> ++#ifdef HAVE_BSD_AUTH
> ++readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens)
> ++#else
> + readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
> + const char *hash)
> ++#endif
> + {
> + XRRScreenChangeNotifyEvent *rre;
> +- char buf[32], passwd[256], *inputhash;
> ++ char buf[32], passwd[256];
> ++#ifndef HAVE_BSD_AUTH
> ++ char *inputhash;
> ++#endif
> + int num, screen, running, failure, oldc;
> + unsigned int len, color;
> + KeySym ksym;
> +@@ -160,10 +174,14 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **
> + case XK_Return:
> + passwd[len] = '\0';
> + errno = 0;
> ++#ifdef HAVE_BSD_AUTH
> ++ running = !auth_userokay(getlogin(), NULL,
> "auth-slock", passwd);
> ++#else
> + if (!(inputhash = crypt(passwd, hash)))
> + fprintf(stderr, "slock: crypt: %s\n",
> strerror(errno));
> + else
> + running = !!strcmp(inputhash, hash);
> ++#endif
> + if (running) {
> + XBell(dpy, 100);
> + failure = 1;
> +@@ -303,7 +321,9 @@ main(int argc, char **argv) {
> + struct group *grp;
> + uid_t duid;
> + gid_t dgid;
> ++#ifndef HAVE_BSD_AUTH
> + const char *hash;
> ++#endif
> + Display *dpy;
> + int s, nlocks, nscreens;
> +
> +@@ -331,14 +351,23 @@ main(int argc, char **argv) {
> + dontkillme();
> + #endif
> +
> ++#ifndef HAVE_BSD_AUTH
> + hash = gethash();
> + errno = 0;
> + if (!crypt("", hash))
> + die("slock: crypt: %s\n", strerror(errno));
> ++#endif
> +
> + if (!(dpy = XOpenDisplay(NULL)))
> + die("slock: cannot open display\n");
> +
> ++/*
> ++ * don't drop groups for bsd-auth, slock runs as the user's normal
> ++ * uid, and requires gid auth from the setgid bit. (without bsd-auth
> ++ * slock needs to start with uid root or gid _shadow to read spwd.db,
> ++ * and is unable to use non-password methods)
> ++ */
> ++#ifndef HAVE_BSD_AUTH
> + /* drop privileges */
> + if (setgroups(0, NULL) < 0)
> + die("slock: setgroups: %s\n", strerror(errno));
> +@@ -346,6 +375,7 @@ main(int argc, char **argv) {
> + die("slock: setgid: %s\n", strerror(errno));
> + if (setuid(duid) < 0)
> + die("slock: setuid: %s\n", strerror(errno));
> ++#endif
> +
> + /* check for Xrandr support */
> + rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase);
> +@@ -381,7 +411,11 @@ main(int argc, char **argv) {
> + }
> +
> + /* everything is now blank. Wait for the correct password */
> ++#ifdef HAVE_BSD_AUTH
> ++ readpw(dpy, &rr, locks, nscreens);
> ++#else
> + readpw(dpy, &rr, locks, nscreens, hash);
> ++#endif
> +
> + return 0;
> + }
>