X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Ftty-ask-password-agent.c;h=02b959ea591e1137d963ec1d4309e6e026d1f506;hp=a414cba3748c27c16cba6ad82a5fbc2f5a4f7bbb;hb=d98b9b63456dd2e99261ae1ddd4cb635c5e11b69;hpb=d55f4f3f92f56f76bdd06192d6a2ef3ee9fe4772 diff --git a/src/tty-ask-password-agent.c b/src/tty-ask-password-agent.c index a414cba37..02b959ea5 100644 --- a/src/tty-ask-password-agent.c +++ b/src/tty-ask-password-agent.c @@ -261,7 +261,6 @@ static int parse_password(const char *filename, char **wall) { FILE *f; int r; - usec_t n; assert(filename); @@ -279,14 +278,22 @@ static int parse_password(const char *filename, char **wall) { goto finish; } - if (!socket_name || not_after <= 0) { + if (!socket_name) { log_error("Invalid password file %s", filename); r = -EBADMSG; goto finish; } - n = now(CLOCK_MONOTONIC); - if (n > not_after) { + if (not_after > 0) { + if (now(CLOCK_MONOTONIC) > not_after) { + r = 0; + goto finish; + } + } + + if (pid > 0 && + kill(pid, 0) < 0 && + errno == ESRCH) { r = 0; goto finish; } @@ -369,15 +376,17 @@ static int parse_password(const char *filename, char **wall) { release_terminal(); } - packet_length = 1+strlen(password)+1; - if (!(packet = new(char, packet_length))) - r = -ENOMEM; - else { - packet[0] = '+'; - strcpy(packet+1, password); - } + if (r >= 0) { + packet_length = 1+strlen(password)+1; + if (!(packet = new(char, packet_length))) + r = -ENOMEM; + else { + packet[0] = '+'; + strcpy(packet+1, password); + } - free(password); + free(password); + } } if (r == -ETIME || r == -ENOENT) { @@ -426,7 +435,8 @@ static int wall_tty_block(void) { int fd, r; dev_t devnr; - if ((r = get_ctty_devnr(&devnr)) < 0) + r = get_ctty_devnr(0, &devnr); + if (r < 0) return -r; if (asprintf(&p, "/run/systemd/ask-password-block/%u:%u", major(devnr), minor(devnr)) < 0)