diff options
author | Mark H Weaver <mhw@netris.org> | 2016-02-12 18:19:05 -0500 |
---|---|---|
committer | Mark H Weaver <mhw@netris.org> | 2016-02-12 21:02:24 -0500 |
commit | 3a7261bf96b20a5252092e93b34231b836bc6714 (patch) | |
tree | f581c299f115d3d793958eeb233cf2867518d5da /gnu/packages/patches | |
parent | 511539ae81100146d03575f41abda7d72d3000e0 (diff) | |
download | guix-patches-3a7261bf96b20a5252092e93b34231b836bc6714.tar guix-patches-3a7261bf96b20a5252092e93b34231b836bc6714.tar.gz |
gnu: gnupg: Add upstream fix for test failures on x86_64.
Fixes <https://debbugs.gnu.org/22558>.
* gnu/packages/patches/gnupg-simple-query-ignore-status-messages.patch: New
file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/gnupg.scm (gnupg)[source]: Add patch.
Diffstat (limited to 'gnu/packages/patches')
-rw-r--r-- | gnu/packages/patches/gnupg-simple-query-ignore-status-messages.patch | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/gnu/packages/patches/gnupg-simple-query-ignore-status-messages.patch b/gnu/packages/patches/gnupg-simple-query-ignore-status-messages.patch new file mode 100644 index 0000000000..153f71c38f --- /dev/null +++ b/gnu/packages/patches/gnupg-simple-query-ignore-status-messages.patch @@ -0,0 +1,142 @@ +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" <neal@g10code.com> +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 <neal@g10code.com> +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 + |