Added a timeout on wrong password.

This commit is contained in:
ikolokolnikov committed 2026-10-01 11:47:44 -07:00
1 parent 78c1f81bd5
commit ddf98cf673
2 files changed
+63 -38

No files matched your search

+23 -2
View File
@@ -1,13 +1,34 @@
#ifndef HELPERS_SENTRY #ifndef HELPERS_SENTRY
#define HELPERS_SENTRY #define HELPERS_SENTRY
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define KB(n) (((unsigned long long)(n)) << 10) #define KB(n) (((unsigned long long)(n)) << 10)
#define MB(n) (((unsigned long long)(n)) << 20) #define MB(n) (((unsigned long long)(n)) << 20)
#define GB(n) (((unsigned long long)(n)) << 30) #define GB(n) (((unsigned long long)(n)) << 30)
#define TB(n) (((unsigned long long)(n)) << 40) #define TB(n) (((unsigned long long)(n)) << 40)
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define SWAP(T, a, b) do { T t__ = a; a = b; b = t__; } while(0) #define SWAP(T, a, b) do { T t__ = a; a = b; b = t__; } while(0)
#define PI 3.1415926535897f
#define EPSILON 4.94065645841247e-324
#define MAX_U64 (unsigned long long)0xffffffffffffffffull
#define MAX_U32 (unsigned int)0xffffffff
#define MAX_U16 (unsigned short)0xffff
#define MAX_U8 (unsigned char)0xff
#define MAX_S64 (long long)0x7fffffffffffffffll
#define MAX_S32 (int)0x7fffffff
#define MAX_S16 (short)0x7fff
#define MAX_S8 (signed char)0x7f
#define MIN_S64 (long long)0x8000000000000000ll
#define MIN_S32 (int)0x80000000
#define MIN_S16 (short)0x8000
#define MIN_S8 (signed char)0x80
#endif #endif
+40 -36
View File
@@ -745,7 +745,7 @@ run_loop(struct arena *arena,
struct timeval tv; struct timeval tv;
KeySym ksym; KeySym ksym;
XEvent ev; XEvent ev;
unsigned long long rendering_timeout_millis; unsigned long long rendering_timeout_millis, failure_timeout_millis;
struct dpms_state dpms_state; struct dpms_state dpms_state;
struct fonts fonts; struct fonts fonts;
int kbl_brightness; int kbl_brightness;
@@ -775,6 +775,7 @@ run_loop(struct arena *arena,
needs_rendering = 1; needs_rendering = 1;
rendering_timeout_millis = millis(); rendering_timeout_millis = millis();
failure_timeout_millis = 0;
while(running) { while(running) {
fd_set fds; fd_set fds;
@@ -851,44 +852,47 @@ run_loop(struct arena *arena,
#endif #endif
} }
switch (ksym) { if(millis() - failure_timeout_millis >= 2000) {
case XK_Return: switch (ksym) {
passwd[len] = '\0'; case XK_Return:
errno = 0; passwd[len] = '\0';
if (!(inputhash = crypt(passwd, hash))) errno = 0;
fprintf(stderr, "slock: crypt: %s\n", strerror(errno)); if (!(inputhash = crypt(passwd, hash)))
else fprintf(stderr, "slock: crypt: %s\n", strerror(errno));
running = !!strcmp(inputhash, hash); else
if (running) { running = !!strcmp(inputhash, hash);
XBell(dpy, 100); if (running) {
failure = 1; XBell(dpy, 100);
} else { failure = 1;
locked = 0; failure_timeout_millis = millis();
} } else {
explicit_bzero(&passwd, sizeof(passwd)); locked = 0;
len = 0; }
break;
case XK_Escape:
explicit_bzero(&passwd, sizeof(passwd));
len = 0;
failure = 0;
break;
case XK_BackSpace:
if (len)
passwd[--len] = '\0';
break;
default:
if (num && !iscntrl((unsigned char)buf[0]) &&
(len + num < sizeof(passwd))) {
memcpy(passwd + len, buf, num);
len += num;
} else if (buf[0] == '\025') { /* ctrl-u clears input */
explicit_bzero(&passwd, sizeof(passwd)); explicit_bzero(&passwd, sizeof(passwd));
len = 0; len = 0;
} else { break;
continue; /* Don't trigger fail screen when pressing control characters */ case XK_Escape:
explicit_bzero(&passwd, sizeof(passwd));
len = 0;
failure = 0;
break;
case XK_BackSpace:
if (len)
passwd[--len] = '\0';
break;
default:
if (num && !iscntrl((unsigned char)buf[0]) &&
(len + num < sizeof(passwd))) {
memcpy(passwd + len, buf, num);
len += num;
} else if (buf[0] == '\025') { /* ctrl-u clears input */
explicit_bzero(&passwd, sizeof(passwd));
len = 0;
} else {
continue; /* Don't trigger fail screen when pressing control characters */
}
break;
} }
break;
} }
} else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) { } else if (rr->active && ev.type == rr->evbase + RRScreenChangeNotify) {
rre = (XRRScreenChangeNotifyEvent*)&ev; rre = (XRRScreenChangeNotifyEvent*)&ev;