Copied from upstream: http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=commitdiff;h=acac103ba5772ae738ce5409d17feab80596cde6 Fixes: https://debbugs.gnu.org/22558 Upstream bug: https://bugs.gnupg.org/gnupg/issue2229 From acac103ba5772ae738ce5409d17feab80596cde6 Mon Sep 17 00:00:00 2001 From: "Neal H. Walfield" Date: Fri, 12 Feb 2016 22:12:21 +0100 Subject: [PATCH] common: Change simple_query to ignore status messages. * common/simple-pwquery.c (simple_query): Ignore status messages. -- Signed-off-by: Neal H. Walfield GnuPG-bug-id: 2229 --- common/simple-pwquery.c | 95 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/common/simple-pwquery.c b/common/simple-pwquery.c index 90d04c0..b2d666c 100644 --- a/common/simple-pwquery.c +++ b/common/simple-pwquery.c @@ -618,6 +618,7 @@ simple_query (const char *query) int fd = -1; int nread; char response[500]; + int have = 0; int rc; rc = agent_open (&fd); @@ -628,40 +629,78 @@ simple_query (const char *query) if (rc) goto leave; - /* get response */ - nread = readline (fd, response, 499); - if (nread < 0) - { - rc = -nread; - goto leave; - } - if (nread < 3) + while (1) { - rc = SPWQ_PROTOCOL_ERROR; - goto leave; - } + if (! have || ! strchr (response, '\n')) + /* get response */ + { + nread = readline (fd, &response[have], + sizeof (response) - 1 /* NUL */ - have); + if (nread < 0) + { + rc = -nread; + goto leave; + } + have += nread; + if (have < 3) + { + rc = SPWQ_PROTOCOL_ERROR; + goto leave; + } + response[have] = 0; + } - if (response[0] == 'O' && response[1] == 'K') - /* OK, do nothing. */; - else if ((nread > 7 && !memcmp (response, "ERR 111", 7) - && (response[7] == ' ' || response[7] == '\n') ) - || ((nread > 4 && !memcmp (response, "ERR ", 4) - && (strtoul (response+4, NULL, 0) & 0xffff) == 99)) ) - { - /* 111 is the old Assuan code for canceled which might still - be in use by old installations. 99 is GPG_ERR_CANCELED as - used by modern gpg-agents; 0xffff is used to mask out the - error source. */ + if (response[0] == 'O' && response[1] == 'K') + /* OK, do nothing. */; + else if ((nread > 7 && !memcmp (response, "ERR 111", 7) + && (response[7] == ' ' || response[7] == '\n') ) + || ((nread > 4 && !memcmp (response, "ERR ", 4) + && (strtoul (response+4, NULL, 0) & 0xffff) == 99)) ) + { + /* 111 is the old Assuan code for canceled which might still + be in use by old installations. 99 is GPG_ERR_CANCELED as + used by modern gpg-agents; 0xffff is used to mask out the + error source. */ #ifdef SPWQ_USE_LOGGING - log_info (_("canceled by user\n") ); + log_info (_("canceled by user\n") ); #endif - } - else - { + } + else if (response[0] == 'S' && response[1] == ' ') + { + char *nextline; + int consumed; + + nextline = strchr (response, '\n'); + if (! nextline) + /* Point to the NUL. */ + nextline = &response[have]; + else + /* Move past the \n. */ + nextline ++; + + consumed = (size_t) nextline - (size_t) response; + + /* Skip any additional newlines. */ + while (consumed < have && response[consumed] == '\n') + consumed ++; + + have -= consumed; + + if (have) + memmove (response, &response[consumed], have + 1); + + continue; + } + else + { #ifdef SPWQ_USE_LOGGING - log_error (_("problem with the agent\n")); + log_error (_("problem with the agent (unexpected response \"%s\"\n"), + response); #endif - rc = SPWQ_ERR_RESPONSE; + rc = SPWQ_ERR_RESPONSE; + } + + break; } leave: -- 2.6.3 /linux-container.scm (run-container): Do not call MOUNT-FILE-SYSTEMS if MOUNTS list is empty. Mathieu Othacehe 2019-09-12linux-container: "run-container" scripts shows the container's PID....* gnu/build/linux-container.scm (call-with-container): Add #:process-spawned-hook and honor it. * gnu/system/linux-container.scm (container-script)[script]: Define 'explain' and pass it as #:process-spawned-hook'. Ludovic Courtès 2019-07-06linux-container: Mount a new /dev/pts instance in the container....Fixes <https://bugs.gnu.org/36463>. Reported by Steffen Rytter Postas <nc@scalehost.eu>. * gnu/build/linux-container.scm (mount-file-systems): When /dev/ptmx exists on the host, explicitly mount a new instance of devpts and make /dev/ptmx a symlink to /dev/pts/ptmx. Ludovic Courtès 2019-06-23linux-container: Remove dependency on (guix utils)....Fixes a bug whereby derivations importing (gnu build linux-container), such as the 'bitlbee' and 'tor' services, would depend on the user's (guix config) file, which was pulled as a dependency of (guix utils). As a result, those derivations would vary from user to user. * gnu/build/linux-container.scm (call-with-temporary-directory): New procedure. Ludovic Courtès 2019-04-02linux-container: Make the guest UID and GID a parameter....* gnu/build/linux-container.scm (initialize-user-namespace): Add #:guest-uid and #:guest-gid parameters and honor them. (run-container): Likewise. (call-with-container): Likewise. * tests/containers.scm ("call-with-container, user namespace, guest UID/GID"): New test. Ludovic Courtès 2018-01-15linux-container: Work around EBADF errors upon exit....Typically 'read-pid-file/container' would fail when starting services in containers such as BitlBee. * gnu/build/linux-container.scm (call-with-clean-exit): Use 'primitive-_exit' instead of 'primitive-exit'. (container-excursion*): Close OUT. Ludovic Courtès