X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fask-password-api.c;h=3941605ceceda64730943f5dcee30f49af84ef32;hb=ffc442ae487303626321ac0e3a5023d4c4a0944f;hp=94a27f9010cca4924761187a92d43513e1deee8c;hpb=64845bdc829d6a6179d0762b7e97ef23828562a3;p=elogind.git diff --git a/src/shared/ask-password-api.c b/src/shared/ask-password-api.c index 94a27f901..3941605ce 100644 --- a/src/shared/ask-password-api.c +++ b/src/shared/ask-password-api.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -32,9 +32,12 @@ #include #include "util.h" +#include "formats-util.h" #include "mkdir.h" #include "strv.h" - +#include "random-util.h" +#include "terminal-util.h" +#include "signal-util.h" #include "ask-password-api.h" static void backspace_chars(int ttyfd, size_t p) { @@ -258,10 +261,8 @@ static int create_socket(char **name) { assert(name); fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); - if (fd < 0) { - log_error("socket() failed: %m"); - return -errno; - } + if (fd < 0) + return log_error_errno(errno, "socket() failed: %m"); snprintf(sa.un.sun_path, sizeof(sa.un.sun_path)-1, "/run/systemd/ask-password/sck.%" PRIx64, random_u64()); @@ -271,13 +272,13 @@ static int create_socket(char **name) { if (r < 0) { r = -errno; - log_error("bind(%s) failed: %m", sa.un.sun_path); + log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path); goto fail; } if (setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0) { r = -errno; - log_error("SO_PASSCRED failed: %m"); + log_error_errno(errno, "SO_PASSCRED failed: %m"); goto fail; } @@ -322,15 +323,15 @@ int ask_password_agent( assert(_passphrases); - assert_se(sigemptyset(&mask) == 0); - sigset_add_many(&mask, SIGINT, SIGTERM, -1); - assert_se(sigprocmask(SIG_BLOCK, &mask, &oldmask) == 0); + assert_se(sigemptyset(&mask) >= 0); + assert_se(sigset_add_many(&mask, SIGINT, SIGTERM, -1) >= 0); + assert_se(sigprocmask(SIG_BLOCK, &mask, &oldmask) >= 0); mkdir_p_label("/run/systemd/ask-password", 0755); fd = mkostemp_safe(temp, O_WRONLY|O_CLOEXEC); if (fd < 0) { - log_error("Failed to create password file: %m"); + log_error_errno(errno, "Failed to create password file: %m"); r = -errno; goto finish; } @@ -339,7 +340,7 @@ int ask_password_agent( f = fdopen(fd, "w"); if (!f) { - log_error("Failed to allocate FILE: %m"); + log_error_errno(errno, "Failed to allocate FILE: %m"); r = -errno; goto finish; } @@ -348,7 +349,7 @@ int ask_password_agent( signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC); if (signal_fd < 0) { - log_error("signalfd(): %m"); + log_error_errno(errno, "signalfd(): %m"); r = -errno; goto finish; } @@ -384,7 +385,7 @@ int ask_password_agent( fflush(f); if (ferror(f)) { - log_error("Failed to write query file: %m"); + log_error_errno(errno, "Failed to write query file: %m"); r = -errno; goto finish; } @@ -396,7 +397,7 @@ int ask_password_agent( final[sizeof(final)-9] = 'k'; if (rename(temp, final) < 0) { - log_error("Failed to rename query file: %m"); + log_error_errno(errno, "Failed to rename query file: %m"); r = -errno; goto finish; } @@ -433,7 +434,7 @@ int ask_password_agent( if (errno == EINTR) continue; - log_error("poll() failed: %m"); + log_error_errno(errno, "poll() failed: %m"); r = -errno; goto finish; } @@ -472,11 +473,13 @@ int ask_password_agent( errno == EINTR) continue; - log_error("recvmsg() failed: %m"); + log_error_errno(errno, "recvmsg() failed: %m"); r = -errno; goto finish; } + cmsg_close_all(&msghdr); + if (n <= 0) { log_error("Message too short"); continue;