From 172a8df25fb374915f7e082a4418f5e2a4185747 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Thu, 2 Jun 2005 22:59:41 +0000 Subject: [PATCH] gpgme/ 2005-06-03 Marcus Brinkmann * wait-global.c (gpgme_wait): Break out of the fd processing loop after an error. Reported by Igor Belyi . tests/ 2005-06-03 Marcus Brinkmann * gpg/Makefile.am (TESTS): Add t-wait. * gpg/t-wait.c (main): New test. --- gpgme/ChangeLog | 6 ++++ gpgme/wait-global.c | 5 +++ tests/ChangeLog | 5 +++ tests/gpg/Makefile.am | 4 +-- tests/gpg/t-wait.c | 72 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/gpg/t-wait.c diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 82f5fd6..a28ece0 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,9 @@ +2005-06-03 Marcus Brinkmann + + * wait-global.c (gpgme_wait): Break out of the fd processing loop + after an error. + Reported by Igor Belyi . + 2005-06-02 Marcus Brinkmann * wait.h (_gpgme_run_io_cb): New prototype. diff --git a/gpgme/wait-global.c b/gpgme/wait-global.c index d9f8727..a6da116 100644 --- a/gpgme/wait-global.c +++ b/gpgme/wait-global.c @@ -322,6 +322,11 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang) _gpgme_io_close (ictx->fdt.fds[idx].fd); _gpgme_engine_io_event (ictx->engine, GPGME_EVENT_DONE, &err); + + /* Break out of the loop, and retry the select() + from scratch, because now all fds should be + gone. */ + break; } } } diff --git a/tests/ChangeLog b/tests/ChangeLog index d7bc242..690e458 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2005-06-03 Marcus Brinkmann + + * gpg/Makefile.am (TESTS): Add t-wait. + * gpg/t-wait.c (main): New test. + 2004-12-07 Marcus Brinkmann * gpg/mkdemodirs: Add copyright notice. diff --git a/tests/gpg/Makefile.am b/tests/gpg/Makefile.am index ceda869..73009a9 100644 --- a/tests/gpg/Makefile.am +++ b/tests/gpg/Makefile.am @@ -1,5 +1,5 @@ # Copyright (C) 2000 Werner Koch (dd9jn) -# Copyright (C) 2001, 2004 g10 Code GmbH +# Copyright (C) 2001, 2004, 2005 g10 Code GmbH # # This file is part of GPGME. # @@ -28,7 +28,7 @@ noinst_HEADERS = t-support.h TESTS = t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \ t-decrypt t-verify t-decrypt-verify \ t-export t-import t-trustlist t-eventloop t-edit \ - t-keylist t-keylist-sig t-thread1 + t-keylist t-keylist-sig t-thread1 t-wait CLEANFILES = secring.gpg pubring.gpg trustdb.gpg DISTCLEANFILES = pubring.gpg~ random_seed diff --git a/tests/gpg/t-wait.c b/tests/gpg/t-wait.c new file mode 100644 index 0000000..c12835d --- /dev/null +++ b/tests/gpg/t-wait.c @@ -0,0 +1,72 @@ +/* t-wait.c - Regression test. + Copyright (C) 2000 Werner Koch (dd9jn) + Copyright (C) 2001, 2002, 2003, 2004, 2005 g10 Code GmbH + + This file is part of GPGME. + + GPGME is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of + the License, or (at your option) any later version. + + GPGME is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* We need to include config.h so that we know whether we are building + with large file system (LFS) support. */ +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include "t-support.h" + + +int +main (int argc, char *argv[]) +{ + gpgme_ctx_t ctx; + gpgme_error_t err; + gpgme_data_t sig, text; + + init_gpgme (GPGME_PROTOCOL_OpenPGP); + + err = gpgme_new (&ctx); + fail_if_err (err); + + /* Checking a message without a signature. */ + err = gpgme_data_new_from_mem (&sig, "foo\n", 4, 0); + fail_if_err (err); + err = gpgme_data_new (&text); + fail_if_err (err); + err = gpgme_op_verify_start (ctx, sig, NULL, text); + fail_if_err (err); + + while (gpgme_wait (ctx, &err, 0) == NULL && err == 0) + sleep(1); + + if (gpg_err_code (err) != GPG_ERR_NO_DATA) + { + fprintf (stderr, "%s:%d: %s: %s\n", + __FILE__, __LINE__, gpgme_strsource (err), + gpgme_strerror (err)); + exit (1); + } + + gpgme_data_release (sig); + gpgme_data_release (text); + gpgme_release (ctx); + return 0; +} -- 2.26.2