X-Git-Url: https://git.xinqibao.xyz/slock.git/blobdiff_plain/732d2b3bf5da3a1883b3246062aa556a59b8517c..f013cb264e654125c043ed637b7f47692376f967:/slock.c?ds=sidebyside diff --git a/slock.c b/slock.c index eece4e3..d150009 100644 --- a/slock.c +++ b/slock.c @@ -46,13 +46,13 @@ die(const char *errstr, ...) { #ifndef HAVE_BSD_AUTH static const char * -get_password(void) { /* only run as root */ +getpw(void) { /* only run as root */ const char *rval; struct passwd *pw; - if(geteuid() != 0) - die("cannot retrieve password entry (make sure to suid slock)"); pw = getpwuid(getuid()); + if(!pw) + die("cannot retrieve password entry (make sure to suid or sgid slock)"); endpwent(); rval = pw->pw_passwd; @@ -60,6 +60,8 @@ get_password(void) { /* only run as root */ { struct spwd *sp; sp = getspnam(getenv("USER")); + if(!sp) + die("slock: cannot retrieve shadow entry (make sure to suid or sgid slock)\n"); endspent(); rval = sp->sp_pwdp; } @@ -74,9 +76,9 @@ get_password(void) { /* only run as root */ static void #ifdef HAVE_BSD_AUTH -read_password(Display *dpy) +readpw(Display *dpy) #else -read_password(Display *dpy, const char *pws) +readpw(Display *dpy, const char *pws) #endif { char buf[32], passwd[256]; @@ -213,6 +215,11 @@ usage(void) { exit(EXIT_FAILURE); } +static int +xerrordummy(Display *dpy, XErrorEvent *ee) { + return 0; +} + int main(int argc, char **argv) { #ifndef HAVE_BSD_AUTH @@ -224,17 +231,21 @@ main(int argc, char **argv) { struct st_lock **locks; if((argc == 2) && !strcmp("-v", argv[1])) - die("slock-%s, © 2006-2008 Anselm R Garbe", VERSION); + die("slock-%s, © 2006-2012 Anselm R Garbe", VERSION); else if(argc != 1) usage(); + if(!getpwuid(getuid())) + die("no passwd entry for you"); + #ifndef HAVE_BSD_AUTH - pws = get_password(); + pws = getpw(); #endif if(!(dpy = XOpenDisplay(0))) die("cannot open display"); - + /* prevent default error handler to take over */ + XSetErrorHandler(xerrordummy); /* Get the number of screens in display "dpy" and blank them all. */ nscreens = ScreenCount(dpy); locks = malloc(sizeof(struct st_lock *) * nscreens); @@ -248,9 +259,9 @@ main(int argc, char **argv) { /* Everything is now blank. Now wait for the correct password. */ #ifdef HAVE_BSD_AUTH - read_password(dpy); + readpw(dpy); #else - read_password(dpy, pws); + readpw(dpy, pws); #endif /* Password ok, unlock everything and quit. */