From cvs at cvs.gnupg.org Tue Jan 3 01:21:27 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 03 Jan 2012 01:21:27 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-3-ga2d9e48 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via a2d9e48fcca6cfc2dfadef6dbd3579a30314676b (commit) from c6aaf024651c7d55ac9fb77a53c084efb3adc1a9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit a2d9e48fcca6cfc2dfadef6dbd3579a30314676b Author: Marcus Brinkmann Date: Mon Jan 2 22:15:00 2012 +0100 Only set gcrypt thread callback for older version of gcrypt. * agent/gpg-agent.c, dirmngr/dirmngr.c, g13/g13.c, scd/scdaemon.c (USE_GCRY_THREAD_CBS): New macro, defined if GCRY_THREAD_OPTION_VERSION is 0. (fixed_gcry_pth_init) [!USE_GCRY_THREAD_CBS]: Don't define. (main) [!USE_GCRY_THREAD_CBS]: Do not install thread callbacks. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 6dcde26..f98d821 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -289,11 +289,18 @@ static int check_for_running_agent (int silent, int mode); /* Pth wrapper function definitions. */ ASSUAN_SYSTEM_PTH_IMPL; +#if defined(GCRY_THREAD_OPTION_VERSION) && (GCRY_THREAD_OPTION_VERSION == 0) +#define USE_GCRY_THREAD_CBS 1 +#endif + +#ifdef USE_GCRY_THREAD_CBS GCRY_THREAD_OPTION_PTH_IMPL; + static int fixed_gcry_pth_init (void) { return pth_self ()? 0 : (pth_init () == FALSE) ? errno : 0; } +#endif #ifndef PTH_HAVE_PTH_THREAD_ID @@ -618,6 +625,7 @@ main (int argc, char **argv ) init_common_subsystems (&argc, &argv); +#ifdef USE_GCRY_THREAD_CBS /* Libgcrypt requires us to register the threading model first. Note that this will also do the pth_init. */ gcry_threads_pth.init = fixed_gcry_pth_init; @@ -627,6 +635,7 @@ main (int argc, char **argv ) log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", gpg_strerror (err)); } +#endif /* Check that the libraries are suitable. Do it here because diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index e1bae7e..7d478b3 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -280,11 +280,17 @@ static void handle_connections (assuan_fd_t listen_fd); /* Pth wrapper function definitions. */ ASSUAN_SYSTEM_PTH_IMPL; +#if GCRY_THREAD_OPTION_VERSION == 0 +#define FIX_GCRY_PTH_INIT 1 +#endif + +#ifdef FIX_GCRY_PTH_INIT GCRY_THREAD_OPTION_PTH_IMPL; static int fixed_gcry_pth_init (void) { return pth_self ()? 0 : (pth_init () == FALSE) ? errno : 0; } +#endif #ifndef PTH_HAVE_PTH_THREAD_ID static unsigned long pth_thread_id (void) @@ -618,6 +624,7 @@ main (int argc, char **argv) i18n_init (); init_common_subsystems (&argc, &argv); +#ifdef USE_GCRY_THREAD_CBS /* Libgcrypt requires us to register the threading model first. Note that this will also do the pth_init. */ gcry_threads_pth.init = fixed_gcry_pth_init; @@ -627,6 +634,7 @@ main (int argc, char **argv) log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", gpg_strerror (rc)); } +#endif gcry_control (GCRYCTL_DISABLE_SECMEM, 0); /* Check that the libraries are suitable. Do it here because diff --git a/g13/g13.c b/g13/g13.c index 8e5532c..e38f211 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -204,11 +204,18 @@ static void join_idle_task (void); /* Begin Pth wrapper functions. */ ASSUAN_SYSTEM_PTH_IMPL; +#if GCRY_THREAD_OPTION_VERSION == 0 +#define FIX_GCRY_PTH_INIT 1 +#endif + +#ifdef FIX_GCRY_PTH_INIT GCRY_THREAD_OPTION_PTH_IMPL; static int fixed_gcry_pth_init (void) { return pth_self ()? 0 : (pth_init () == FALSE) ? errno : 0; } +#endif + /* End Pth wrapper functions. */ @@ -361,6 +368,8 @@ main ( int argc, char **argv) i18n_init (); init_common_subsystems (&argc, &argv); + +#ifdef USE_GCRY_THREAD_CBS /* Libgcrypt requires us to register the threading model first. Note that this will also do the pth_init. */ gcry_threads_pth.init = fixed_gcry_pth_init; @@ -370,6 +379,7 @@ main ( int argc, char **argv) log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", gpg_strerror (err)); } +#endif /* Check that the Libgcrypt is suitable. */ if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) diff --git a/scd/scdaemon.c b/scd/scdaemon.c index c8905d4..128ecc3 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -208,12 +208,18 @@ static void handle_connections (int listen_fd); /* Pth wrapper function definitions. */ ASSUAN_SYSTEM_PTH_IMPL; +#if defined(GCRY_THREAD_OPTION_VERSION) && (GCRY_THREAD_OPTION_VERSION == 0) +#define USE_GCRY_THREAD_CBS 1 +#endif + +#ifdef USE_GCRY_THREAD_CBS GCRY_THREAD_OPTION_PTH_IMPL; + static int fixed_gcry_pth_init (void) { return pth_self ()? 0 : (pth_init () == FALSE) ? errno : 0; } - +#endif static char * @@ -413,6 +419,7 @@ main (int argc, char **argv ) /* Libgcrypt requires us to register the threading model first. Note that this will also do the pth_init. */ +#ifdef USE_GCRY_THREAD_CBS gcry_threads_pth.init = fixed_gcry_pth_init; err = gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); if (err) @@ -420,6 +427,7 @@ main (int argc, char **argv ) log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", gpg_strerror (err)); } +#endif /* Check that the libraries are suitable. Do it here because the option parsing may need services of the library */ ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 9 +++++++++ dirmngr/dirmngr.c | 8 ++++++++ g13/g13.c | 10 ++++++++++ scd/scdaemon.c | 10 +++++++++- 4 files changed, 36 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 12:10:18 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 03 Jan 2012 12:10:18 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-5-g682df45 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 682df45d15661ed3544e2ed34bcb636200cc40f9 (commit) via d01d9ff11f46cbd61b7b8c0e04431e4f0c4a8580 (commit) from a2d9e48fcca6cfc2dfadef6dbd3579a30314676b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 682df45d15661ed3544e2ed34bcb636200cc40f9 Author: Werner Koch Date: Tue Jan 3 11:14:14 2012 +0100 Terminate csh commands with a semicolon also for dirmngr. * dirmngr/dirmngr.c (main): Terminate csh style output with a semicolon. diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 7d478b3..a72acd0 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -1066,7 +1066,7 @@ main (int argc, char **argv) if (csh_style) { *strchr (infostr, '=') = ' '; - es_printf ( "setenv %s\n", infostr); + es_printf ( "setenv %s;\n", infostr); } else { commit d01d9ff11f46cbd61b7b8c0e04431e4f0c4a8580 Author: Werner Koch Date: Tue Jan 3 11:13:30 2012 +0100 Terminate csh commands with a semicolon. Fixes bug#1386. * agent/gpg-agent.c (main): Terminate csh style output with a semicolon. * scd/scdaemon.c: Ditto. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index f98d821..63f4ba2 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1197,11 +1197,11 @@ main (int argc, char **argv ) if (csh_style) { *strchr (infostr, '=') = ' '; - es_printf ("setenv %s\n", infostr); + es_printf ("setenv %s;\n", infostr); if (opt.ssh_support) { *strchr (infostr_ssh_sock, '=') = ' '; - es_printf ("setenv %s\n", infostr_ssh_sock); + es_printf ("setenv %s;\n", infostr_ssh_sock); } } else diff --git a/scd/scdaemon.c b/scd/scdaemon.c index 128ecc3..6f8d010 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -843,7 +843,7 @@ main (int argc, char **argv ) if (csh_style) { *strchr (infostr, '=') = ' '; - es_printf ( "setenv %s\n", infostr); + es_printf ( "setenv %s;\n", infostr); } else { ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 4 ++-- dirmngr/dirmngr.c | 2 +- scd/scdaemon.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 12:45:11 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 03 Jan 2012 12:45:11 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.18-7-g217d2ec Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 217d2ec8af3aedb49e87ccccf93775617f00e0ca (commit) from 3005b0a6f43e53bed2f9b6fba7ad1205bdb29bc5 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 217d2ec8af3aedb49e87ccccf93775617f00e0ca Author: Werner Koch Date: Tue Jan 3 11:50:13 2012 +0100 Terminate csh commands with a semicolon. Fixes bug#1386. * agent/gpg-agent.c (main): Terminate csh style output with a semicolon. * scd/scdaemon.c: Ditto. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index f12f73c..b00d899 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1175,13 +1175,13 @@ main (int argc, char **argv ) if (csh_style) { *strchr (infostr, '=') = ' '; - printf ("setenv %s\n", infostr); + printf ("setenv %s;\n", infostr); if (opt.ssh_support) { *strchr (infostr_ssh_sock, '=') = ' '; - printf ("setenv %s\n", infostr_ssh_sock); + printf ("setenv %s;\n", infostr_ssh_sock); *strchr (infostr_ssh_pid, '=') = ' '; - printf ("setenv %s\n", infostr_ssh_pid); + printf ("setenv %s;\n", infostr_ssh_pid); } } else diff --git a/scd/scdaemon.c b/scd/scdaemon.c index 95f6570..064d342 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -828,7 +828,7 @@ main (int argc, char **argv ) if (csh_style) { *strchr (infostr, '=') = ' '; - printf ( "setenv %s\n", infostr); + printf ( "setenv %s;\n", infostr); } else { ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 6 +++--- scd/scdaemon.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 17:46:17 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 03 Jan 2012 17:46:17 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-6-g61ccd8d Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 61ccd8d92d9d3b8ba0eca3c2969d7f6f37e16405 (commit) from 682df45d15661ed3544e2ed34bcb636200cc40f9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 61ccd8d92d9d3b8ba0eca3c2969d7f6f37e16405 Author: Marcus Brinkmann Date: Tue Jan 3 16:50:52 2012 +0100 Fix last change: Only set gcrypt thread callback for older versions. * dirmngr/dirmngr.c, g13/g13.c: Rename FIX_GCRY_PTH_INIT to USE_GCRY_THREAD_CBS. diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index a72acd0..2256c59 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -281,10 +281,10 @@ static void handle_connections (assuan_fd_t listen_fd); ASSUAN_SYSTEM_PTH_IMPL; #if GCRY_THREAD_OPTION_VERSION == 0 -#define FIX_GCRY_PTH_INIT 1 +#define USE_GCRY_THREAD_CBS 1 #endif -#ifdef FIX_GCRY_PTH_INIT +#ifdef USE_GCRY_THREAD_CBS GCRY_THREAD_OPTION_PTH_IMPL; static int fixed_gcry_pth_init (void) { diff --git a/g13/g13.c b/g13/g13.c index e38f211..bc05977 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -205,10 +205,10 @@ static void join_idle_task (void); ASSUAN_SYSTEM_PTH_IMPL; #if GCRY_THREAD_OPTION_VERSION == 0 -#define FIX_GCRY_PTH_INIT 1 +#define USE_GCRY_THREAD_CBS 1 #endif -#ifdef FIX_GCRY_PTH_INIT +#ifdef USE_GCRY_THREAD_CBS GCRY_THREAD_OPTION_PTH_IMPL; static int fixed_gcry_pth_init (void) { ----------------------------------------------------------------------- Summary of changes: dirmngr/dirmngr.c | 4 ++-- g13/g13.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 18:02:49 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 03 Jan 2012 18:02:49 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-7-g0dce267 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 0dce26778ef8abd4fc40de689d7ec9b720d26430 (commit) from 61ccd8d92d9d3b8ba0eca3c2969d7f6f37e16405 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0dce26778ef8abd4fc40de689d7ec9b720d26430 Author: Marcus Brinkmann Date: Tue Jan 3 17:08:01 2012 +0100 Fix compiler warnings. * common/dotlock.c (use_hardlinks_p, dotlock_take_unix): Check return value of link(). * g13/g13.c: Make sure err is initialized. * scd/scdaemon.c (main) [!USE_GCRY_THREAD_CBS]: Do not define ERR. diff --git a/common/dotlock.c b/common/dotlock.c index b4734b9..58a3d0f 100644 --- a/common/dotlock.c +++ b/common/dotlock.c @@ -583,16 +583,21 @@ use_hardlinks_p (const char *tname) strcpy (lname, tname); strcat (lname, "x"); - link (tname, lname); - - if (stat (tname, &sb)) - res = -1; /* Ooops. */ - else if (sb.st_nlink == nlink + 1) - res = 0; /* Yeah, hardlinks are supported. */ + res = link (tname, lname); + if (res < 0) + res = -1; else - res = 1; /* No hardlink support. */ + { + if (stat (tname, &sb)) + res = -1; /* Ooops. */ + else if (sb.st_nlink == nlink + 1) + res = 0; /* Yeah, hardlinks are supported. */ + else + res = 1; /* No hardlink support. */ + + unlink (lname); + } - unlink (lname); jnlib_free (lname); return res; } @@ -948,6 +953,7 @@ dotlock_destroy (dotlock_t h) static int dotlock_take_unix (dotlock_t h, long timeout) { + int res; int wtime = 0; int sumtime = 0; int pid; @@ -1004,7 +1010,13 @@ dotlock_take_unix (dotlock_t h, long timeout) { struct stat sb; - link (h->tname, h->lockname); + res = link (h->tname, h->lockname); + if (res < 0) + { + my_error_1 ("lock not made: Oops: link of tmp file failed: %s\n", + strerror (errno)); + return -1; + } if (stat (h->tname, &sb)) { diff --git a/g13/g13.c b/g13/g13.c index bc05977..0f73094 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -686,6 +686,7 @@ main ( int argc, char **argv) #endif /*0*/ /* Dispatch command. */ + err = 0; switch (cmd) { case aGPGConfList: diff --git a/scd/scdaemon.c b/scd/scdaemon.c index 6f8d010..e26beba 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -382,7 +382,9 @@ main (int argc, char **argv ) { ARGPARSE_ARGS pargs; int orig_argc; +#ifdef USE_GCRY_THREAD_CBS gpg_error_t err; +#endif char **orig_argv; FILE *configfp = NULL; char *configname = NULL; ----------------------------------------------------------------------- Summary of changes: common/dotlock.c | 30 +++++++++++++++++++++--------- g13/g13.c | 1 + scd/scdaemon.c | 2 ++ 3 files changed, 24 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 18:33:08 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 03 Jan 2012 18:33:08 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-9-ged432f0 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via ed432f030e604f7b2fd4a79c2110d92b9cde7501 (commit) via ff2095ad7b4be7eaf9468b6ef39fd979527ecc4f (commit) from 0dce26778ef8abd4fc40de689d7ec9b720d26430 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ed432f030e604f7b2fd4a79c2110d92b9cde7501 Author: Marcus Brinkmann Date: Tue Jan 3 17:38:24 2012 +0100 Silence gcc warning. * sm/call-dirmngr.c (get_cached_cert): Make sure buflen is initialized. diff --git a/sm/call-dirmngr.c b/sm/call-dirmngr.c index cdaa9dc..92f7a0e 100644 --- a/sm/call-dirmngr.c +++ b/sm/call-dirmngr.c @@ -816,7 +816,7 @@ get_cached_cert (assuan_context_t ctx, char hexfpr[2*20+1]; struct membuf mb; char *buf; - size_t buflen; + size_t buflen = 0; ksba_cert_t cert; *r_cert = NULL; commit ff2095ad7b4be7eaf9468b6ef39fd979527ecc4f Author: Marcus Brinkmann Date: Tue Jan 3 17:32:41 2012 +0100 Revert last change, add comment about link() return values. * common/dotlock.c (use_hardlinks_p, dotlock_take_unix): Do not check return value of link(). diff --git a/common/dotlock.c b/common/dotlock.c index 58a3d0f..5e17e64 100644 --- a/common/dotlock.c +++ b/common/dotlock.c @@ -583,21 +583,17 @@ use_hardlinks_p (const char *tname) strcpy (lname, tname); strcat (lname, "x"); - res = link (tname, lname); - if (res < 0) - res = -1; - else - { - if (stat (tname, &sb)) - res = -1; /* Ooops. */ - else if (sb.st_nlink == nlink + 1) - res = 0; /* Yeah, hardlinks are supported. */ - else - res = 1; /* No hardlink support. */ + /* We ignore the return value of link() because it is unreliable. */ + (void) link (tname, lname); - unlink (lname); - } + if (stat (tname, &sb)) + res = -1; /* Ooops. */ + else if (sb.st_nlink == nlink + 1) + res = 0; /* Yeah, hardlinks are supported. */ + else + res = 1; /* No hardlink support. */ + unlink (lname); jnlib_free (lname); return res; } @@ -953,7 +949,6 @@ dotlock_destroy (dotlock_t h) static int dotlock_take_unix (dotlock_t h, long timeout) { - int res; int wtime = 0; int sumtime = 0; int pid; @@ -1010,13 +1005,8 @@ dotlock_take_unix (dotlock_t h, long timeout) { struct stat sb; - res = link (h->tname, h->lockname); - if (res < 0) - { - my_error_1 ("lock not made: Oops: link of tmp file failed: %s\n", - strerror (errno)); - return -1; - } + /* We ignore the return value of link() because it is unreliable. */ + (void) link (h->tname, h->lockname); if (stat (h->tname, &sb)) { ----------------------------------------------------------------------- Summary of changes: common/dotlock.c | 32 +++++++++++--------------------- sm/call-dirmngr.c | 2 +- 2 files changed, 12 insertions(+), 22 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 22:59:17 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 03 Jan 2012 22:59:17 +0100 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-22-g38fcd59 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 38fcd59ce774eaa3d65f2f7534c989afd860eb56 (commit) from 14cf1f7e338fedb8edaff5631441746605152bd6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 38fcd59ce774eaa3d65f2f7534c989afd860eb56 Author: Marcus Brinkmann Date: Tue Jan 3 22:04:30 2012 +0100 Fix pthread locking and remove defunctional support for static lock init. * src/ath.c: Include assert.h. (ath_mutex_destroy, ath_mutex_lock, ath_mutex_unlock): Dereference LOCK. * src/g10lib.h (_gcry_secmem_module_init): New declaration. * src/global.c (global_init): Call _gcry_secmem_module_init. * src/secmem.c (_gcry_secmem_module_init): New function. diff --git a/src/ath.c b/src/ath.c index 4834a52..1363d9e 100644 --- a/src/ath.c +++ b/src/ath.c @@ -21,6 +21,7 @@ #include #endif +#include #include #include #include @@ -46,11 +47,7 @@ #endif /* For the dummy interface. The MUTEX_NOTINIT value is used to check - that a mutex has been initialized. Because its value is there is - no need to explicit initialized a mutex variable because it is - anyway static and we store a pointer to allocated memory there - after initialization. The same thing works with other thread - models. */ + that a mutex has been initialized. */ #define MUTEX_NOTINIT ((ath_mutex_t) 0) #define MUTEX_UNLOCKED ((ath_mutex_t) 1) #define MUTEX_LOCKED ((ath_mutex_t) 2) @@ -231,7 +228,7 @@ ath_mutex_destroy (ath_mutex_t *lock) #if USE_POSIX_THREADS_WEAK case ath_model_pthreads_weak: { - pthread_mutex_t *plck = (pthread_mutex_t*)lock; + pthread_mutex_t *plck = (pthread_mutex_t*) (*lock); err = pthread_mutex_destroy (plck); if (!err) @@ -263,7 +260,7 @@ ath_mutex_lock (ath_mutex_t *lock) { case ath_model_none: if (*lock == MUTEX_NOTINIT) - err = EINVAL; + err = EINVAL; else if (*lock == MUTEX_UNLOCKED) { *lock = MUTEX_LOCKED; @@ -275,7 +272,7 @@ ath_mutex_lock (ath_mutex_t *lock) #if USE_POSIX_THREADS_WEAK case ath_model_pthreads_weak: - err = pthread_mutex_lock ((pthread_mutex_t*)lock); + err = pthread_mutex_lock ((pthread_mutex_t*)(*lock)); break; #endif /*USE_POSIX_THREADS_WEAK*/ @@ -298,7 +295,7 @@ ath_mutex_unlock (ath_mutex_t *lock) { case ath_model_none: if (*lock == MUTEX_NOTINIT) - err = EINVAL; + err = EINVAL; else if (*lock == MUTEX_LOCKED) { *lock = MUTEX_UNLOCKED; @@ -310,7 +307,7 @@ ath_mutex_unlock (ath_mutex_t *lock) #if USE_POSIX_THREADS_WEAK case ath_model_pthreads_weak: - err = pthread_mutex_unlock ((pthread_mutex_t*)lock); + err = pthread_mutex_unlock ((pthread_mutex_t*)(*lock)); break; #endif /*USE_POSIX_THREADS_WEAK*/ diff --git a/src/g10lib.h b/src/g10lib.h index f468ac4..93652ed 100644 --- a/src/g10lib.h +++ b/src/g10lib.h @@ -302,6 +302,7 @@ gcry_err_code_t _gcry_module_list (gcry_module_t modules, gcry_err_code_t _gcry_cipher_init (void); gcry_err_code_t _gcry_md_init (void); gcry_err_code_t _gcry_pk_init (void); +gcry_err_code_t _gcry_secmem_module_init (); gcry_err_code_t _gcry_pk_module_lookup (int id, gcry_module_t *module); void _gcry_pk_module_release (gcry_module_t module); diff --git a/src/global.c b/src/global.c index 36d6646..bde8791 100644 --- a/src/global.c +++ b/src/global.c @@ -131,6 +131,9 @@ global_init (void) err = _gcry_primegen_init (); if (err) goto fail; + err = _gcry_secmem_module_init (); + if (err) + goto fail; return; diff --git a/src/secmem.c b/src/secmem.c index 2beb234..107c662 100644 --- a/src/secmem.c +++ b/src/secmem.c @@ -506,6 +506,19 @@ _gcry_secmem_init (size_t n) } +gcry_err_code_t +_gcry_secmem_module_init () +{ + int err; + + err = ath_mutex_init (&secmem_lock); + if (err) + log_fatal ("could not allocate secmem lock\n"); + + return 0; +} + + static void * _gcry_secmem_malloc_internal (size_t size) { ----------------------------------------------------------------------- Summary of changes: src/ath.c | 17 +++++++---------- src/g10lib.h | 1 + src/global.c | 3 +++ src/secmem.c | 13 +++++++++++++ 4 files changed, 24 insertions(+), 10 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 3 23:40:38 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 03 Jan 2012 23:40:38 +0100 Subject: [git] Assuan - branch, master, updated. libassuan-2.0.3-2-ge23e6f2 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "IPC library used by GnuPG". The branch, master has been updated via e23e6f2bd49f415f4fdca013e4f61e1b17995a51 (commit) from 6ff1083166366b9d627e5e909f245cfb119b27a7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e23e6f2bd49f415f4fdca013e4f61e1b17995a51 Author: Marcus Brinkmann Date: Mon Sep 26 16:42:50 2011 +0200 Make assuan portable to NPTH. diff --git a/src/assuan.h.in b/src/assuan.h.in index 5c30a99..2e43c81 100644 --- a/src/assuan.h.in +++ b/src/assuan.h.in @@ -510,6 +510,37 @@ int __assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, soc extern struct assuan_system_hooks _assuan_system_pth; #define ASSUAN_SYSTEM_PTH &_assuan_system_pth +#define ASSUAN_SYSTEM_NPTH_IMPL \ + static void _assuan_npth_usleep (assuan_context_t ctx, unsigned int usec) \ + { (void) ctx; npth_usleep (usec); } \ + static ssize_t _assuan_npth_read (assuan_context_t ctx, assuan_fd_t fd, \ + void *buffer, size_t size) \ + { (void) ctx; return npth_read (fd, buffer, size); } \ + static ssize_t _assuan_npth_write (assuan_context_t ctx, assuan_fd_t fd, \ + const void *buffer, size_t size) \ + { (void) ctx; return npth_write (fd, buffer, size); } \ + static int _assuan_npth_recvmsg (assuan_context_t ctx, assuan_fd_t fd, \ + assuan_msghdr_t msg, int flags) \ + { (void) ctx; return npth_recvmsg (fd, msg, flags); } \ + static int _assuan_npth_sendmsg (assuan_context_t ctx, assuan_fd_t fd, \ + const assuan_msghdr_t msg, int flags) \ + { (void) ctx; return npth_sendmsg (fd, msg, flags); } \ + static pid_t _assuan_npth_waitpid (assuan_context_t ctx, pid_t pid, \ + int nowait, int *status, int options) \ + { (void) ctx; \ + if (!nowait) return npth_waitpid (pid, status, options); \ + else return 0; } \ + \ + struct assuan_system_hooks _assuan_system_npth = \ + { ASSUAN_SYSTEM_HOOKS_VERSION, _assuan_npth_usleep, __assuan_pipe, \ + __assuan_close, _assuan_npth_read, _assuan_npth_write, \ + _assuan_npth_recvmsg, _assuan_npth_sendmsg, \ + __assuan_spawn, _assuan_npth_waitpid, __assuan_socketpair, \ + __assuan_socket, __assuan_connect } + +extern struct assuan_system_hooks _assuan_system_npth; +#define ASSUAN_SYSTEM_NPTH &_assuan_system_npth + @include:w32ce-add@ #ifdef __cplusplus ----------------------------------------------------------------------- Summary of changes: src/assuan.h.in | 31 +++++++++++++++++++++++++++++++ 1 files changed, 31 insertions(+), 0 deletions(-) hooks/post-receive -- IPC library used by GnuPG http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 4 17:06:51 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Wed, 04 Jan 2012 17:06:51 +0100 Subject: [git] GnuPG - branch, npth, updated. gnupg-2.1.0beta3-46-g0868997 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, npth has been updated via 0868997e186cd847663668f9d7a29806a12da2d2 (commit) via ed432f030e604f7b2fd4a79c2110d92b9cde7501 (commit) via ff2095ad7b4be7eaf9468b6ef39fd979527ecc4f (commit) via 0dce26778ef8abd4fc40de689d7ec9b720d26430 (commit) via 61ccd8d92d9d3b8ba0eca3c2969d7f6f37e16405 (commit) via 682df45d15661ed3544e2ed34bcb636200cc40f9 (commit) via d01d9ff11f46cbd61b7b8c0e04431e4f0c4a8580 (commit) via a2d9e48fcca6cfc2dfadef6dbd3579a30314676b (commit) via c6aaf024651c7d55ac9fb77a53c084efb3adc1a9 (commit) via 97d1c884e62bba94e42bb5b2bb13cd3880334c31 (commit) via 604c130a85d4203b9d84137a42673aeaff1c0bd1 (commit) via 8e47f1e576f70d4dbe966523057fe3078006ae8b (commit) via 6f02c143440865781b4e3c1753e24e55a0de40e4 (commit) via fe2f1826991e8130f727ee15df1a4651f679752f (commit) via 779611494dbd187d09b05d2eb10faabd31a70156 (commit) via 366512abe44d9e71bb2c699c29477afa6ac71cdd (commit) via 07f20f313a0b13e5c93168a8a62ff1cbb94a4514 (commit) via f4b7f7146349c388a2f3ce224ff2006606c66232 (commit) via f6251c0d0af92331388f5e9bcd1750cbadcaca8f (commit) via a98260c39f1c0ccdad004784cbc9440376766082 (commit) via 27089564b6453deaf7b4ffe7cc5f5f290b6d892b (commit) via b22d62bd1481dfe13d60a6d16b09b9297944f063 (commit) via 7737a2c269657189a583cde7f214f20871d264f8 (commit) via 792e137ec7997a0ff5c54ff970611238d28d4ba8 (commit) via 0bac31ee9f74a25d76b08c3e0355a338908f083a (commit) via dcd64131c60efd0189aa05d5dbce6b93547b04e3 (commit) via 45cf9de341405a228e331bd3893cbcd6b72306be (commit) via 2d91febbd8d30beb7eb33f7aa80ffd5691d1d3cc (commit) via 07ea8c56b507b06d4bd70e94fa51914659afac4b (commit) via 00c760f628f4cf0fc11e79d305c172f98123f815 (commit) via 24e121ef261731069868ca403b818f1168237f53 (commit) via 11164662788036c4b15d30555ea33ec0b6f5a670 (commit) via cd29dc0f1cf7f3bd7938ffa65bf13f9a75d8c156 (commit) via ea0a21410b8fa460882c0f8de90b9291345fd4fc (commit) via 8a12a2000d82acfa881e8c18d028290100bf5e43 (commit) via 14e4fdc9f97d6f12bf563adfff1e3157305d7795 (commit) via cd3732841de32ce5c7841e6e158df3a5f1102f86 (commit) via 596b84a4de58def2155d3fe56462f6607f135b69 (commit) via 5cdad8ff000152b4bd01953646bb87fe8703c70d (commit) via 3f284e40502d8181b0b3ea66c77cd7c1252ea781 (commit) via 9274d4d18281b3364fa8abaa821dddf124b105d7 (commit) via 477360e8cdc458b0a36e9c7fb52a35f27766255d (commit) via 239659d3a0b8c0c378734ca3d1e9210a02e24da7 (commit) via 96dc146fa17a7853277dbf3dc771c585a815c247 (commit) via bf37c32367ba149559385ee90b6435cef8bd6412 (commit) via 29e96e6b9a8e68e6554dd48bc2ce68ae9525d29f (commit) via 2336b09779d313c1594acf6df3bd8a8486e90458 (commit) via 2c5d02191203d54f6bb681a18d12550de6319c55 (commit) via 31f548a18aed729c05ea367f2d8a8104480430d5 (commit) via 8cf2356fa8aa1dda644314e6e656b3df1586e297 (commit) via 6d5bb8e79dcee868e823de2c4e9d0ec9a9308dda (commit) via d24f41641f5a7c3a9be2a6e585a7e2e5031c01d7 (commit) via 9dc89de7a840c4a210e64b402094235a72e1c921 (commit) via 295b9e29c5f8fa49a767f9404aaca0afa1f31683 (commit) via f95cb909ba505f03ce81816c23dd58718b8cb6e6 (commit) via 982105f1ce85c92482def1d66f1f44e438ae5ab6 (commit) via 751d452116607eb5ddcbea970b6f24c7a427620e (commit) via 5a62b0d6ee7cecc2e41a429ccc586a1a129e1b04 (commit) via c741c6fc3aaa8b75a434faa143c06dd059970d41 (commit) via 57d4f7fae13810f4daed266139c33057de38d114 (commit) via 88fea6abe6b83eb2a69dd62dbbfe19ad5c450d86 (commit) via 77ee8fd55c9e599f41a3cad0ebaa23c72ca14409 (commit) via 781e9746dff21fc2721373205e63d1d09722d590 (commit) via 26b4a012e3eb3a6ce79a1e53f7cdfbbdf8c8e8f5 (commit) via 0689f0fc32cc9a8e431d33ee3431d23f3fd1f258 (commit) via 231d27e0fec905be52d679961332947c3331f15f (commit) via d2a979452e541183cae7e6e04634b5bbdab9c9d7 (commit) via 725d3589ada10266e4350f56a4f89e4d82b4dc16 (commit) via ea9df94ec8d6b7b13bd65ea14caca015bd534460 (commit) via 958f29d2251a96d09439e591ea3523133930e5e9 (commit) via 32118628a0f20f87791755a0a110491ad85e23ad (commit) from 90eb494876834548608d9b8d51222c940bd8daef (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0868997e186cd847663668f9d7a29806a12da2d2 Merge: 90eb494 ed432f0 Author: Marcus Brinkmann Date: Tue Jan 3 18:13:19 2012 +0100 Merge branch 'master' into npth Conflicts: ChangeLog-2011 Makefile.am agent/ChangeLog-2011 agent/gpg-agent.c dirmngr/ChangeLog-2011 dirmngr/dirmngr.c doc/HACKING g13/g13.c po/de.po scd/ChangeLog-2011 scd/apdu.c scd/command.c scd/scdaemon.c scripts/gitlog-to-changelog tools/ChangeLog-2011 diff --cc g13/g13.c index b3603cc,0f73094..34b91c1 --- a/g13/g13.c +++ b/g13/g13.c @@@ -353,6 -368,19 +353,8 @@@ main ( int argc, char **argv i18n_init (); init_common_subsystems (&argc, &argv); - -#ifdef USE_GCRY_THREAD_CBS - /* Libgcrypt requires us to register the threading model first. - Note that this will also do the pth_init. */ - gcry_threads_pth.init = fixed_gcry_pth_init; - err = gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pth); - if (err) - { - log_fatal ("can't register GNU Pth with Libgcrypt: %s\n", - gpg_strerror (err)); - } -#endif ++ npth_init (); + /* Check that the Libgcrypt is suitable. */ if (!gcry_check_version (NEED_LIBGCRYPT_VERSION) ) log_fatal (_("%s is too old (need %s, have %s)\n"), "libgcrypt", diff --cc scd/apdu.c index e4ebc35,7bb122d..e914f7b --- a/scd/apdu.c +++ b/scd/apdu.c @@@ -2112,8 -2117,13 +2119,15 @@@ pcsc_keypad_verify (int slot, int class pin_verify, len, result, &resultlen); xfree (pin_verify); if (sw || resultlen < 2) + return sw? sw : SW_HOST_INCOMPLETE_CARD_RESPONSE; + sw = (result[resultlen-2] << 8) | result[resultlen-1]; + { + log_error ("control_pcsc failed: %d\n", sw); + return sw? sw: SW_HOST_INCOMPLETE_CARD_RESPONSE; + } + sw = (result[resultlen-2] << 8) | result[resultlen-1]; + if (DBG_CARD_IO) + log_debug (" response: sw=%04X datalen=%d\n", sw, (unsigned int)resultlen); return sw; } diff --cc scd/command.c index fe409d5,88f8ec2..5e7feb5 --- a/scd/command.c +++ b/scd/command.c @@@ -327,25 -358,21 +360,24 @@@ do_reset (ctrl_t ctrl, int send_reset /* Reset the card removed flag for the current reader. We need to take the lock here so that the ticker thread won't concurrently try to update the file. Calling update_reader_status_file is - required to get hold of the new status of the card in the slot + required to get hold of the new status of the card in the vreader table. */ - if (!pth_mutex_acquire (&status_file_update_lock, 0, NULL)) + err = npth_mutex_lock (&status_file_update_lock); + if (err) { - log_error ("failed to acquire status_fle_update lock: %s\n", - strerror (err)); - ctrl->reader_slot = -1; + log_error ("failed to acquire status_file_update lock\n"); + ctrl->server_local->vreader_idx = -1; return; } update_reader_status_file (0); /* Update slot status table. */ - update_card_removed (slot, 0); /* Clear card_removed flag. */ + update_card_removed (vrdr, 0); /* Clear card_removed flag. */ - if (!pth_mutex_release (&status_file_update_lock)) - log_error ("failed to release status_file_update lock\n"); + err = npth_mutex_unlock (&status_file_update_lock); + if (err) + log_error ("failed to release status_file_update lock: %s\n", + strerror (err)); /* Do this last, so that the update_card_removed above does its job. */ - ctrl->reader_slot = -1; + ctrl->server_local->vreader_idx = -1; } ----------------------------------------------------------------------- Summary of changes: ChangeLog-2011 | 15 - Makefile.am | 1 + NEWS | 19 ++- README.maint | 2 +- agent/ChangeLog-2011 | 11 - agent/agent.h | 83 ++++-- agent/call-pinentry.c | 3 +- agent/call-scd.c | 42 ++-- agent/command.c | 107 ++++++-- agent/gpg-agent.c | 26 ++- common/asshelp.c | 13 + common/asshelp.h | 1 + common/dotlock.c | 6 +- common/estream.c | 140 ++++++++++ common/estream.h | 4 +- configure.ac | 2 +- dirmngr/ChangeLog-2011 | 15 - dirmngr/dirmngr.c | 2 +- doc/DETAILS | 6 + doc/HACKING | 13 +- doc/com-certs.pem | 18 ++ doc/faq.org | 44 +++- doc/gpgsm.texi | 15 +- doc/scdaemon.texi | 58 +++-- g10/photoid.c | 5 +- g13/g13.c | 3 + keyserver/gpgkeys_hkp.c | 20 +- po/de.po | 32 ++- scd/ChangeLog-2011 | 4 - scd/Makefile.am | 1 + scd/apdu.c | 252 ++++++++++++----- scd/apdu.h | 4 +- scd/app-common.h | 3 +- scd/app.c | 104 ++++--- scd/atr.c | 252 +++++------------ scd/atr.h | 2 +- scd/command.c | 290 ++++++++++++-------- scd/scdaemon.c | 9 +- scd/scdaemon.h | 7 +- scripts/gitlog-to-changelog | 15 + sm/call-dirmngr.c | 2 +- sm/certchain.c | 61 ++++- sm/certlist.c | 17 +- sm/certreqgen.c | 242 ++++++++++++++++- sm/gpgsm.c | 2 + sm/gpgsm.h | 7 +- sm/keylist.c | 29 ++- sm/server.c | 2 +- sm/verify.c | 2 + tests/Makefile.am | 2 + .../68A638998DFABAC510EA645CE34F9686B2EDF7EA.key | 10 + tests/samplekeys/README | 7 +- tests/samplekeys/steed-self-signing-nonthority.pem | 54 ++++ tools/ChangeLog-2011 | 4 - tools/gpg-connect-agent.c | 156 ++++++----- 55 files changed, 1541 insertions(+), 705 deletions(-) create mode 100644 tests/samplekeys/68A638998DFABAC510EA645CE34F9686B2EDF7EA.key create mode 100644 tests/samplekeys/steed-self-signing-nonthority.pem hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 5 04:42:26 2012 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Thu, 05 Jan 2012 04:42:26 +0100 Subject: [git] GnuPG - branch, ccid_driver_improvement, updated. post-nuke-of-trailing-ws-146-g048ba1a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, ccid_driver_improvement has been updated via 048ba1aedc4dd20e646a3755e4d39dac0755b474 (commit) via ce4bdfd46b9942116d0d1a1247dd4b020e2737a8 (commit) from fb01522af758be19a16337cd7bf86cef21b7b155 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 048ba1aedc4dd20e646a3755e4d39dac0755b474 Author: NIIBE Yutaka Date: Thu Jan 5 11:43:37 2012 +0900 scd: Support VASCO DIGIPASS 920 in the ccid-driver. * scd/ccid-driver.c (VENDOR_VASCO, VASCO_920): New. (ccid_transceive_secure): Maximum is 15 for VASCO DIGIPASS 920. diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index 2885487..8e2af65 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -210,7 +210,8 @@ enum { VENDOR_OMNIKEY= 0x076b, VENDOR_GEMPC = 0x08e6, VENDOR_KAAN = 0x0d46, - VENDOR_FSIJ = 0x234B + VENDOR_FSIJ = 0x234b, + VENDOR_VASCO = 0x1a44 }; /* Some product ids. */ @@ -220,7 +221,7 @@ enum { #define SCM_SCR3320 0x5117 #define SCM_SPR532 0xe003 #define CHERRY_ST2000 0x003e - +#define VASCO_920 0x0920 /* A list and a table with special transport descriptions. */ enum { @@ -3131,6 +3132,9 @@ ccid_transceive_secure (ccid_driver_t handle, case VENDOR_KAAN: /* Tested with KAAN Advanced (1.02). */ case VENDOR_FSIJ: /* Tested with the gnuk code (2011-01-05). */ break; + case VENDOR_VASCO: /* Tested with DIGIPASS 920 */ + pinlen_max = 15; + break; case VENDOR_CHERRY: /* The CHERRY XX44 keyboard echos an asterisk for each entered character on the keyboard channel. We use a special variant commit ce4bdfd46b9942116d0d1a1247dd4b020e2737a8 Author: NIIBE Yutaka Date: Thu Jan 5 11:40:58 2012 +0900 Fix pinpad entry in ccid-driver. * scd/ccid-driver.c (ccid_transceive_secure): Let it have three messages, always. Fixe bMsgIndex1-3. diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index 2f8be56..2885487 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -3214,7 +3214,7 @@ ccid_transceive_secure (ccid_driver_t handle, if (apdu_buf[1] == 0x20) msg[msglen++] = 0xff; /* bNumberMessage: Default. */ else - msg[msglen++] = apdu_buf[2] == 0 ? 0x03 : 0x01; /* bNumberMessage. */ + msg[msglen++] = 0x03; /* bNumberMessage. */ msg[msglen++] = 0x09; /* wLangId-Low: English FIXME: use the first entry. */ msg[msglen++] = 0x04; /* wLangId-High. */ @@ -3223,12 +3223,9 @@ ccid_transceive_secure (ccid_driver_t handle, msg[msglen++] = 0; /* bMsgIndex. */ else { - msg[msglen++] = 1; /* bMsgIndex1. */ - if (apdu_buf[2] == 0) - { - msg[msglen++] = 2; /* bMsgIndex2. */ - msg[msglen++] = 3; /* bMsgIndex3. */ - } + msg[msglen++] = 0; /* bMsgIndex1. */ + msg[msglen++] = 1; /* bMsgIndex2. */ + msg[msglen++] = 2; /* bMsgIndex3. */ } /* bTeoProlog follows: */ ----------------------------------------------------------------------- Summary of changes: scd/ccid-driver.c | 19 ++++++++++--------- 1 files changed, 10 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 06:48:27 2012 From: cvs at cvs.gnupg.org (by NIIBE Yutaka) Date: Fri, 06 Jan 2012 06:48:27 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-10-g5988c8b Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 5988c8bfb7eafaca53c8abeb793f189acd3177c6 (commit) from ed432f030e604f7b2fd4a79c2110d92b9cde7501 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5988c8bfb7eafaca53c8abeb793f189acd3177c6 Author: NIIBE Yutaka Date: Fri Jan 6 13:50:21 2012 +0900 Merge ccid_driver_improvement branch. * scd/apdu.c (ccid_keypad_operation): Rename from ccid_keypad_verify. (open_ccid_reader): Use ccid_keypad_operation for verify and modify. * scd/ccid-driver.c (VENDOR_VASCO, VASCO_920): New. (ccid_transceive_apdu_level): Permit sending packet where apdulen <= 289. Support receiving packets in a chain. (ccid_transceive_secure): Maximum is 15 for VASCO DIGIPASS 920. Support keypad_modify method such as CHANGE_REFERENCE_DATA: 0x24. diff --git a/scd/apdu.c b/scd/apdu.c index 7bb122d..70c28cd 100644 --- a/scd/apdu.c +++ b/scd/apdu.c @@ -2357,8 +2357,8 @@ check_ccid_keypad (int slot, int command, int pin_mode, static int -ccid_keypad_verify (int slot, int class, int ins, int p0, int p1, - struct pininfo_s *pininfo) +ccid_keypad_operation (int slot, int class, int ins, int p0, int p1, + struct pininfo_s *pininfo) { unsigned char apdu[4]; int err, sw; @@ -2429,8 +2429,8 @@ open_ccid_reader (const char *portstr) reader_table[slot].check_keypad = check_ccid_keypad; reader_table[slot].dump_status_reader = dump_ccid_reader_status; reader_table[slot].set_progress_cb = set_progress_cb_ccid_reader; - reader_table[slot].keypad_verify = ccid_keypad_verify; - reader_table[slot].keypad_modify = NULL; + reader_table[slot].keypad_verify = ccid_keypad_operation; + reader_table[slot].keypad_modify = ccid_keypad_operation; /* Our CCID reader code does not support T=0 at all, thus reset the flag. */ reader_table[slot].is_t0 = 0; diff --git a/scd/ccid-driver.c b/scd/ccid-driver.c index 7338ccc..8e2af65 100644 --- a/scd/ccid-driver.c +++ b/scd/ccid-driver.c @@ -210,7 +210,8 @@ enum { VENDOR_OMNIKEY= 0x076b, VENDOR_GEMPC = 0x08e6, VENDOR_KAAN = 0x0d46, - VENDOR_FSIJ = 0x234B + VENDOR_FSIJ = 0x234b, + VENDOR_VASCO = 0x1a44 }; /* Some product ids. */ @@ -220,7 +221,7 @@ enum { #define SCM_SCR3320 0x5117 #define SCM_SPR532 0xe003 #define CHERRY_ST2000 0x003e - +#define VASCO_920 0x0920 /* A list and a table with special transport descriptions. */ enum { @@ -2590,8 +2591,8 @@ ccid_transceive_apdu_level (ccid_driver_t handle, /* The maximum length for a short APDU T=1 block is 261. For an extended APDU T=1 block the maximum length 65544; however - extended APDU exchange level is not yet supported. */ - if (apdulen > 261) + extended APDU exchange level is not fully supported yet. */ + if (apdulen > 289) return CCID_DRIVER_ERR_INV_VALUE; /* Invalid length. */ msg[0] = PC_to_RDR_XfrBlock; @@ -2614,8 +2615,51 @@ ccid_transceive_apdu_level (ccid_driver_t handle, if (rc) return rc; - apdu = msg + 10; - apdulen = msglen - 10; + if (msg[9] == 1) + { + size_t total_msglen = msglen; + + while (1) + { + unsigned char status; + + msg = recv_buffer + total_msglen; + + msg[0] = PC_to_RDR_XfrBlock; + msg[5] = 0; /* slot */ + msg[6] = seqno = handle->seqno++; + msg[7] = bwi; /* bBWI */ + msg[8] = 0x10; /* Request next data block */ + msg[9] = 0; + set_msg_len (msg, 0); + msglen = 10; + + rc = bulk_out (handle, msg, msglen, 0); + if (rc) + return rc; + + rc = bulk_in (handle, msg, sizeof recv_buffer - total_msglen, &msglen, + RDR_to_PC_DataBlock, seqno, 5000, 0); + if (rc) + return rc; + status = msg[9]; + memmove (msg, msg+10, msglen - 10); + total_msglen += msglen - 10; + if (total_msglen >= sizeof recv_buffer) + return CCID_DRIVER_ERR_OUT_OF_CORE; + + if (status == 0x02) + break; + } + + apdu = recv_buffer + 10; + apdulen = total_msglen - 10; + } + else + { + apdu = msg + 10; + apdulen = msglen - 10; + } if (resp) { @@ -3059,7 +3103,7 @@ ccid_transceive_secure (ccid_driver_t handle, if (apdu_buflen >= 4 && apdu_buf[1] == 0x20 && (handle->has_pinpad & 1)) ; else if (apdu_buflen >= 4 && apdu_buf[1] == 0x24 && (handle->has_pinpad & 2)) - return CCID_DRIVER_ERR_NOT_SUPPORTED; /* Not yet by our code. */ + ; else return CCID_DRIVER_ERR_NO_KEYPAD; @@ -3088,6 +3132,9 @@ ccid_transceive_secure (ccid_driver_t handle, case VENDOR_KAAN: /* Tested with KAAN Advanced (1.02). */ case VENDOR_FSIJ: /* Tested with the gnuk code (2011-01-05). */ break; + case VENDOR_VASCO: /* Tested with DIGIPASS 920 */ + pinlen_max = 15; + break; case VENDOR_CHERRY: /* The CHERRY XX44 keyboard echos an asterisk for each entered character on the keyboard channel. We use a special variant @@ -3122,7 +3169,8 @@ ccid_transceive_secure (ccid_driver_t handle, msg[7] = 0; /* bBWI */ msg[8] = 0; /* RFU */ msg[9] = 0; /* RFU */ - msg[10] = 0; /* Perform PIN verification. */ + msg[10] = apdu_buf[1] == 0x20 ? 0 : 1; + /* Perform PIN verification or PIN modification. */ msg[11] = 0; /* Timeout in seconds. */ msg[12] = 0x82; /* bmFormatString: Byte, pos=0, left, ASCII. */ if (handle->id_vendor == VENDOR_SCM) @@ -3141,28 +3189,58 @@ ccid_transceive_secure (ccid_driver_t handle, Units are bytes, position is 0. */ } - /* The following is a little endian word. */ - msg[15] = pinlen_max; /* wPINMaxExtraDigit-Maximum. */ - msg[16] = pinlen_min; /* wPINMaxExtraDigit-Minimum. */ + msglen = 15; + if (apdu_buf[1] == 0x24) + { + msg[msglen++] = 0; /* bInsertionOffsetOld */ + msg[msglen++] = 0; /* bInsertionOffsetNew */ + } - msg[17] = 0x02; /* bEntryValidationCondition: - Validation key pressed */ + /* The following is a little endian word. */ + msg[msglen++] = pinlen_max; /* wPINMaxExtraDigit-Maximum. */ + msg[msglen++] = pinlen_min; /* wPINMaxExtraDigit-Minimum. */ + + if (apdu_buf[1] == 0x24) + msg[msglen++] = apdu_buf[2] == 0 ? 0x03 : 0x01; + /* bConfirmPIN + * 0x00: new PIN once + * 0x01: new PIN twice (confirmation) + * 0x02: old PIN and new PIN once + * 0x03: old PIN and new PIN twice (confirmation) + */ + + msg[msglen] = 0x02; /* bEntryValidationCondition: + Validation key pressed */ if (pinlen_min && pinlen_max && pinlen_min == pinlen_max) - msg[17] |= 0x01; /* Max size reached. */ - msg[18] = 0xff; /* bNumberMessage: Default. */ - msg[19] = 0x09; /* wLangId-Low: English FIXME: use the first entry. */ - msg[20] = 0x04; /* wLangId-High. */ - msg[21] = 0; /* bMsgIndex. */ + msg[msglen] |= 0x01; /* Max size reached. */ + msglen++; + + if (apdu_buf[1] == 0x20) + msg[msglen++] = 0xff; /* bNumberMessage: Default. */ + else + msg[msglen++] = 0x03; /* bNumberMessage. */ + + msg[msglen++] = 0x09; /* wLangId-Low: English FIXME: use the first entry. */ + msg[msglen++] = 0x04; /* wLangId-High. */ + + if (apdu_buf[1] == 0x20) + msg[msglen++] = 0; /* bMsgIndex. */ + else + { + msg[msglen++] = 0; /* bMsgIndex1. */ + msg[msglen++] = 1; /* bMsgIndex2. */ + msg[msglen++] = 2; /* bMsgIndex3. */ + } + /* bTeoProlog follows: */ - msg[22] = handle->nonnull_nad? ((1 << 4) | 0): 0; - msg[23] = ((handle->t1_ns & 1) << 6); /* I-block */ - msg[24] = 0; /* The apdulen will be filled in by the reader. */ + msg[msglen++] = handle->nonnull_nad? ((1 << 4) | 0): 0; + msg[msglen++] = ((handle->t1_ns & 1) << 6); /* I-block */ + msg[msglen++] = 0; /* The apdulen will be filled in by the reader. */ /* APDU follows: */ - msg[25] = apdu_buf[0]; /* CLA */ - msg[26] = apdu_buf[1]; /* INS */ - msg[27] = apdu_buf[2]; /* P1 */ - msg[28] = apdu_buf[3]; /* P2 */ - msglen = 29; + msg[msglen++] = apdu_buf[0]; /* CLA */ + msg[msglen++] = apdu_buf[1]; /* INS */ + msg[msglen++] = apdu_buf[2]; /* P1 */ + msg[msglen++] = apdu_buf[3]; /* P2 */ if (cherry_mode) msg[msglen++] = 0; /* An EDC is not required. */ ----------------------------------------------------------------------- Summary of changes: scd/apdu.c | 8 ++-- scd/ccid-driver.c | 130 ++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 108 insertions(+), 30 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 14:31:59 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 06 Jan 2012 14:31:59 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-11-g372fb4f Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 372fb4fc0661014ccd9275c89e6da2208f87155f (commit) from 5988c8bfb7eafaca53c8abeb793f189acd3177c6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 372fb4fc0661014ccd9275c89e6da2208f87155f Author: Werner Koch Date: Fri Jan 6 13:33:10 2012 +0100 gpg: Allow use of a standard space separated fingerprint. * common/userids.c (classify_user_id): Check for space separated GPG fingerprint. diff --git a/NEWS b/NEWS index 65297dd..7d1ae47 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,9 @@ Noteworthy changes in version 2.1.0beta4 (unreleased) ----------------------------------------------------- + * GPG now accepts a space separated fingerprint as a user ID. This + allows to copy and paste the fingerprint from the key listing. + Noteworthy changes in version 2.1.0beta3 (2011-12-20) ----------------------------------------------------- diff --git a/common/userids.c b/common/userids.c index 8c89c32..2b13445 100644 --- a/common/userids.c +++ b/common/userids.c @@ -308,6 +308,46 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack) if (i == 20) mode = KEYDB_SEARCH_MODE_FPR20; } + if (!mode) + { + /* Still not found. Now check for a space separated + OpenPGP v4 fingerprint like: + 8061 5870 F5BA D690 3336 86D0 F2AD 85AC 1E42 B367 + */ + hexlength = strspn (s, " 0123456789abcdefABCDEF"); + if (s[hexlength] && s[hexlength] != ' ') + hexlength = 0; /* Followed by non-space. */ + while (hexlength && s[hexlength-1] == ' ') + hexlength--; /* Trim trailing spaces. */ + if (hexlength == 50 && (!s[hexlength] || s[hexlength] == ' ')) + { + int i, c; + + for (i=0; i < 20; i++) + { + if (i && !(i % 2)) + { + if (*s != ' ') + break; + s++; + if (i == 10) + { + if (*s != ' ') + break; + s++; + } + } + + c = hextobyte(s); + if (c == -1) + break; + desc->u.fpr[i] = c; + s += 2; + } + if (i == 20) + mode = KEYDB_SEARCH_MODE_FPR20; + } + } if (!mode) /* Default to substring search. */ { desc->exact = 0; diff --git a/doc/specify-user-id.texi b/doc/specify-user-id.texi index 7d23ed8..2eee024 100644 --- a/doc/specify-user-id.texi +++ b/doc/specify-user-id.texi @@ -6,7 +6,7 @@ are only valid for @command{gpg} others are only good for @itemize @bullet - at item By key Id. + at item By key Id. This format is deduced from the length of the string and its content or @code{0x} prefix. The key Id of an X.509 certificate are the low 64 bits of its SHA-1 fingerprint. The use of key Ids is just a shortcut, for @@ -59,16 +59,17 @@ avoids any ambiguities in case that there are duplicated key IDs. @end cartouche @noindent -(@command{gpgsm} also accepts colons between each pair of hexadecimal + at command{gpgsm} also accepts colons between each pair of hexadecimal digits because this is the de-facto standard on how to present X.509 -fingerprints.) +fingerprints. @command{gpg} also allows the use of the space +separated SHA-1 fingerprint as printed by the key listing commands. @item By exact match on OpenPGP user ID. This is denoted by a leading equal sign. It does not make sense for X.509 certificates. @cartouche - at example + at example =Heinrich Heine @end example @end cartouche ----------------------------------------------------------------------- Summary of changes: NEWS | 3 +++ common/userids.c | 40 ++++++++++++++++++++++++++++++++++++++++ doc/specify-user-id.texi | 9 +++++---- 3 files changed, 48 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 6 16:12:44 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 06 Jan 2012 16:12:44 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-12-g957fe72 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 957fe728466893bc63f5ccad197d3e245dca4bf3 (commit) from 372fb4fc0661014ccd9275c89e6da2208f87155f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 957fe728466893bc63f5ccad197d3e245dca4bf3 Author: Werner Koch Date: Fri Jan 6 15:17:49 2012 +0100 gpg: Make the double space in the middle of a fingerprint optional. This change might help to c+p a fingerprint from an HTML page without being enclosed in a "pre" tag. * common/userids.c (classify_user_id): Skip a second blank in the middle of a fingerprint. diff --git a/common/userids.c b/common/userids.c index 2b13445..88593bf 100644 --- a/common/userids.c +++ b/common/userids.c @@ -313,13 +313,16 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack) /* Still not found. Now check for a space separated OpenPGP v4 fingerprint like: 8061 5870 F5BA D690 3336 86D0 F2AD 85AC 1E42 B367 + or + 8061 5870 F5BA D690 3336 86D0 F2AD 85AC 1E42 B367 */ hexlength = strspn (s, " 0123456789abcdefABCDEF"); if (s[hexlength] && s[hexlength] != ' ') hexlength = 0; /* Followed by non-space. */ while (hexlength && s[hexlength-1] == ' ') hexlength--; /* Trim trailing spaces. */ - if (hexlength == 50 && (!s[hexlength] || s[hexlength] == ' ')) + if ((hexlength == 49 || hexlength == 50) + && (!s[hexlength] || s[hexlength] == ' ')) { int i, c; @@ -330,12 +333,12 @@ classify_user_id (const char *name, KEYDB_SEARCH_DESC *desc, int openpgp_hack) if (*s != ' ') break; s++; - if (i == 10) - { - if (*s != ' ') - break; - s++; - } + /* Skip the double space in the middle but + don't require it to help copying + fingerprints from sources which fold + multiple space to one. */ + if (i == 10 && *s == ' ') + s++; } c = hextobyte(s); ----------------------------------------------------------------------- Summary of changes: common/userids.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 10 12:46:42 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 10 Jan 2012 12:46:42 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-28-gdccdcef Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via dccdcef319014d3a0ec43c77017cd65a09240f0c (commit) via 667ba59ec52d169902d7ef244cdcdde1bcc30681 (commit) via b5b6cb57db47dc892b74c9e24caae7099b274a9f (commit) from 6fe25e5602fabe92c68e5ba30e4777221e8612df (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit dccdcef319014d3a0ec43c77017cd65a09240f0c Author: Werner Koch Date: Tue Jan 10 11:51:19 2012 +0100 Update copyright years. * util/argparse.c (default_strusage): Update printed copyright year. diff --git a/Makefile.am b/Makefile.am index 144c16a..900cc9f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,5 @@ -# Copyright (C) 1998,1999,2000,2001,2003,2011 Free Software Foundation, Inc. +# Copyright (C) 1998,1999,2000,2001,2003,2010,2011, +# 2012 Free Software Foundation, Inc. # # This file is part of GnuPG. # diff --git a/README b/README index cc55549..7ea6b71 100644 --- a/README +++ b/README @@ -1,11 +1,11 @@ GnuPG - The GNU Privacy Guard ------------------------------- - Version 1.4.11 + Version 1.4.12 - Copyright 1998, 1999, 2000, 2001, 2002, 2003, + Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, - 2010 Free Software Foundation, Inc. + 2010, 2012 Free Software Foundation, Inc. This file is free software; as a special exception the author gives unlimited permission to copy and/or distribute it, with or @@ -142,7 +142,7 @@ http://www.gnupg.org/documentation/howtos.html A man page with a description of all commands and options gets installed - along with the program. + along with the program. Introduction @@ -467,13 +467,13 @@ detailed information about the errors. - Configure options + Configure options ----------------- - Here is a list of configure options which are sometime useful + Here is a list of configure options which are sometime useful for installation. - --enable-static-rnd= + --enable-static-rnd= Force the use of the random byte gathering module . Default is either to use /dev/random or the auto mode. Value for name: @@ -485,9 +485,9 @@ linux - Use the module which accesses /dev/random. This is the first choice and the default one for GNU/Linux or *BSD. - auto - Compile linux, egd and unix in and + auto - Compile linux, egd and unix in and automagically select at runtime. - + --with-egd-socket= This is only used when EGD is used as random gatherer. GnuPG uses by default "~/.gnupg/entropy" @@ -497,13 +497,13 @@ "~/" uses the socket in the home directory of the user and one starting with a "=" uses a socket in the GnuPG home directory which is "~/.gnupg" by default. - + --without-readline Do not include support for the readline library even if it is available. The default is to check whether the readline library is a available and use it to allow fancy command line editing. - + --with-included-zlib Forces usage of the local zlib sources. Default is to use the (shared) library of the system. @@ -530,15 +530,15 @@ (e.g. SunOS 5.7 on UltraSparc-2) and might give you a bus error. - --disable-dynload + --disable-dynload If you have problems with dynamic loading, this option disables all dynamic loading stuff. Note that the use of dynamic linking is very limited. --disable-asm - Do not use assembler modules. It is not possible + Do not use assembler modules. It is not possible to use this on some CPU types. - + --disable-exec Disable all remote program execution. This disables photo ID viewing as well as all keyserver @@ -595,14 +595,14 @@ --disable-cast5, --disable-blowfish, --disable-aes, --disable-twofish, --disable-sha256, --disable-sha512, - --without-bzip2, --disable-exec, + --without-bzip2, --disable-exec, --disable-card-support and --disable-agent-support. Configure command lines are read from left to right, so if you want to have an "almost minimal" configuration, you can do (for example) "--enable-minimal --enable-rsa" to have RSA added - to the minimal build. Adding the option + to the minimal build. Adding the option --disable-nls may be useful too. --enable-key-cache=SIZE @@ -623,7 +623,7 @@ --enable-selinux-support This prevents access to certain files and won't - allow import or export of secret keys. + allow import or export of secret keys. --enable-noexecstack Pass option --noexecstack to as. Autdetect wether @@ -719,7 +719,7 @@ Random devices are available in Linux, FreeBSD and OpenBSD. Operating systems without a random devices must use another - entropy collector. + entropy collector. This collector works by running a lot of commands that yield more or less unpredictable output and feds this as entropy into the diff --git a/configure.ac b/configure.ac index 5b64ba7..8570daa 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ # configure.ac script for GnuPG # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -# 2008, 2009 Free Software Foundation, Inc. +# 2008, 2009, 2010, 2012 Free Software Foundation, Inc. # # This file is part of GnuPG. # diff --git a/g10/gpg.c b/g10/gpg.c index 0190790..3106d29 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -1,6 +1,6 @@ /* gpg.c - The GnuPG utility (main for gpg) * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * diff --git a/scripts/git-log-footer b/scripts/git-log-footer index fed8f90..7975b9d 100644 --- a/scripts/git-log-footer +++ b/scripts/git-log-footer @@ -7,8 +7,8 @@ ----- Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008, 2009, 2010, - 2011 Free Software Foundation, Inc. + 2006, 2007, 2008, 2009, 2010, 2011, + 2012 Free Software Foundation, Inc. Copying and distribution of this file and/or the original GIT commit log messages, with or without modification, are diff --git a/util/argparse.c b/util/argparse.c index cc4b212..e28a181 100644 --- a/util/argparse.c +++ b/util/argparse.c @@ -1,6 +1,6 @@ /* [argparse.c wk 17.06.97] Argument Parser for option handling * Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, - * 2008 Free Software Foundation, Inc. + * 2008, 2010, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -917,10 +917,10 @@ default_strusage( int level ) break; case 11: p = "foo"; break; case 13: p = "0.0"; break; - case 14: p = "Copyright (C) 2010 Free Software Foundation, Inc."; break; + case 14: p = "Copyright (C) 2012 Free Software Foundation, Inc."; break; case 15: p = "This is free software: you are free to change and redistribute it.\n" -"There is NO WARRANTY, to the extent permitted by law.\n"; +"There is NO WARRANTY, to the extent permitted by law.\n"; break; case 16: p = "This is free software; you can redistribute it and/or modify\n" commit 667ba59ec52d169902d7ef244cdcdde1bcc30681 Author: Werner Koch Date: Tue Jan 10 11:31:00 2012 +0100 Use gcc pragmas to suppress some warnings. * configure.ac (AH_BOTTOM): Add GNUPG_GCC_VERSION macro. * util/estream-printf.c (pr_float): Use new gcc pragma to ignore a warning about a non-literal format. * util/miscutil.c (asctimestamp): Ditto. * cipher/md.c (md_stop_debug): Use new gcc pragme to ignore a warning * about a set but unused variable. diff --git a/cipher/md.c b/cipher/md.c index 9ee0fa7..ab36d17 100644 --- a/cipher/md.c +++ b/cipher/md.c @@ -65,7 +65,7 @@ new_list_item (int algo, r->name = (*get_info)( algo, &r->contextsize, &r->asnoid, &r->asnlen, &r->mdlen, &r->init, &r->write, &r->final, &r->read ); - if (!r->name ) + if (!r->name ) { xfree(r); r = NULL; @@ -82,7 +82,7 @@ new_list_item (int algo, /* Load all available hash algorithms and return true. Subsequent - calls will return 0. + calls will return 0. */ static int load_digest_module (void) @@ -96,26 +96,26 @@ load_digest_module (void) /* We load them in reverse order so that the most frequently used are the first in the list. */ #ifdef USE_SHA512 - if (!new_list_item (DIGEST_ALGO_SHA512, sha512_get_info)) + if (!new_list_item (DIGEST_ALGO_SHA512, sha512_get_info)) BUG (); - if (!new_list_item (DIGEST_ALGO_SHA384, sha384_get_info)) + if (!new_list_item (DIGEST_ALGO_SHA384, sha384_get_info)) BUG (); #endif #ifdef USE_SHA256 - if (!new_list_item (DIGEST_ALGO_SHA256, sha256_get_info)) + if (!new_list_item (DIGEST_ALGO_SHA256, sha256_get_info)) BUG (); - if (!new_list_item (DIGEST_ALGO_SHA224, sha224_get_info)) + if (!new_list_item (DIGEST_ALGO_SHA224, sha224_get_info)) BUG (); #endif - if (!new_list_item (DIGEST_ALGO_MD5, md5_get_info)) + if (!new_list_item (DIGEST_ALGO_MD5, md5_get_info)) BUG (); - if (!new_list_item (DIGEST_ALGO_RMD160, rmd160_get_info)) + if (!new_list_item (DIGEST_ALGO_RMD160, rmd160_get_info)) BUG (); - if (!new_list_item (DIGEST_ALGO_SHA1, sha1_get_info)) + if (!new_list_item (DIGEST_ALGO_SHA1, sha1_get_info)) BUG (); return 1; -} +} /**************** @@ -317,7 +317,7 @@ md_write( MD_HANDLE a, const byte *inbuf, size_t inlen) } for(r=a->list; r; r = r->next ) { (*r->write)( &r->context.c, a->buffer, a->bufcount ); - /* Fixme: all ->write fnc should take a const byte* */ + /* Fixme: all ->write fnc should take a const byte* */ (*r->write)( &r->context.c, (byte*)inbuf, inlen ); } a->bufcount = 0; @@ -508,6 +508,7 @@ md_start_debug( MD_HANDLE md, const char *suffix ) log_debug("md debug: can't open %s\n", buf ); } + void md_stop_debug( MD_HANDLE md ) { @@ -519,6 +520,9 @@ md_stop_debug( MD_HANDLE md ) } #ifdef HAVE_U64_TYPEDEF { /* a kludge to pull in the __muldi3 for Solaris */ +#if GNUPG_GCC_VERSION >= 40600 +# pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif volatile u32 a = (u32)(ulong)md; volatile u64 b = 42; volatile u64 c; diff --git a/configure.ac b/configure.ac index 1349c18..5b64ba7 100644 --- a/configure.ac +++ b/configure.ac @@ -446,6 +446,13 @@ is intended for making fat binary builds on OS X. */ # define EXEC_TEMPFILE_ONLY #endif +/* A macro to help checking the GCC version. */ +#ifdef __GNUC__ +# define GNUPG_GCC_VERSION (__GNUC__ * 10000 \ + + __GNUC_MINOR__ * 100 \ + + __GNUC_PATCHLEVEL__) +#endif /*__GNUC__*/ + /* Please note that the string version must not contain more than one character because the using code assumes strlen()==1 */ #ifdef HAVE_DOSISH_SYSTEM diff --git a/util/estream-printf.c b/util/estream-printf.c index 54ecb23..ca5556c 100644 --- a/util/estream-printf.c +++ b/util/estream-printf.c @@ -52,7 +52,7 @@ #if defined(HAVE_INTMAX_T) || defined(HAVE_UINTMAX_T) # ifdef HAVE_STDINT_H # include -# endif +# endif #endif #ifdef HAVE_LANGINFO_THOUSANDS_SEP #include @@ -67,12 +67,12 @@ /* Allow redefinition of asprintf used malloc functions. */ #if defined(_ESTREAM_PRINTF_MALLOC) -#define my_printf_malloc(a) _ESTREAM_PRINTF_MALLOC((a)) +#define my_printf_malloc(a) _ESTREAM_PRINTF_MALLOC((a)) #else #define my_printf_malloc(a) malloc((a)) #endif #if defined(_ESTREAM_PRINTF_FREE) -#define my_printf_free(a) _ESTREAM_PRINTF_FREE((a)) +#define my_printf_free(a) _ESTREAM_PRINTF_FREE((a)) #else #define my_printf_free(a) free((a)) #endif @@ -182,7 +182,7 @@ typedef enum /* A union used to store the actual values. */ -typedef union +typedef union { char a_char; signed char a_schar; @@ -266,7 +266,7 @@ dump_argspecs (argspec_t arg, size_t argcount) int idx; for (idx=0; argcount; argcount--, arg++, idx++) - fprintf (stderr, + fprintf (stderr, "%2d: len=%u flags=%u width=%d prec=%d mod=%d " "con=%d vt=%d pos=%d-%d-%d\n", idx, @@ -290,8 +290,8 @@ compute_type (argspec_t arg) { switch (arg->conspec) { - case CONSPEC_UNKNOWN: - arg->vt = VALTYPE_UNSUPPORTED; + case CONSPEC_UNKNOWN: + arg->vt = VALTYPE_UNSUPPORTED; break; case CONSPEC_DECIMAL: @@ -302,7 +302,7 @@ compute_type (argspec_t arg) case LENMOD_LONG: arg->vt = VALTYPE_LONG; break; case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG; break; case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX; break; - case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break; + case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break; case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break; default: arg->vt = VALTYPE_INT; break; } @@ -319,12 +319,12 @@ compute_type (argspec_t arg) case LENMOD_LONG: arg->vt = VALTYPE_ULONG; break; case LENMOD_LONGLONG: arg->vt = VALTYPE_ULONGLONG; break; case LENMOD_INTMAX: arg->vt = VALTYPE_UINTMAX; break; - case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break; + case LENMOD_SIZET: arg->vt = VALTYPE_SIZE; break; case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF; break; default: arg->vt = VALTYPE_UINT; break; } break; - + case CONSPEC_FLOAT: case CONSPEC_FLOAT_UP: case CONSPEC_EXP: @@ -340,9 +340,9 @@ compute_type (argspec_t arg) default: arg->vt = VALTYPE_DOUBLE; break; } break; - + case CONSPEC_CHAR: - arg->vt = VALTYPE_INT; + arg->vt = VALTYPE_INT; break; case CONSPEC_STRING: @@ -365,12 +365,12 @@ compute_type (argspec_t arg) case LENMOD_LONG: arg->vt = VALTYPE_LONG_PTR; break; case LENMOD_LONGLONG: arg->vt = VALTYPE_LONGLONG_PTR; break; case LENMOD_INTMAX: arg->vt = VALTYPE_INTMAX_PTR; break; - case LENMOD_SIZET: arg->vt = VALTYPE_SIZE_PTR; break; + case LENMOD_SIZET: arg->vt = VALTYPE_SIZE_PTR; break; case LENMOD_PTRDIFF: arg->vt = VALTYPE_PTRDIFF_PTR; break; default: arg->vt = VALTYPE_INT_PTR; break; } break; - + } } @@ -395,7 +395,7 @@ parse_format (const char *format, if (!format) goto leave_einval; - + for (; *format; format++) { unsigned int flags; @@ -403,7 +403,7 @@ parse_format (const char *format, lenmod_t lenmod; conspec_t conspec; int arg_pos, width_pos, precision_pos; - + if (*format != '%') continue; s = ++format; @@ -417,7 +417,7 @@ parse_format (const char *format, if (*s >= '1' && *s <= '9') { const char *save_s = s; - + arg_pos = (*s++ - '0'); for (; *s >= '0' && *s <= '9'; s++) arg_pos = 10*arg_pos + (*s - '0'); @@ -431,7 +431,7 @@ parse_format (const char *format, s = save_s; } } - + /* Parse the flags. */ flags = 0; for ( ; *s; s++) @@ -449,7 +449,7 @@ parse_format (const char *format, } } flags_parsed: - + /* Parse the field width. */ width_pos = 0; if (*s == '*') @@ -532,11 +532,11 @@ parse_format (const char *format, if (ignore_value) precision = NO_FIELD_VALUE; } - + /* Parse the length modifiers. */ switch (*s) { - case 'h': + case 'h': if (s[1] == 'h') { lenmod = LENMOD_CHAR; @@ -562,7 +562,7 @@ parse_format (const char *format, case 'L': lenmod = LENMOD_LONGDBL; s++; break; default: lenmod = LENMOD_NONE; break; } - + /* Parse the conversion specifier. */ switch (*s) { @@ -632,7 +632,7 @@ parse_format (const char *format, *argspecs_addr = argspecs; *r_argspecs_count = argcount; return 0; /* Success. */ - + leave_einval: errno = EINVAL; leave: @@ -663,14 +663,14 @@ read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs) value->a_char_ptr = va_arg (vaargs, char *); break; case VALTYPE_SCHAR: value->a_schar = va_arg (vaargs, int); break; - case VALTYPE_SCHAR_PTR: - value->a_schar_ptr = va_arg (vaargs, signed char *); + case VALTYPE_SCHAR_PTR: + value->a_schar_ptr = va_arg (vaargs, signed char *); break; case VALTYPE_UCHAR: value->a_uchar = va_arg (vaargs, int); break; case VALTYPE_SHORT: value->a_short = va_arg (vaargs, int); break; case VALTYPE_USHORT: value->a_ushort = va_arg (vaargs, int); break; - case VALTYPE_SHORT_PTR: - value->a_short_ptr = va_arg (vaargs, short *); + case VALTYPE_SHORT_PTR: + value->a_short_ptr = va_arg (vaargs, short *); break; case VALTYPE_INT: value->a_int = va_arg (vaargs, int); @@ -684,20 +684,20 @@ read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs) case VALTYPE_LONG: value->a_long = va_arg (vaargs, long); break; - case VALTYPE_ULONG: + case VALTYPE_ULONG: value->a_ulong = va_arg (vaargs, unsigned long); break; - case VALTYPE_LONG_PTR: - value->a_long_ptr = va_arg (vaargs, long *); + case VALTYPE_LONG_PTR: + value->a_long_ptr = va_arg (vaargs, long *); break; #ifdef HAVE_LONG_LONG_INT case VALTYPE_LONGLONG: value->a_longlong = va_arg (vaargs, long long int); break; - case VALTYPE_ULONGLONG: - value->a_ulonglong = va_arg (vaargs, unsigned long long int); + case VALTYPE_ULONGLONG: + value->a_ulonglong = va_arg (vaargs, unsigned long long int); break; - case VALTYPE_LONGLONG_PTR: + case VALTYPE_LONGLONG_PTR: value->a_longlong_ptr = va_arg (vaargs, long long *); break; #endif @@ -712,31 +712,31 @@ read_values (valueitem_t valuetable, size_t valuetable_len, va_list vaargs) case VALTYPE_STRING: value->a_string = va_arg (vaargs, const char *); break; - case VALTYPE_POINTER: + case VALTYPE_POINTER: value->a_void_ptr = va_arg (vaargs, void *); break; #ifdef HAVE_INTMAX_T case VALTYPE_INTMAX: value->a_intmax = va_arg (vaargs, intmax_t); break; - case VALTYPE_INTMAX_PTR: - value->a_intmax_ptr = va_arg (vaargs, intmax_t *); + case VALTYPE_INTMAX_PTR: + value->a_intmax_ptr = va_arg (vaargs, intmax_t *); break; #endif #ifdef HAVE_UINTMAX_T - case VALTYPE_UINTMAX: - value->a_uintmax = va_arg (vaargs, uintmax_t); + case VALTYPE_UINTMAX: + value->a_uintmax = va_arg (vaargs, uintmax_t); break; #endif case VALTYPE_SIZE: value->a_size = va_arg (vaargs, size_t); break; - case VALTYPE_SIZE_PTR: - value->a_size_ptr = va_arg (vaargs, size_t *); + case VALTYPE_SIZE_PTR: + value->a_size_ptr = va_arg (vaargs, size_t *); break; #ifdef HAVE_PTRDIFF_T case VALTYPE_PTRDIFF: - value->a_ptrdiff = va_arg (vaargs, ptrdiff_t); + value->a_ptrdiff = va_arg (vaargs, ptrdiff_t); break; case VALTYPE_PTRDIFF_PTR: value->a_ptrdiff_ptr = va_arg (vaargs, ptrdiff_t *); @@ -771,7 +771,7 @@ pad_out (estream_printf_out_t outfnc, void *outfncarg, *nbytes += n; count -= n; } - + return 0; } @@ -808,18 +808,18 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg, { case VALTYPE_SHORT: along = value.a_short; break; case VALTYPE_INT: along = value.a_int; break; - case VALTYPE_LONG: along = value.a_long; break; + case VALTYPE_LONG: along = value.a_long; break; #ifdef HAVE_LONG_LONG_INT - case VALTYPE_LONGLONG: along = value.a_longlong; break; - case VALTYPE_SIZE: along = value.a_size; break; + case VALTYPE_LONGLONG: along = value.a_longlong; break; + case VALTYPE_SIZE: along = value.a_size; break; # ifdef HAVE_INTMAX_T - case VALTYPE_INTMAX: along = value.a_intmax; break; + case VALTYPE_INTMAX: along = value.a_intmax; break; # endif # ifdef HAVE_PTRDIFF_T - case VALTYPE_PTRDIFF: along = value.a_ptrdiff; break; + case VALTYPE_PTRDIFF: along = value.a_ptrdiff; break; # endif #endif /*HAVE_LONG_LONG_INT*/ - default: + default: return -1; } if (along < 0) @@ -836,18 +836,18 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg, { case VALTYPE_USHORT: aulong = value.a_ushort; break; case VALTYPE_UINT: aulong = value.a_uint; break; - case VALTYPE_ULONG: aulong = value.a_ulong; break; + case VALTYPE_ULONG: aulong = value.a_ulong; break; #ifdef HAVE_LONG_LONG_INT - case VALTYPE_ULONGLONG: aulong = value.a_ulonglong; break; - case VALTYPE_SIZE: aulong = value.a_size; break; + case VALTYPE_ULONGLONG: aulong = value.a_ulonglong; break; + case VALTYPE_SIZE: aulong = value.a_size; break; # ifdef HAVE_UINTMAX_T - case VALTYPE_UINTMAX: aulong = value.a_uintmax; break; + case VALTYPE_UINTMAX: aulong = value.a_uintmax; break; # endif # ifdef HAVE_PTRDIFF_T - case VALTYPE_PTRDIFF: aulong = value.a_ptrdiff; break; + case VALTYPE_PTRDIFF: aulong = value.a_ptrdiff; break; # endif #endif /*HAVE_LONG_LONG_INT*/ - default: + default: return -1; } } @@ -878,7 +878,7 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg, do { - if ((arg->flags & FLAG_GROUPING) + if ((arg->flags & FLAG_GROUPING) && (++grouping == 3) && *grouping_string) { *--p = *grouping_string; @@ -913,7 +913,7 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg, if ((arg->flags & FLAG_ALT_CONV)) n_extra += 2; } - + n = pend - p; if ((arg->flags & FLAG_ZERO_PAD) @@ -958,7 +958,7 @@ pr_integer (estream_printf_out_t outfnc, void *outfncarg, if (rc) return rc; } - + rc = outfnc (outfncarg, p, pend - p); if (rc) return rc; @@ -1011,7 +1011,7 @@ pr_float (estream_printf_out_t outfnc, void *outfncarg, adblfloat = value.a_longdouble; use_dbl=1; break; #endif - default: + default: return -1; } @@ -1051,12 +1051,23 @@ pr_float (estream_printf_out_t outfnc, void *outfncarg, if ((arg->flags & FLAG_ALT_CONV)) *--p = '#'; *--p = '%'; + +#if GNUPG_GCC_VERSION >= 40600 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + #ifdef HAVE_LONG_DOUBLE if (use_dbl) sprintf (numbuf, p, adblfloat); else #endif /*HAVE_LONG_DOUBLE*/ sprintf (numbuf, p, afloat); + +#if GNUPG_GCC_VERSION >= 40600 +# pragma GCC diagnostic pop +#endif + p = numbuf; n = strlen (numbuf); pend = p + n; @@ -1122,7 +1133,7 @@ pr_char (estream_printf_out_t outfnc, void *outfncarg, if(rc) return rc; *nbytes += 1; - + return 0; } @@ -1143,7 +1154,7 @@ pr_string (estream_printf_out_t outfnc, void *outfncarg, string = "(null)"; if (arg->precision >= 0) { - for (n=0,s=string; *s && n < arg->precision; s++) + for (n=0,s=string; *s && n < arg->precision; s++) n++; } else @@ -1169,7 +1180,7 @@ pr_string (estream_printf_out_t outfnc, void *outfncarg, if (rc) return rc; } - + return 0; } @@ -1210,7 +1221,7 @@ pr_pointer (estream_printf_out_t outfnc, void *outfncarg, *--p = '0'; *--p = 'x'; *--p = '0'; - + rc = outfnc (outfncarg, p, pend - p); if (rc) return rc; @@ -1229,14 +1240,14 @@ pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg, switch (arg->vt) { - case VALTYPE_SCHAR_PTR: - *value.a_schar_ptr = (signed char)(unsigned int)(*nbytes); + case VALTYPE_SCHAR_PTR: + *value.a_schar_ptr = (signed char)(unsigned int)(*nbytes); break; - case VALTYPE_SHORT_PTR: + case VALTYPE_SHORT_PTR: *value.a_short_ptr = (short)(unsigned int)(*nbytes); break; - case VALTYPE_LONG_PTR: - *value.a_long_ptr = (long)(*nbytes); + case VALTYPE_LONG_PTR: + *value.a_long_ptr = (long)(*nbytes); break; #ifdef HAVE_LONG_LONG_INT case VALTYPE_LONGLONG_PTR: @@ -1244,12 +1255,12 @@ pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg, break; #endif #ifdef HAVE_INTMAX_T - case VALTYPE_INTMAX_PTR: + case VALTYPE_INTMAX_PTR: *value.a_intmax_ptr = (intmax_t)(*nbytes); break; #endif case VALTYPE_SIZE_PTR: - *value.a_size_ptr = (*nbytes); + *value.a_size_ptr = (*nbytes); break; #ifdef HAVE_PTRDIFF_T case VALTYPE_PTRDIFF_PTR: @@ -1274,8 +1285,8 @@ pr_bytes_so_far (estream_printf_out_t outfnc, void *outfncarg, holds the values and may be directly addressed using the position arguments given by ARGSPECS. MYERRNO is used for the "%m" conversion. NBYTES well be updated to reflect the number of bytes - send to the output function. */ -static int + send to the output function. */ +static int do_format (estream_printf_out_t outfnc, void *outfncarg, const char *format, argspec_t argspecs, size_t argspecs_len, valueitem_t valuetable, int myerrno, size_t *nbytes) @@ -1319,7 +1330,7 @@ do_format (estream_printf_out_t outfnc, void *outfncarg, /* Save the next start. */ s += arg->length; format = s; - + assert (argidx < argspecs_len); argidx++; @@ -1387,9 +1398,9 @@ do_format (estream_printf_out_t outfnc, void *outfncarg, } if (rc) return rc; - arg++; + arg++; } - + /* Print out any trailing stuff. */ n = s - format; rc = n? outfnc (outfncarg, format, n) : 0; @@ -1407,7 +1418,7 @@ do_format (estream_printf_out_t outfnc, void *outfncarg, output of the formatted stuff. FORMAT is the format specification and VAARGS a variable argumemt list matching the arguments of FORMAT. */ -int +int estream_format (estream_printf_out_t outfnc, void *outfncarg, const char *format, va_list vaargs) @@ -1442,7 +1453,7 @@ estream_format (estream_printf_out_t outfnc, /* Check that all ARG_POS fields are set. */ for (argidx=0,max_pos=0; argidx < argspecs_len; argidx++) { - if (argspecs[argidx].arg_pos != -1 + if (argspecs[argidx].arg_pos != -1 && argspecs[argidx].arg_pos > max_pos) max_pos = argspecs[argidx].arg_pos; if (argspecs[argidx].width_pos > max_pos) @@ -1523,13 +1534,13 @@ estream_format (estream_printf_out_t outfnc, valuetable[validx].vt = VALTYPE_INT; } } - + /* Read all the arguments. This will error out for unsupported types and for not given positional arguments. */ rc = read_values (valuetable, max_pos, vaargs); if (rc) - goto leave_einval; - + goto leave_einval; + /* for (validx=0; validx < max_pos; validx++) */ /* fprintf (stderr, "%2d: vt=%d\n", validx, valuetable[validx].vt); */ @@ -1538,7 +1549,7 @@ estream_format (estream_printf_out_t outfnc, argspecs, argspecs_len, valuetable, myerrno, &nbytes); goto leave; - + leave_einval: errno = EINVAL; leave_error: @@ -1572,11 +1583,11 @@ estream_printf (const char *format, ...) { int rc; va_list arg_ptr; - + va_start (arg_ptr, format); rc = estream_format (plain_stdio_out, stderr, format, arg_ptr); va_end (arg_ptr); - + return rc; } @@ -1586,16 +1597,16 @@ estream_fprintf (FILE *fp, const char *format, ...) { int rc; va_list arg_ptr; - + va_start (arg_ptr, format); rc = estream_format (plain_stdio_out, fp, format, arg_ptr); va_end (arg_ptr); - + return rc; } /* A replacement for vfprintf. */ -int +int estream_vfprintf (FILE *fp, const char *format, va_list arg_ptr) { return estream_format (plain_stdio_out, fp, format, arg_ptr); @@ -1642,7 +1653,7 @@ fixed_buffer_out (void *outfncarg, const char *buf, size_t buflen) /* A replacement for vsnprintf. */ -int +int estream_vsnprintf (char *buf, size_t bufsize, const char *format, va_list arg_ptr) { @@ -1667,7 +1678,7 @@ estream_vsnprintf (char *buf, size_t bufsize, } /* A replacement for snprintf. */ -int +int estream_snprintf (char *buf, size_t bufsize, const char *format, ...) { int rc; @@ -1676,7 +1687,7 @@ estream_snprintf (char *buf, size_t bufsize, const char *format, ...) va_start (arg_ptr, format); rc = estream_vsnprintf (buf, bufsize, format, arg_ptr); va_end (arg_ptr); - + return rc; } @@ -1686,7 +1697,7 @@ estream_snprintf (char *buf, size_t bufsize, const char *format, ...) dynamic_buffer_out. */ struct dynamic_buffer_parm_s { - int error_flag; /* Internal helper. */ + int error_flag; /* Internal helper. */ size_t alloced; /* Allocated size of the buffer. */ size_t used; /* Used size of the buffer. */ char *buffer; /* Malloced buffer. */ @@ -1709,7 +1720,7 @@ dynamic_buffer_out (void *outfncarg, const char *buf, size_t buflen) if (parm->used + buflen >= parm->alloced) { char *p; - + parm->alloced += buflen + 512; p = realloc (parm->buffer, parm->alloced); if (!p) @@ -1732,7 +1743,7 @@ dynamic_buffer_out (void *outfncarg, const char *buf, size_t buflen) /* A replacement for vasprintf. As with the BSD of vasprintf version -1 will be returned on error and NULL stored at BUFP. On success the number of bytes printed will be returned. */ -int +int estream_vasprintf (char **bufp, const char *format, va_list arg_ptr) { struct dynamic_buffer_parm_s parm; @@ -1747,7 +1758,7 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr) *bufp = NULL; return -1; } - + rc = estream_format (dynamic_buffer_out, &parm, format, arg_ptr); if (!rc) rc = dynamic_buffer_out (&parm, "", 1); /* Print terminating Nul. */ @@ -1772,7 +1783,7 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr) /* A replacement for asprintf. As with the BSD of asprintf version -1 will be returned on error and NULL stored at BUFP. On success the number of bytes printed will be returned. */ -int +int estream_asprintf (char **bufp, const char *format, ...) { int rc; @@ -1781,7 +1792,7 @@ estream_asprintf (char **bufp, const char *format, ...) va_start (arg_ptr, format); rc = estream_vasprintf (bufp, format, arg_ptr); va_end (arg_ptr); - + return rc; } diff --git a/util/miscutil.c b/util/miscutil.c index 16c2b2b..f82c4d9 100644 --- a/util/miscutil.c +++ b/util/miscutil.c @@ -33,7 +33,7 @@ #ifdef HAVE_UNSIGNED_TIME_T # define INVALID_TIME_CHECK(a) ((a) == (time_t)(-1)) -#else +#else /* Error or 32 bit time_t and value after 2038-01-19. */ # define INVALID_TIME_CHECK(a) ((a) < 0) #endif @@ -146,7 +146,7 @@ isotimestamp (u32 stamp) static char buffer[25+5]; struct tm *tp; time_t atime = stamp; - + if (INVALID_TIME_CHECK (atime)) { strcpy (buffer, "????" "-??" "-??" " " "??" ":" "??" ":" "??"); } @@ -232,17 +232,24 @@ asctimestamp( u32 stamp ) tp = localtime( &atime ); #ifdef HAVE_STRFTIME #if defined(HAVE_NL_LANGINFO) +# if GNUPG_GCC_VERSION >= 40600 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wformat-nonliteral" +# endif mem2str( fmt, nl_langinfo(D_T_FMT), DIM(fmt)-3 ); if( strstr( fmt, "%Z" ) == NULL ) strcat( fmt, " %Z"); strftime( buffer, DIM(buffer)-1, fmt, tp ); +# if GNUPG_GCC_VERSION >= 40600 +# pragma GCC diagnostic pop +# endif #else /* fixme: we should check whether the locale appends a " %Z" * These locales from glibc don't put the " %Z": * fi_FI hr_HR ja_JP lt_LT lv_LV POSIX ru_RU ru_SU sv_FI sv_SE zh_CN */ - strftime( buffer, DIM(buffer)-1, -#ifdef HAVE_W32_SYSTEM + strftime( buffer, DIM(buffer)-1, +#ifdef HAVE_W32_SYSTEM "%c" #else "%c %Z" @@ -264,7 +271,7 @@ void print_string2( FILE *fp, const byte *p, size_t n, int delim, int delim2 ) { for( ; n; n--, p++ ) - if (*p < 0x20 + if (*p < 0x20 || *p == 0x7f || *p == delim || *p == delim2 || ((delim || delim2) && *p=='\\')) @@ -456,7 +463,7 @@ answer_is_yes_no_quit( const char *s ) } /* - Return 1 for okay, 0 for for cancel or DEF_ANSWER for default. + Return 1 for okay, 0 for for cancel or DEF_ANSWER for default. */ int answer_is_okay_cancel (const char *s, int def_answer) @@ -467,7 +474,7 @@ answer_is_okay_cancel (const char *s, int def_answer) const char *long_cancel = _("cancel|cancel"); const char *short_okay = _("oO"); const char *short_cancel = _("cC"); - + /* Note: We have to use the locale dependent strcasecmp */ if ( match_multistr(long_okay,s) ) return 1; commit b5b6cb57db47dc892b74c9e24caae7099b274a9f Author: Werner Koch Date: Tue Jan 10 11:25:23 2012 +0100 Update gitlog-to-changelog. * scripts/gitlog-to-changelog: Update from gnupg master. * Makefile.am (gen-ChangeLog): Add new options. * scripts/autogen.sh: Fix typo in URL. Reported by Gilles Espinasse. diff --git a/Makefile.am b/Makefile.am index 09ed58a..144c16a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -75,10 +75,10 @@ gen-ChangeLog: if test -d $(top_srcdir)/.git; then \ (cd $(top_srcdir) && \ ./scripts/gitlog-to-changelog \ + --append-dot --tear-off \ --amend=scripts/git-log-fix \ --since=$(gen_start_date) ) > $(distdir)/cl-t; \ cat $(top_srcdir)/scripts/git-log-footer >> $(distdir)/cl-t; \ rm -f $(distdir)/ChangeLog; \ mv $(distdir)/cl-t $(distdir)/ChangeLog; \ fi - diff --git a/scripts/autogen.sh b/scripts/autogen.sh index c58afbf..408f760 100755 --- a/scripts/autogen.sh +++ b/scripts/autogen.sh @@ -268,7 +268,7 @@ if [ -d .git ]; then cat <&2 *** Activating trailing whitespace git pre-commit hook. *** For more information see this thread: - http://mail.gnome.org/archives/desktop-devel-list/2009-May/msg00084html + http://mail.gnome.org/archives/desktop-devel-list/2009-May/msg00084.html To deactivate this pre-commit hook again move .git/hooks/pre-commit and .git/hooks/pre-commit.sample out of the way. EOF diff --git a/scripts/gitlog-to-changelog b/scripts/gitlog-to-changelog index 40a8035..d9f594f 100755 --- a/scripts/gitlog-to-changelog +++ b/scripts/gitlog-to-changelog @@ -64,6 +64,7 @@ OPTIONS: makes a change to SHA1's commit log text or metadata. --append-dot append a dot to the first line of each commit message if there is no other punctuation or blank at the end. + --tear-off tear off all commit log lines after a '--' line. --since=DATE convert only the logs since DATE; the default is to convert all log entries. --format=FMT set format string for commit subject and body; @@ -175,6 +176,7 @@ sub parse_amend_file($) my $format_string = '%s%n%b%n'; my $amend_file; my $append_dot = 0; + my $tear_off = 0; GetOptions ( help => sub { usage 0 }, @@ -183,6 +185,7 @@ sub parse_amend_file($) 'format=s' => \$format_string, 'amend=s' => \$amend_file, 'append-dot' => \$append_dot, + 'tear-off' => \$tear_off, ) or usage 1; @@ -281,6 +284,18 @@ sub parse_amend_file($) @line = grep !/^Signed-off-by: .*>$/, @line; @line = grep !/^Co-authored-by: /, @line; + # Remove everything after a line with 2 dashes at the beginning. + if ($tear_off) + { + my @tmpline; + foreach (@line) + { + last if /^--\s*$/; + push @tmpline,$_; + } + @line = @tmpline; + } + # Remove leading and trailing blank lines. if (@line) { ----------------------------------------------------------------------- Summary of changes: Makefile.am | 5 +- README | 36 ++++---- cipher/md.c | 26 +++--- configure.ac | 9 ++- g10/gpg.c | 2 +- scripts/autogen.sh | 2 +- scripts/git-log-footer | 4 +- scripts/gitlog-to-changelog | 15 +++ util/argparse.c | 6 +- util/estream-printf.c | 199 +++++++++++++++++++++++-------------------- util/miscutil.c | 21 +++-- 11 files changed, 185 insertions(+), 140 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 10 17:25:11 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Tue, 10 Jan 2012 17:25:11 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-13-g3f59561 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 3f59561cee635c6801e0a59d3abff1c064fcbdbe (commit) from 957fe728466893bc63f5ccad197d3e245dca4bf3 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 3f59561cee635c6801e0a59d3abff1c064fcbdbe Author: David Shaw Date: Tue Jan 10 10:23:54 2012 -0500 Adapt HKP fix for fingerprint/long keyid retrievals for dirmngr * dirmngr/ks-engine-hkp.c (ks_hkp_get): Use the longest valid keyid form diff --git a/dirmngr/ks-engine-hkp.c b/dirmngr/ks-engine-hkp.c index 98187ab..aa4a818 100644 --- a/dirmngr/ks-engine-hkp.c +++ b/dirmngr/ks-engine-hkp.c @@ -1,5 +1,5 @@ /* ks-engine-hkp.c - HKP keyserver engine - * Copyright (C) 2011 Free Software Foundation, Inc. + * Copyright (C) 2011, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -761,7 +761,7 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp) { gpg_error_t err; KEYDB_SEARCH_DESC desc; - char kidbuf[8+1]; + char kidbuf[40+1]; char *hostport = NULL; char *request = NULL; estream_t fp = NULL; @@ -778,18 +778,20 @@ ks_hkp_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec, estream_t *r_fp) switch (desc.mode) { case KEYDB_SEARCH_MODE_SHORT_KID: - case KEYDB_SEARCH_MODE_LONG_KID: snprintf (kidbuf, sizeof kidbuf, "%08lX", (ulong)desc.u.kid[1]); break; + case KEYDB_SEARCH_MODE_LONG_KID: + snprintf (kidbuf, sizeof kidbuf, "%08lX%08lX", + (ulong)desc.u.kid[0], (ulong)desc.u.kid[1]); + break; case KEYDB_SEARCH_MODE_FPR20: case KEYDB_SEARCH_MODE_FPR: - /* This is a v4 fingerprint. Take the last 8 hex digits from - the fingerprint which is the expected short keyid. */ - bin2hex (desc.u.fpr+16, 4, kidbuf); + /* This is a v4 fingerprint. */ + bin2hex (desc.u.fpr, 20, kidbuf); break; case KEYDB_SEARCH_MODE_FPR16: - log_error ("HKP keyserver do not support v3 fingerprints\n"); + log_error ("HKP keyservers do not support v3 fingerprints\n"); default: return gpg_error (GPG_ERR_INV_USER_ID); } ----------------------------------------------------------------------- Summary of changes: dirmngr/ks-engine-hkp.c | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 10 17:28:14 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Tue, 10 Jan 2012 17:28:14 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-31-g174d2f8 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via 174d2f80bf40c9ae18fcd9fa834092ca2517e977 (commit) from 9b2a98ea148f768ef334f1baf640d8f7c6a813fb (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 174d2f80bf40c9ae18fcd9fa834092ca2517e977 Author: David Shaw Date: Tue Jan 10 10:32:03 2012 -0500 Refresh sample keys diff --git a/doc/samplekeys.asc b/doc/samplekeys.asc index 21c36d8..241b013 100644 --- a/doc/samplekeys.asc +++ b/doc/samplekeys.asc @@ -1,18 +1,16 @@ - pub 1024D/5B0358A2 1999-03-15 [expires: 2009-07-11] + pub 1024D/5B0358A2 1999-03-15 [expired: 2009-07-11] uid Werner Koch uid Werner Koch uid Werner Koch uid Werner Koch - sub 1024D/010A57ED 2004-03-21 [expires: 2007-12-31] - sub 2048R/C3680A6E 2006-01-01 [expires: 2007-12-31] pub 1024D/57548DCD 1998-07-07 [expired: 2005-12-31] uid Werner Koch (gnupg sig) pub 4096R/99242560 2002-01-28 uid David M. Shaw - sub 2048g/1643B926 2002-01-28 [expires: 2012-01-26] - sub 1024D/49E1CBC9 2002-01-28 [expires: 2012-01-26] + sub 2048R/A1BC4FA4 2012-01-10 [expires: 2017-01-31] + sub 2048R/6F410A43 2012-01-10 [expires: 2017-01-31] pub 2048R/CA57AD7C 2004-12-06 uid PGP Global Directory Verification Key @@ -26,436 +24,417 @@ uid Philip R. Zimmermann sub 3072g/A8E92834 2001-01-04 - pub 1024R/1CE0C630 2006-01-01 [expires: 2008-12-31] + pub 1024R/1CE0C630 2006-01-01 [expired: 2011-06-30] uid Werner Koch (dist sig) -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.4-svn4128 (GNU/Linux) +Version: GnuPG v1.4.11 (GNU/Linux) -mQGiBDWiHh4RBAD+l0rg5p9rW4M3sKvmeyzhs2mDxhRKDTVVUnTwpMIR2kIA9pT4 -3No/coPajDvhZTaDM/vSz25IZDZWJ7gEu86RpoEdtr/eK8GuDcgsWvFs5+YpCDwW -G2dx39ME7DN+SRvEE1xUm4E9G2Nnd2UNtLgg82wgi/ZK4Ih9CYDyo0a9awCgisn3 -RvZ/MREJmQq1+SjJgDx+c2sEAOEnxGYisqIKcOTdPOTTie7o7x+nem2uac7uOW68 -N+wRWxhGPIxsOdueMIa7U94Wg/Ydn4f2WngJpBvKNaHYmW8j1Q5zvZXXpIWRXSvy -TR641BceGHNdYiR/PiDBJsGQ3ac7n7pwhV4qex3IViRDJWz5Dzr88x+Oju63KtxY -urUIBACi7d1rUlHr4ok7iBRlWHYXU2hpUIQ8C+UOE1XXT+HB7mZLSRONQnWMyXnq -bAAW+EUUX2xpb54CevAg4eOilt0es8GZMmU6c0wdUsnMWWqOKHBFFlDIvyI27aZ9 -quf0yvby63kFCanQKc0QnqGXQKzuXbFqBYW2UQrYgjXji8rd8bQnV2VybmVyIEtv -Y2ggKGdudXBnIHNpZykgPGRkOWpuQGdudS5vcmc+iGEEExECACECF4AFCQ4Uh/0F -AkG8aF4GCwkIBwMCAxUCAwMWAgECHgEACgkQaLeriVdUjc0EkwCfTXfXdqDS2COs -ZRm0OUphuY0h4x4AnRSlWyPGnKUFxKOw8TwwCSLsdvZHmQGiBDbtSOkRBACURhKn -GIFyXIeX61GAY9hJA5FgG4UalV55ohdz4whBgDzDGLE3XYlO8HCn4ggKilll6MOw -Y0yZeg6PEU9Y3SqTzpQSV6qj2M7MgcS8xOpi6bNCu0iyZUik0KklUXMdI8e/CVmB -pQJT9CofbD1dsP6z4dC6z3jil0+5Wbfw6yIXzwCgy/7Fagq5mN0H760/JEiiXILS -1n0D/3H26lTaxo1vGput9Td1FQN7Vn6YDP0/To5ipsOODROV3zyUwF5QleY+8zTF -JA3qD5KxRfA726WELOF1mB6Mw44UdkPniOoGdMH5oSx6qnNnlVZBBu3U+e1qfQwL -QjHu0WX4Z2q00DKpWLThGv7Loh5NKi6OfTbMhfHoevCAzQnmA/wKc6J8GqthENTh -KXxZaei3Ep0t+PlBmbUzuAYCXZhI6/0KyD6emyQ7LYIaPv9qEfMkMLhxicG0v/AA -wOCBRKS3bkqc6wAYaO0bjUHJvem3HkWPux82t83+6YPyRnVjm/mwt0uEyKSvt7Md -2DVrO3lEcKRkRHiYuf0nonPhl5Rs5bQaV2VybmVyIEtvY2ggPHdrQGdudXBnLm9y -Zz6IawQTEQIAIwIXgAIZAQUJE2uL/wUCQllAcgULBwoDAgMVAgMDFgIBAh4BABIH -ZUdQRwABAQkQXeJJllsDWKI6xwCfV3paxYsk7KQmrtOUxNmZb004OQoAn3uq9imO -pgxqsXhXaLfz5IqZu5O7tBxXZXJuZXIgS29jaCA8d2tAZzEwY29kZS5jb20+iGME -ExECACMCGwMCHgECF4AFCRNri/8FAkJZQHoFCwcKAwIDFQIDAxYCAQAKCRBd4kmW -WwNYouXsAJ9nbkvbiJZvNlzwBL98x7YB+u9fsgCfXE6vHv6DJk7Eh9CY+Gcdn6kC -G8i0C1dlcm5lciBLb2NoiGMEExECABsFAjbtSOoFCQzJfIADCwoDAxUDAgMWAgEC -F4AAEgkQXeJJllsDWKIHZUdQRwABAbXWAJ9SCW0ieOpL7AY6vF+OIaMmw2ZW1gCg -kto0eWfgpjAuVg6jXqR1wHt2pQO0HVdlcm5lciBLb2NoIDx3ZXJuZXJAZnNmZS5v -cmc+iGMEExECACMCGwMFCRNri/8CHgECF4AFAkJZQHoFCwcKAwIDFQIDAxYCAQAK -CRBd4kmWWwNYovxpAJ0ftTtETxhK8aKfIok/+43wNbQASwCfSFCPuVKTNHpv4JJ7 -9feDCtfxxLG5AaIEQF3aTxEEAP9SgfIbIPL6BQ1nqoblsTYoiwWPL48uBZPjkDfy -8XsVR5V9aRQlggC4x4/MD3Ip5AUgReI7PcHnp4m3vcVLXPl+/7i7hAwd84iKzgN8 -I8VW0EevflcNm7nbWEnpjaGxJWFbhSLI1DmqnafoU8nZgGp2QoE+flgGDd559C3S -iHRTAKDbqgS3EDhTbwfS+bAhW5Xi8/2CPwP9HueeuW9M/cyt8UvliLsj2eYMEIy7 -CeSLO13XfnqCjcnHK+b59/ADd99dpMaq3gKj7Aj1RIsRV2qWDJpDNXVxP7Cy+Fzx -elQsytPQOV8H8AkB+RgmSyfxlNRUkC3sQU6jR9IwmPD4iB5fp/SqUpn++77TAArX -qsfHbmlnwcuU1EAD/i7CEhxLBYS1N77hwxL8DWCqjpi+1PKG+6dc0BQFIU3uUhbz -LGfqEobUDhveqgtlsvoEZ/lR8RgMv/uOjXEgiATQyTEa7s3M2vjXlpLjXjzklma3 -Lqmcam3dEf/5OR02yZif6hPU/x8f/VQle0kKNKdOCV1+dlo8aJH2UIZRRIvtiE8E -GBECAA8FAkBd2k8CGwIFCQcbVgAACgkQXeJJllsDWKIiqACff+MvmBLGSBA0NkdK -9ZB3fTSzCdcAoLrJ9QYe2+vFu2WYGZNC5xJy2db1iE8EGBECAA8FAkBd2lACGwIF -CQcbVgAACgkQXeJJllsDWKLDcQCfdFh2/dY6p8Sz6nS5tfx5akOqmPAAn3Y/PpYm -Z+bIfoFcHlzjPxmI93uSiJcEGBECAA8CGwIFCQcbVgAFAkR1rB0AUkcgBBkRAgAG -BQJEdawTAAoJEGB4TpQBClft2RMAn1XiL/bC9hByZInCJTaCd8WS8kYCAKCfpAWw -LIxkfwAeD/RI+2p00nQfvAkQXeJJllsDWKKx7QCguc4/HiEs64Ey5p6Yihy67X8E -0YsAnRXMFdXVP7ww8uldljPiD1TgyurpuQELBEBd2ykBCADRKFS0lZw/2MawS97P -3nVyt2FF9XWb8si7T9Jgl+NRF93uqUOIC15s3u5SVPcwdIhoG04wYKHTLKhyBAjF -p4azfLmiIBDDp37DY3SAtJT6TsgULR+yFkXbRvuIOU5N/0WxzrK6JJwlFVEyaPX7 -zmWVKMCj+SMj2FrmltuVS0aCf0io3n97bUAvuU3dgjTFoHqW4017smfbE4VMwnLY -i3/1SS9s0ysKM6Px5yEM3oQiOW/9pS48wSFfs3lXi8N1BikgPdU5FFA+5BGSUhxy -Ff+lqdjwcByBC7LT3dCrFeWQOL0UeVh6wG48O63j8jue7mfTm+559uXnD/J65PiH -cZTnAAYpiE8EGBECAA8FAkBd2ykCGwwFCQNY7wAACgkQXeJJllsDWKIS1gCgoJ2z -4OnA0dVt7ZM/PeAsKXA0KFUAn3AV3yuZKX4WHw5Pnf5sLmF5LUkluQELBEO4FiIB -CADRWoeCwf4lVIJQahM7ytFRvPMrkSZQy072/I6/4QPKsaHI+HnoB8PjTmBpyBDL -K8Y6Of3Y1hNb77xe+m2g+8Wq/BUKHvUi1F+xzszpnixtMr+QOiy6U7kCJA6fGvq0 -qmzrXGcv5rXpGvWwyZfymTLW4X2WKgNL8bhODy0uJ9ZR/fhjE7nnIHgIboSnBAUP -HCsI9BFumsbU8FKsKJCOBqziHEyDHbix7uP6ByYslH2tUw9WdQU8Yzo2mWojghXp -jE7UT0tAb4QNTdwurLgiEIH5umsM43elr1/2nd06KigQX+NR4MqytR+28JtEEKvU -LwJZpmExs4B+OB4x8l+6Lc0/AAYpiE8EGBECAA8FAkO4FiICGwwFCQPBFYAACgkQ -XeJJllsDWKJdywCeNyRtO1/yIyiNkotYRfO5y3xuHocAnAyA4jaxa702sRs4iPR/ -WWJkMgEqmQGiBDpU6CcRBADCT/tGpBu0EHpjd3G11QtkTWYnihZDBdenjYV2Evot -gRZAj5h4ewprq1u/zqzGBYpiYL/9j+5XDFcoWF24bzsUmHXsbDSiv+XEyQND1GUd -x4wVcEY5rNjkArX06XuZzObvXFXOvqRj6LskePtw3xLf5uj8jPN0Nf6YKnhfGIHR -WQCg/0UAr3hMK6zcA/egvWRGsm9dJecD/18XWekzt5JJeK3febJO/3Mwe43O6VNO -xmMpGWOYTrhivyOb/ZLgLedqX+MeXHGdGroARZ+kxYq/a9y5jNcivD+EyN+IiNDP -D64rl00FNZksx7dijD89PbIULDCtUpps2J0gk5inR+yzinf+jDyFnn5UEHI2rPFL -UbXWHJXJcp0UBACBkzDdesPjEVXZdTRTLk0sfiWEdcBM/5GpNswMlK4A7A6iqJoS -NJ4pO5Qq6PYOwDFqGir19WEfoTyHW0kxipnVbvq4q2vAhSIKOqNEJGxg4DTEKecf -3xCdJ0kW8dVSogHDH/c+Q4+RFQq/31aev3HDy20YayxAE94BWIsKkhaMyohhBB8R -AgAhBQI6VPBbAgcAFwyAET/HMgQdI+nqZt21AJydvCHfdNxhAAoJEMdGNjmy13le -V7gAoKHV2q0XEP8GJkyp0/V5lgbwBmBMAJ9TtVfw2khoaZ3LNV2tINSjj0Alp7Qi -UGhpbGlwIFIuIFppbW1lcm1hbm4gPHByekBtaXQuZWR1PohdBBARAgAVBQI6VOgn -BQsJCAcDAhkBBRsDAAAAABIJEMdGNjmy13leB2VHUEcAAQFWUQCfWWfTDHzSezrD -awgN2Z4Qb7dHKooAoJyVnm61utdRsdLr2e6QnV5Z0yjjtCJQaGlsaXAgUi4gWmlt -bWVybWFubiA8cHJ6QGFjbS5vcmc+iE4EEBECAAYFAjpU6LcAEgkQx0Y2ObLXeV4H -ZUdQRwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0 -RSQTkCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQAB -AAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0 -KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 -Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAAR -CACQAHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL -/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx -wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk -ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 -usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEB -AQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC -AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp -KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK -kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk -5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKI -fMwqleanyUi/Osi4udqNLM+EUZJNNIlvsakuqjnYazbzxKlopLOHYfwqa5S/8QvO -xjtyY1z17msqWZpGAzuz1wP61LmuhrGk3udHceO9RL4gSNB6EbjVU+Ndd3YEir9U -Fc+nLYC49jWhbt5UW0RIGbpyKzuzbliuhuWfjnUw377ypQv3vk2/rXVaV4o07VFC -iUQzd43P8j3rzVpnLESIgHoopZJIYIxPDg89Vb7tNSZLppnsIIYAggj1FKa4XQ/G -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 -Cw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 -Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA -AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh -MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6 -Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ -mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx -8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA -AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV -YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp -anN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE -xcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2 -aiiigAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p9 -68fvLyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjj -XnA8zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrE -TK51CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzD -t7HuDQm0KUUz3ZHWRQ6MGU9CDkGnV5VZ6xf6FJ5qTlY8/Mh5Vh9K77QNfi1uEkJs -kUZI7EeorRSuYyjY16KKKogKKKKACiiigArO17VU0XR575sFkXCKf4mPQVo1wHxX -vfJ0yztw+N8hdh3IHA/nSew4q7PNdT1Ga9vpLi4kaaaRyWY8KDRYWCXkuG5Qc+gz -We8mWAUYz19TW9pbGJAScZ6msJuyO2nG7NOPTrcxhAMdOmOKp3eg36OWsw0qY4x2 -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 -xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHB -FVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl -ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6 -wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEB -AQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID -EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkq -NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqS -k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl -5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqKrX99BptnJd3L7YoxkmuGvvi -zZRkrZWbykdGbgVpClOp8KJlOMdz0KivILj4p6xM2IYYoV/Op7PxX4mv18xJSVBz -leP61v8AVKiV5WRHtovY9YorzD/hMdat/vygsOoIqeD4l3URAubVJB3K8Gk8JVWy -uHtYnpFFc5oXjXTtcnFsivFORna3+NdEDmueUXF2kjRNPVC0UUVIwooooAKKKKAC -iiigDmPiG5XwjdYPXAP614dX0D4l0+HVNKNncFxHK3JQgEYBPGQfSuCfwBpCnia9 -/GVP/iK9DC4iFKDUjnq05Sd0eeL94V6X4N1HTRpqxzzLE6DnPfiq0HgXQHdkku75 -GHT51/8AiKst4H0aE4W/vRj/AGkP/slXWr0asbNsmFOcHcx9euLee/le1x5WTgjo -ea5+Z+TXayeFNMQbf7QvMdeqf/EUz/hCtLkUN9qvSD38xP8A4irhiqUUkmJ0pt3O -f8Iz+V4ihcsFA6knHpXr0ev6QkeJNUtAw6jzlyP1rzy48HaZaW7TxvcyOrKNsrKV -OWA6BR61u6TpkVqRIqlcrj5Rx+NcWJqRqT5om1OLirM6mPX9GmbbHqtmzennrn+d -X1ZXUMjBlPQg5BrnjAjqcbWHtzWFqGmySTma1le1dchXtXMZx9R1/Guexpc9Aorh -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 -K86tEx0ucCiY15h8 -=yJFz +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 +bGlwIFIuIFppbW1lcm1hbm4gPHByekBtaXQuZWR1PohdBBARAgAVBQI6VOgnBQsJ +CAcDAhkBBRsDAAAAABIJEMdGNjmy13leB2VHUEcAAQFWUQCfWWfTDHzSezrDawgN +2Z4Qb7dHKooAoJyVnm61utdRsdLr2e6QnV5Z0yjjtCJQaGlsaXAgUi4gWmltbWVy +bWFubiA8cHJ6QGFjbS5vcmc+iE4EEBECAAYFAjpU6LcAEgkQx0Y2ObLXeV4HZUdQ +RwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0RSQT +kCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQABAAD/ +2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEi +MEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7 +Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACQ +AHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QA +tRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS +0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn +aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD +xMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB +AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEE +BSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2 +Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOU +lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn +6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKIfMwq +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 +jyIAEgkQx0Y2ObLXeV4HZUdQRwABAQfRAKCSnx3toHhFsCAaIsCRkmFdI4Hn9gCb +BDKIqvBEjybcnaBW+iZufcjAzsfRzNf/AAANkgEQAAEBAAAAAAAAAAAAAAAA/9j/ +4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEY +Ix8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4N +DhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 +Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA +AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEG +E1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF +RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj +pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP0 +9fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgEC +BAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLR +ChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 +dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbH +yMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aiii +gAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p968fv +LyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjjXnA8 +zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrETK51 +CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzDt7Hu +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 +AxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIE +AwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK +FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 +eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT +1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAA +AAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdh +cRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH +SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOk +paanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 ++Pn6/9oADAMBAAIRAxEAPwD2aiq1/fQabZyXdy+2KMZJrhr74s2UZK2Vm8pHRm4F +aQpTqfCiZTjHc9CoryC4+KesTNiGGKFfzqez8V+Jr9fMSUlQc5Xj+tb/AFSoleVk +R7aL2PWKK8w/4THWrf78oLDqCKng+Jd1EQLm1SQdyvBpPCVVsrh7WJ6RRXOaF410 +7XJxbIrxTkZ2t/jXRA5rnlFxdpI0TT1QtFFFSMKKKKACiiigAooooA5j4huV8I3W +D1wD+teHV9A+JdPh1TSjZ3BcRytyUIBGATxkH0rgn8AaQp4mvfxlT/4ivQwuIhSg +1I56tOUndHni/eFel+DdR00aasc8yxOg5z34qtB4F0B3ZJLu+Rh0+df/AIirLeB9 +GhOFv70Y/wBpD/7JV1q9GrGzbJhTnB3MfXri3nv5XtceVk4I6Hmufmfk12snhTTE +G3+0LzHXqn/xFM/4QrS5FDfar0g9/MT/AOIq4YqlFJJidKbdzn/CM/leIoXLBQOp +Jx6V69Hr+kJHiTVLQMOo85cj9a88uPB2mWlu08b3MjqyjbKylTlgOgUetbuk6ZFa +kSKpXK4+UcfjXFiakak+aJtTi4qzOpj1/Rpm2x6rZs3p565/nV9WV1DIwZT0IOQa +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 +=hj82 -----END PGP PUBLIC KEY BLOCK----- ----------------------------------------------------------------------- Summary of changes: doc/samplekeys.asc | 843 +++++++++++++++++++++++++--------------------------- 1 files changed, 411 insertions(+), 432 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 11 08:02:00 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Wed, 11 Jan 2012 08:02:00 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.18-8-g27a1e8d Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 27a1e8d62014ba4550b9cfaff9e01267bce60ad5 (commit) from 217d2ec8af3aedb49e87ccccf93775617f00e0ca (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 27a1e8d62014ba4550b9cfaff9e01267bce60ad5 Author: David Shaw Date: Tue Jan 10 10:32:03 2012 -0500 Refresh sample keys diff --git a/doc/samplekeys.asc b/doc/samplekeys.asc index 21c36d8..241b013 100644 --- a/doc/samplekeys.asc +++ b/doc/samplekeys.asc @@ -1,18 +1,16 @@ - pub 1024D/5B0358A2 1999-03-15 [expires: 2009-07-11] + pub 1024D/5B0358A2 1999-03-15 [expired: 2009-07-11] uid Werner Koch uid Werner Koch uid Werner Koch uid Werner Koch - sub 1024D/010A57ED 2004-03-21 [expires: 2007-12-31] - sub 2048R/C3680A6E 2006-01-01 [expires: 2007-12-31] pub 1024D/57548DCD 1998-07-07 [expired: 2005-12-31] uid Werner Koch (gnupg sig) pub 4096R/99242560 2002-01-28 uid David M. Shaw - sub 2048g/1643B926 2002-01-28 [expires: 2012-01-26] - sub 1024D/49E1CBC9 2002-01-28 [expires: 2012-01-26] + sub 2048R/A1BC4FA4 2012-01-10 [expires: 2017-01-31] + sub 2048R/6F410A43 2012-01-10 [expires: 2017-01-31] pub 2048R/CA57AD7C 2004-12-06 uid PGP Global Directory Verification Key @@ -26,436 +24,417 @@ uid Philip R. Zimmermann sub 3072g/A8E92834 2001-01-04 - pub 1024R/1CE0C630 2006-01-01 [expires: 2008-12-31] + pub 1024R/1CE0C630 2006-01-01 [expired: 2011-06-30] uid Werner Koch (dist sig) -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.4-svn4128 (GNU/Linux) +Version: GnuPG v1.4.11 (GNU/Linux) -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 -ZUdQRwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0 -RSQTkCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQAB -AAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0 -KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 -Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAAR -CACQAHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL -/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx -wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk -ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 -usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEB -AQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC -AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp -KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK -kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk -5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKI -fMwqleanyUi/Osi4udqNLM+EUZJNNIlvsakuqjnYazbzxKlopLOHYfwqa5S/8QvO -xjtyY1z17msqWZpGAzuz1wP61LmuhrGk3udHceO9RL4gSNB6EbjVU+Ndd3YEir9U -Fc+nLYC49jWhbt5UW0RIGbpyKzuzbliuhuWfjnUw377ypQv3vk2/rXVaV4o07VFC -iUQzd43P8j3rzVpnLESIgHoopZJIYIxPDg89Vb7tNSZLppnsIIYAggj1FKa4XQ/G -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 -Cw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 -Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA -AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh -MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6 -Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ -mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx -8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA -AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV -YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp -anN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE -xcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2 -aiiigAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p9 -68fvLyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjj -XnA8zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrE -TK51CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzD -t7HuDQm0KUUz3ZHWRQ6MGU9CDkGnV5VZ6xf6FJ5qTlY8/Mh5Vh9K77QNfi1uEkJs -kUZI7EeorRSuYyjY16KKKogKKKKACiiigArO17VU0XR575sFkXCKf4mPQVo1wHxX -vfJ0yztw+N8hdh3IHA/nSew4q7PNdT1Ga9vpLi4kaaaRyWY8KDRYWCXkuG5Qc+gz -We8mWAUYz19TW9pbGJAScZ6msJuyO2nG7NOPTrcxhAMdOmOKp3eg36OWsw0qY4x2 -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 -xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHB -FVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl -ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6 -wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEB -AQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID -EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkq -NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqS -k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl -5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqKrX99BptnJd3L7YoxkmuGvvi -zZRkrZWbykdGbgVpClOp8KJlOMdz0KivILj4p6xM2IYYoV/Op7PxX4mv18xJSVBz -leP61v8AVKiV5WRHtovY9YorzD/hMdat/vygsOoIqeD4l3URAubVJB3K8Gk8JVWy -uHtYnpFFc5oXjXTtcnFsivFORna3+NdEDmueUXF2kjRNPVC0UUVIwooooAKKKKAC -iiigDmPiG5XwjdYPXAP614dX0D4l0+HVNKNncFxHK3JQgEYBPGQfSuCfwBpCnia9 -/GVP/iK9DC4iFKDUjnq05Sd0eeL94V6X4N1HTRpqxzzLE6DnPfiq0HgXQHdkku75 -GHT51/8AiKst4H0aE4W/vRj/AGkP/slXWr0asbNsmFOcHcx9euLee/le1x5WTgjo -ea5+Z+TXayeFNMQbf7QvMdeqf/EUz/hCtLkUN9qvSD38xP8A4irhiqUUkmJ0pt3O -f8Iz+V4ihcsFA6knHpXr0ev6QkeJNUtAw6jzlyP1rzy48HaZaW7TxvcyOrKNsrKV -OWA6BR61u6TpkVqRIqlcrj5Rx+NcWJqRqT5om1OLirM6mPX9GmbbHqtmzennrn+d -X1ZXUMjBlPQg5BrnjAjqcbWHtzWFqGmySTma1le1dchXtXMZx9R1/Guexpc9Aorh -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 -K86tEx0ucCiY15h8 -=yJFz +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 +bGlwIFIuIFppbW1lcm1hbm4gPHByekBtaXQuZWR1PohdBBARAgAVBQI6VOgnBQsJ +CAcDAhkBBRsDAAAAABIJEMdGNjmy13leB2VHUEcAAQFWUQCfWWfTDHzSezrDawgN +2Z4Qb7dHKooAoJyVnm61utdRsdLr2e6QnV5Z0yjjtCJQaGlsaXAgUi4gWmltbWVy +bWFubiA8cHJ6QGFjbS5vcmc+iE4EEBECAAYFAjpU6LcAEgkQx0Y2ObLXeV4HZUdQ +RwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0RSQT +kCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQABAAD/ +2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEi +MEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7 +Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACQ +AHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QA +tRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS +0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn +aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD +xMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB +AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEE +BSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2 +Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOU +lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn +6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKIfMwq +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 +jyIAEgkQx0Y2ObLXeV4HZUdQRwABAQfRAKCSnx3toHhFsCAaIsCRkmFdI4Hn9gCb +BDKIqvBEjybcnaBW+iZufcjAzsfRzNf/AAANkgEQAAEBAAAAAAAAAAAAAAAA/9j/ +4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEY +Ix8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4N +DhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 +Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA +AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEG +E1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF +RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj +pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP0 +9fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgEC +BAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLR +ChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 +dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbH +yMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aiii +gAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p968fv +LyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjjXnA8 +zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrETK51 +CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzDt7Hu +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 +AxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIE +AwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK +FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 +eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT +1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAA +AAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdh +cRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH +SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOk +paanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 ++Pn6/9oADAMBAAIRAxEAPwD2aiq1/fQabZyXdy+2KMZJrhr74s2UZK2Vm8pHRm4F +aQpTqfCiZTjHc9CoryC4+KesTNiGGKFfzqez8V+Jr9fMSUlQc5Xj+tb/AFSoleVk +R7aL2PWKK8w/4THWrf78oLDqCKng+Jd1EQLm1SQdyvBpPCVVsrh7WJ6RRXOaF410 +7XJxbIrxTkZ2t/jXRA5rnlFxdpI0TT1QtFFFSMKKKKACiiigAooooA5j4huV8I3W +D1wD+teHV9A+JdPh1TSjZ3BcRytyUIBGATxkH0rgn8AaQp4mvfxlT/4ivQwuIhSg +1I56tOUndHni/eFel+DdR00aasc8yxOg5z34qtB4F0B3ZJLu+Rh0+df/AIirLeB9 +GhOFv70Y/wBpD/7JV1q9GrGzbJhTnB3MfXri3nv5XtceVk4I6Hmufmfk12snhTTE +G3+0LzHXqn/xFM/4QrS5FDfar0g9/MT/AOIq4YqlFJJidKbdzn/CM/leIoXLBQOp +Jx6V69Hr+kJHiTVLQMOo85cj9a88uPB2mWlu08b3MjqyjbKylTlgOgUetbuk6ZFa +kSKpXK4+UcfjXFiakak+aJtTi4qzOpj1/Rpm2x6rZs3p565/nV9WV1DIwZT0IOQa +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 +=hj82 -----END PGP PUBLIC KEY BLOCK----- ----------------------------------------------------------------------- Summary of changes: doc/samplekeys.asc | 843 +++++++++++++++++++++++++--------------------------- 1 files changed, 411 insertions(+), 432 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 11 08:08:04 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Wed, 11 Jan 2012 08:08:04 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-14-g8608612 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 860861279bc17dd80eecc9631c4ae5d161a335fd (commit) from 3f59561cee635c6801e0a59d3abff1c064fcbdbe (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 860861279bc17dd80eecc9631c4ae5d161a335fd Author: David Shaw Date: Tue Jan 10 10:32:03 2012 -0500 Refresh sample keys diff --git a/doc/samplekeys.asc b/doc/samplekeys.asc index 21c36d8..241b013 100644 --- a/doc/samplekeys.asc +++ b/doc/samplekeys.asc @@ -1,18 +1,16 @@ - pub 1024D/5B0358A2 1999-03-15 [expires: 2009-07-11] + pub 1024D/5B0358A2 1999-03-15 [expired: 2009-07-11] uid Werner Koch uid Werner Koch uid Werner Koch uid Werner Koch - sub 1024D/010A57ED 2004-03-21 [expires: 2007-12-31] - sub 2048R/C3680A6E 2006-01-01 [expires: 2007-12-31] pub 1024D/57548DCD 1998-07-07 [expired: 2005-12-31] uid Werner Koch (gnupg sig) pub 4096R/99242560 2002-01-28 uid David M. Shaw - sub 2048g/1643B926 2002-01-28 [expires: 2012-01-26] - sub 1024D/49E1CBC9 2002-01-28 [expires: 2012-01-26] + sub 2048R/A1BC4FA4 2012-01-10 [expires: 2017-01-31] + sub 2048R/6F410A43 2012-01-10 [expires: 2017-01-31] pub 2048R/CA57AD7C 2004-12-06 uid PGP Global Directory Verification Key @@ -26,436 +24,417 @@ uid Philip R. Zimmermann sub 3072g/A8E92834 2001-01-04 - pub 1024R/1CE0C630 2006-01-01 [expires: 2008-12-31] + pub 1024R/1CE0C630 2006-01-01 [expired: 2011-06-30] uid Werner Koch (dist sig) -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.4-svn4128 (GNU/Linux) +Version: GnuPG v1.4.11 (GNU/Linux) -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 -ZUdQRwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0 -RSQTkCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQAB -AAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0 -KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 -Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAAR -CACQAHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL -/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx -wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk -ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 -usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEB -AQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC -AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygp -KjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK -kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk -5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKI -fMwqleanyUi/Osi4udqNLM+EUZJNNIlvsakuqjnYazbzxKlopLOHYfwqa5S/8QvO -xjtyY1z17msqWZpGAzuz1wP61LmuhrGk3udHceO9RL4gSNB6EbjVU+Ndd3YEir9U -Fc+nLYC49jWhbt5UW0RIGbpyKzuzbliuhuWfjnUw377ypQv3vk2/rXVaV4o07VFC -iUQzd43P8j3rzVpnLESIgHoopZJIYIxPDg89Vb7tNSZLppnsIIYAggj1FKa4XQ/G -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 -Cw4NDhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 -Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA -AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh -MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6 -Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ -mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx -8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA -AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV -YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hp -anN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPE -xcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2 -aiiigAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p9 -68fvLyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjj -XnA8zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrE -TK51CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzD -t7HuDQm0KUUz3ZHWRQ6MGU9CDkGnV5VZ6xf6FJ5qTlY8/Mh5Vh9K77QNfi1uEkJs -kUZI7EeorRSuYyjY16KKKogKKKKACiiigArO17VU0XR575sFkXCKf4mPQVo1wHxX -vfJ0yztw+N8hdh3IHA/nSew4q7PNdT1Ga9vpLi4kaaaRyWY8KDRYWCXkuG5Qc+gz -We8mWAUYz19TW9pbGJAScZ6msJuyO2nG7NOPTrcxhAMdOmOKp3eg36OWsw0qY4x2 -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 -xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHB -FVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl -ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6 -wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEB -AQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQID -EQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkq -NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqS -k5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl -5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APZqKrX99BptnJd3L7YoxkmuGvvi -zZRkrZWbykdGbgVpClOp8KJlOMdz0KivILj4p6xM2IYYoV/Op7PxX4mv18xJSVBz -leP61v8AVKiV5WRHtovY9YorzD/hMdat/vygsOoIqeD4l3URAubVJB3K8Gk8JVWy -uHtYnpFFc5oXjXTtcnFsivFORna3+NdEDmueUXF2kjRNPVC0UUVIwooooAKKKKAC -iiigDmPiG5XwjdYPXAP614dX0D4l0+HVNKNncFxHK3JQgEYBPGQfSuCfwBpCnia9 -/GVP/iK9DC4iFKDUjnq05Sd0eeL94V6X4N1HTRpqxzzLE6DnPfiq0HgXQHdkku75 -GHT51/8AiKst4H0aE4W/vRj/AGkP/slXWr0asbNsmFOcHcx9euLee/le1x5WTgjo -ea5+Z+TXayeFNMQbf7QvMdeqf/EUz/hCtLkUN9qvSD38xP8A4irhiqUUkmJ0pt3O -f8Iz+V4ihcsFA6knHpXr0ev6QkeJNUtAw6jzlyP1rzy48HaZaW7TxvcyOrKNsrKV -OWA6BR61u6TpkVqRIqlcrj5Rx+NcWJqRqT5om1OLirM6mPX9GmbbHqtmzennrn+d -X1ZXUMjBlPQg5BrnjAjqcbWHtzWFqGmySTma1le1dchXtXMZx9R1/Guexpc9Aorh -YPFOq6Y6pdj7ZF0zIAr/AIMOPzH411Ola7Yawh+zSkSKMvC4w6/h6e4yKLBc0aKK -KQwooooApalykQ9XP/oLVjyxYrZ1H7kR/wBv/wBlIqgyhhQMwJhcxu6xoQCScget -OF7cxho3gLg9xkdsdutLdX0yX9xAoQLCyqPlznKK2T/31UJvJT12f98iiwiQzyAb -I1IyB1HsBVqGFktowwwQKzzdSEEfKP8AgIq3b3BEcLt92WJHYDoCygnH50WAS9H/ -ABL5s+sf/o1KsW88giwiqAvdjUWojFi5B4Zo/wAfnU1pWq7rXaCFyOuKEBE1yduT -GwPQ7KJQhGOM46VbMC+UF4DAdcVmTEQyMsKCZ+h5wFpiM2/hmcsiIrA9FZeDXOSN -LpV0jvM0LZzE65BjP+9XVTabn5zJJuzncH5qneQhovLbkAdG+b+dUhM3/DPipdUI -sb3al6B8rDhZgO49D6j8R6Dpa8ZuQ0Tq0ZMbxkFWTgqR0Ir0jwn4hGvacfNIF5b4 -WdR39GHsf5g0SjbUEzeoooqCipqA/cxn0lX9Tj+tUK1LqLzoGTODwQfQg5B/OuT8 -Sa1ceHdOe8ktIpwHCKquUySfoaAKl4P+Jvf/APXVP/RUdQkVBpWp/wBuxXGpfZ/s -/nTY8vfv27UVeuBnpnpVoiqER1biH+h2v/XtF/6AtVSKyLfxbcTRrBbaMZPs6CEy -Nc4Vio25+77dM0mM37yUiwCHp5yAfqf6VrWcuIV5rkGu9X1Mxoba3tY0fdtDFyxx -jJPtk+nWtaGW9tlCzOhQ8BgpBzRYRszagm4wJl5Dxhe1SRQJBEBwTUFpDFHECMHP -OfX3qSSXjrTSFciuG4NY143WtC4k4NZN2/WrRLMa96motC1g6Dr0F6WIhJ8uceqH -qfw4P4U+7PWsi6GVbNVa4j3kHIyKKwvBd+2oeFbN5G3Swr5MnsV4598YP40Vgam9 -XnvxamC6bp9uD/rJyzD6DivQq82+LikLpkn8Jdh+OKqO4nsQeCUB0cAjI+0N/Stq -6EUV05Kjy1PIrgfDRZfEun7XYK0hyMnB+U9q72/G9rmqejEtUQyXFrKu2FAreuSe -KwNBVAhyo4dv/QjWH4w1EpEtpbJK5Rw00kf/ACz46HFGh+JrFLVYwjNKi8qpAB/E -8ikgZ6BC6DoBSX91aCExXEwTcueOoHr7c1zOkand32pFmncooLGMN8voAB+NdDvz -w2Rx3FOxNy1p1xA9kgtpxNGoxuByfxqSSXjrWJcWKSXcVzHLLC8ZBPksF3Y9eKq3 -+o6z9tkitLeERZBWWTGMf5/GgDYnl4NZlzJ1pWuZSkQkjBZgfMaM/Khx784NU55c -1SEU7lutZdzMkEUk7jcI13bfU9hV2d81n3EaTxvDJ9yQbSfT0P51Qju/g5ePc+H9 -QSRtzLelyf8AeVf8KKg+C8Lw6bqyuOVuVU/ULRWD3NVselVw3xYtDN4ZhugOba4U -n6EY/wAK7ms/XdNXWNDvNPb/AJbxFV9m7frihaMGeM+GW3eIdOP/AE0b/wBAau/k -+d7n61514X3xeJbOCUFZIpXVgexCsDXocJ3y3A/2hVy3FE4RrOWw1KWK4BVmdnRh -0dSeoqeewtL6ER3EKuobcCPlIOMZBFaPjCdI5LK2APmbjIT6LjH8z+lZ0MhKiqjq -iXozJn0q/wBPDTW8wuoYxu2kFZQP5HFbnhbUftdjK6XHmoJOAG3beP61IjHjnmqk -ulIblbm0mlspsbXa2wvmL6EevvRYR0T3AjRmkYIqjcxY4AFZsmv6WJGX7Upx/EEJ -U/Q965nW3n0+KOyjup3t5MvslfcQQfXrjvisNpn67jQI9DlvLfyvN+0weXjO/wAw -YxVadyADkEMMgg5BHsa8/eVvb64q7pWtS2MojkLvbNkNGD09xnoaYHSStmqc7fIa -LbUIL9ZPKWRHjGSGIORnGcio7hZJCkMSl5JWCoo6kngCncD1L4XW3l+GZrraR9su -3lGfQAL/ADU0V0miaamj6LZ6cmD9niCsR3b+I/icmisHuaov0UUUhnmnifw8dN8e -2Gr26/6Peu3mY/hkCN/Mc/nV3T333Mw9XFbvi84tLU+k4/8AQTXN6M+6+ceriq6C -MDxbeQXmsxW0ChmtQVkkHcnHy/hj9aggj4FN/sqawv5ba6XEqsTnswJ4YHvWjDb9 -OK0WiIe4xIjUkhS3heeXOyNSzY64FXI7f2pbvTvtdlNbklBKhTco5XI60XFY881S -+m1OcSSIqKowiKOFH9TVAxH0rYl0y4s7h7W6C+anO5ejr2YU02ftSuFjGaEntTRb -knpWz9jPcU+OwLNhVyadxWKmlKbSdn2btyFcEkda9C+H+hR6prH9sPGwt7I4QNgh -pcdvXbnP1IrB0Pw5c63qIsLT5duDcT4ysC/1Y9h/SvZtO0+20rT4bGzj8uCFdqjv -7k+pJ5JqJMuKLVFFFQWFFFFAHOeMj/oVr/18Afoa57Tk8jW0j/vOK7PWdOGo2qru -2vG4dDjIyPWuTuoL6G9842QLg8MjjH68imnoBB42U2L2uqlfMhX9zKijLLnkMPbg -5qvpz2WoRiS0nR89s8irFxDqWoMguCFjjOVjTpn1J7msbU/DTiT7RaBrebruj4z+ -FNMTR0sdm47Zqwtqf7tcRDq/ifTDtbFwo/vjmr8XjvU4+JtLyfY07iNPXPDa6lGr -xnyriP8A1coXOPYjuK506FfwP5VwiOcZDxghSPx71oS+PdQYYi0rn3NZeoa14k1W -UCAC2jxjhcn3NIB82nQWcRlvZ0hQcncafp2nz6xIotEazsj965kX53H+wp/mf1qP -SvDVxJdC5vi9xIDkGU7sfSu1tLOQYGDRcLGzoNrZaVYpZ2MQjjBye7Ox6sT3NbKn -IzWTZ27LjNaqDC1JQ+iiigAooooAQjNRPbRueVFTUUAVjZRdlFQvpsT/AMNX6KAM -eTQ4H6oPyqBvDdqf+WS/lW/RQBz48NWoP+qX8qmTQbdOiD8q2qKAM1NKiTooqwln -GnQVaooAYsYXoKdS0UAFFFFAH//ZiQFOBBABAgA4BQJCUbRwBwsJCAcDAgoZGGxk -YXA6Ly9rZXlzZXJ2ZXIucGdwLmNvbQUbAwAAAAMWAgEFHgEAAAAACgkQlxC4m8pX -rXxIEgf+P5EZwy4eZWhmrj5duYK6edt+3hPRNrijqbE2RzrCTk/0+lwT2LHO2NXK -wya/aLhjvjp0Jj0HW1+FBbXRLf0fOtgeHcjhrbBv3NCeJkJ/VedsJ7V5Gyw2FOkt -VdedcoSxz0TAPky2I8gKW5khcHTxnHa4lJn7+L1OpIzkRS4mT6VeqBcZSJNpJc3r -cj/gGdsXMLDxJpJPt3ueiTjlQL0j/6BwpU76hgROCuxTsAvq6TXpgP0ml9hkcQWa -lihL6pDe0t88IbeBpL92MFlZaQ23nPt7qxtGSjj1cSPcRSHfceCOs6Uvy4k1uGVn -k14gtzEeoZMeOL7nAwQMGN81P8LqbZiOBEO3+scBBADQmRl6K1zJAyqTbEZ3/mYa -hzj5g3BCjw5KZXAi9jxQAje0GiuEXqFr2eJqplTi92V1OdcxTSPWg9yQCE6BE9o6 -9oRmFhRMXQX/XmmIAXl2RlDp2yZdVSQ81gxlOmRzacD4gAIGI6bKAYGQsW5e8dFb -WLpI3PbyJEf9RlxguL/aIQAggVZQmbQmV2VybmVyIEtvY2ggKGRpc3Qgc2lnKSA8 -ZGQ5am5AZ251Lm9yZz6IvAQTAQIAJgUCQ7f6yAIbAwUJBaOagAYLCQgHAwIEFQII -AwQWAgMBAh4BAheAAAoJEFO2INAc4MYweaMEAIdDDtJLkO4TOgCo/GCuG0RmqRwZ -niJ4mnq/WOr8F4BK3w1HIuwVEE8V6BRU4Chx8wc9/W83krckIE5uaZRmjhCXCWsi -K9Ow2ngbXAv3TKFVCbMMmyjBbT+31M9OT0Sowob8a1s4Xv2J+gQJjxfumMUKNlvf -K86tEx0ucCiY15h8 -=yJFz +mQGiBDbtSOkRBACURhKnGIFyXIeX61GAY9hJA5FgG4UalV55ohdz4whBgDzDGLE3 +XYlO8HCn4ggKilll6MOwY0yZeg6PEU9Y3SqTzpQSV6qj2M7MgcS8xOpi6bNCu0iy +ZUik0KklUXMdI8e/CVmBpQJT9CofbD1dsP6z4dC6z3jil0+5Wbfw6yIXzwCgy/7F +agq5mN0H760/JEiiXILS1n0D/3H26lTaxo1vGput9Td1FQN7Vn6YDP0/To5ipsOO +DROV3zyUwF5QleY+8zTFJA3qD5KxRfA726WELOF1mB6Mw44UdkPniOoGdMH5oSx6 +qnNnlVZBBu3U+e1qfQwLQjHu0WX4Z2q00DKpWLThGv7Loh5NKi6OfTbMhfHoevCA +zQnmA/wKc6J8GqthENThKXxZaei3Ep0t+PlBmbUzuAYCXZhI6/0KyD6emyQ7LYIa +Pv9qEfMkMLhxicG0v/AAwOCBRKS3bkqc6wAYaO0bjUHJvem3HkWPux82t83+6YPy +RnVjm/mwt0uEyKSvt7Md2DVrO3lEcKRkRHiYuf0nonPhl5Rs5bQaV2VybmVyIEtv +Y2ggPHdrQGdudXBnLm9yZz6IawQTEQIAIwIXgAIZAQUJE2uL/wUCQllAcgULBwoD +AgMVAgMDFgIBAh4BABIHZUdQRwABAQkQXeJJllsDWKI6xwCfV3paxYsk7KQmrtOU +xNmZb004OQoAn3uq9imOpgxqsXhXaLfz5IqZu5O7tBxXZXJuZXIgS29jaCA8d2tA +ZzEwY29kZS5jb20+iGMEExECACMCGwMCHgECF4AFCRNri/8FAkJZQHoFCwcKAwID +FQIDAxYCAQAKCRBd4kmWWwNYouXsAJ9nbkvbiJZvNlzwBL98x7YB+u9fsgCfXE6v +Hv6DJk7Eh9CY+Gcdn6kCG8i0C1dlcm5lciBLb2NoiGMEExECABsFAjbtSOoFCQzJ +fIADCwoDAxUDAgMWAgECF4AAEgkQXeJJllsDWKIHZUdQRwABAbXWAJ9SCW0ieOpL +7AY6vF+OIaMmw2ZW1gCgkto0eWfgpjAuVg6jXqR1wHt2pQO0HVdlcm5lciBLb2No +IDx3ZXJuZXJAZnNmZS5vcmc+iGMEExECACMCGwMFCRNri/8CHgECF4AFAkJZQHoF +CwcKAwIDFQIDAxYCAQAKCRBd4kmWWwNYovxpAJ0ftTtETxhK8aKfIok/+43wNbQA +SwCfSFCPuVKTNHpv4JJ79feDCtfxxLG5AaIEQF3aTxEEAP9SgfIbIPL6BQ1nqobl +sTYoiwWPL48uBZPjkDfy8XsVR5V9aRQlggC4x4/MD3Ip5AUgReI7PcHnp4m3vcVL +XPl+/7i7hAwd84iKzgN8I8VW0EevflcNm7nbWEnpjaGxJWFbhSLI1DmqnafoU8nZ +gGp2QoE+flgGDd559C3SiHRTAKDbqgS3EDhTbwfS+bAhW5Xi8/2CPwP9HueeuW9M +/cyt8UvliLsj2eYMEIy7CeSLO13XfnqCjcnHK+b59/ADd99dpMaq3gKj7Aj1RIsR +V2qWDJpDNXVxP7Cy+FzxelQsytPQOV8H8AkB+RgmSyfxlNRUkC3sQU6jR9IwmPD4 +iB5fp/SqUpn++77TAArXqsfHbmlnwcuU1EAD/i7CEhxLBYS1N77hwxL8DWCqjpi+ +1PKG+6dc0BQFIU3uUhbzLGfqEobUDhveqgtlsvoEZ/lR8RgMv/uOjXEgiATQyTEa +7s3M2vjXlpLjXjzklma3Lqmcam3dEf/5OR02yZif6hPU/x8f/VQle0kKNKdOCV1+ +dlo8aJH2UIZRRIvtiJcEGBECAA8CGwIFCQcbVgAFAkR1rB0AUkcgBBkRAgAGBQJE +dawTAAoJEGB4TpQBClft2RMAn1XiL/bC9hByZInCJTaCd8WS8kYCAKCfpAWwLIxk +fwAeD/RI+2p00nQfvAkQXeJJllsDWKKx7QCguc4/HiEs64Ey5p6Yihy67X8E0YsA +nRXMFdXVP7ww8uldljPiD1TgyurpuQELBEBd2ykBCADRKFS0lZw/2MawS97P3nVy +t2FF9XWb8si7T9Jgl+NRF93uqUOIC15s3u5SVPcwdIhoG04wYKHTLKhyBAjFp4az +fLmiIBDDp37DY3SAtJT6TsgULR+yFkXbRvuIOU5N/0WxzrK6JJwlFVEyaPX7zmWV +KMCj+SMj2FrmltuVS0aCf0io3n97bUAvuU3dgjTFoHqW4017smfbE4VMwnLYi3/1 +SS9s0ysKM6Px5yEM3oQiOW/9pS48wSFfs3lXi8N1BikgPdU5FFA+5BGSUhxyFf+l +qdjwcByBC7LT3dCrFeWQOL0UeVh6wG48O63j8jue7mfTm+559uXnD/J65PiHcZTn +AAYpiE8EGBECAA8FAkBd2ykCGwwFCQNY7wAACgkQXeJJllsDWKIS1gCgoJ2z4OnA +0dVt7ZM/PeAsKXA0KFUAn3AV3yuZKX4WHw5Pnf5sLmF5LUkluQELBEO4FiIBCADR +WoeCwf4lVIJQahM7ytFRvPMrkSZQy072/I6/4QPKsaHI+HnoB8PjTmBpyBDLK8Y6 +Of3Y1hNb77xe+m2g+8Wq/BUKHvUi1F+xzszpnixtMr+QOiy6U7kCJA6fGvq0qmzr +XGcv5rXpGvWwyZfymTLW4X2WKgNL8bhODy0uJ9ZR/fhjE7nnIHgIboSnBAUPHCsI +9BFumsbU8FKsKJCOBqziHEyDHbix7uP6ByYslH2tUw9WdQU8Yzo2mWojghXpjE7U +T0tAb4QNTdwurLgiEIH5umsM43elr1/2nd06KigQX+NR4MqytR+28JtEEKvULwJZ +pmExs4B+OB4x8l+6Lc0/AAYpiE8EGBECAA8FAkO4FiICGwwFCQPBFYAACgkQXeJJ +llsDWKJdywCeNyRtO1/yIyiNkotYRfO5y3xuHocAnAyA4jaxa702sRs4iPR/WWJk +MgEqmQGiBDpU6CcRBADCT/tGpBu0EHpjd3G11QtkTWYnihZDBdenjYV2EvotgRZA +j5h4ewprq1u/zqzGBYpiYL/9j+5XDFcoWF24bzsUmHXsbDSiv+XEyQND1GUdx4wV +cEY5rNjkArX06XuZzObvXFXOvqRj6LskePtw3xLf5uj8jPN0Nf6YKnhfGIHRWQCg +/0UAr3hMK6zcA/egvWRGsm9dJecD/18XWekzt5JJeK3febJO/3Mwe43O6VNOxmMp +GWOYTrhivyOb/ZLgLedqX+MeXHGdGroARZ+kxYq/a9y5jNcivD+EyN+IiNDPD64r +l00FNZksx7dijD89PbIULDCtUpps2J0gk5inR+yzinf+jDyFnn5UEHI2rPFLUbXW +HJXJcp0UBACBkzDdesPjEVXZdTRTLk0sfiWEdcBM/5GpNswMlK4A7A6iqJoSNJ4p +O5Qq6PYOwDFqGir19WEfoTyHW0kxipnVbvq4q2vAhSIKOqNEJGxg4DTEKecf3xCd +J0kW8dVSogHDH/c+Q4+RFQq/31aev3HDy20YayxAE94BWIsKkhaMyohhBB8RAgAh +BQI6VPBbAgcAFwyAET/HMgQdI+nqZt21AJydvCHfdNxhAAoJEMdGNjmy13leV7gA +oKHV2q0XEP8GJkyp0/V5lgbwBmBMAJ9TtVfw2khoaZ3LNV2tINSjj0Alp7QiUGhp +bGlwIFIuIFppbW1lcm1hbm4gPHByekBtaXQuZWR1PohdBBARAgAVBQI6VOgnBQsJ +CAcDAhkBBRsDAAAAABIJEMdGNjmy13leB2VHUEcAAQFWUQCfWWfTDHzSezrDawgN +2Z4Qb7dHKooAoJyVnm61utdRsdLr2e6QnV5Z0yjjtCJQaGlsaXAgUi4gWmltbWVy +bWFubiA8cHJ6QGFjbS5vcmc+iE4EEBECAAYFAjpU6LcAEgkQx0Y2ObLXeV4HZUdQ +RwABARPJAKDmKL2Aeo6OWwcZKyqSWLD4drQxfgCguJ7k7XEuQr+tL0ndoin0RSQT +kCHRzH//AAANOgEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQAAAQABAAD/ +2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEi +MEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7Ozs7 +Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCACQ +AHgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QA +tRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS +0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn +aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD +xMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB +AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEE +BSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2 +Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOU +lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn +6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqKXFKDSEgDJOBXSeeHaoJrqKIfMwq +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 +jyIAEgkQx0Y2ObLXeV4HZUdQRwABAQfRAKCSnx3toHhFsCAaIsCRkmFdI4Hn9gCb +BDKIqvBEjybcnaBW+iZufcjAzsfRzNf/AAANkgEQAAEBAAAAAAAAAAAAAAAA/9j/ +4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEY +Ix8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4N +DhwQEBw7KCIoOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 +Ozs7Ozs7Ozs7Ozv/wAARCACPAHUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA +AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEG +E1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF +RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj +pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP0 +9fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgEC +BAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLR +ChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 +dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbH +yMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aiii +gAooooAKyNb8S6boUZN1Lulx8sS/eP8Ah+NZXjbxcdCt/sdjh7+UdcjES+p968fv +LyW6leaa4mmlY5kkL4AP1qXLsaQhfVnc6l8TdSncrYRRW6Zx03t/L+lYsvjjXnA8 +zUZY8nI2kr/QVzlu0b8+S2R/HvJNWFgAYuwDFuvJ/lzms2/M2UbdDrLPxlrETK51 +CRxn7sm1gfzrs9F8b2d8ix3v+jyn+Ij5T/hXkQj8gZX5hnlCMZq9YShm8vzDt7Hu +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 +AxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIE +AwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK +FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 +eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT +1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAA +AAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdh +cRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH +SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOk +paanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 ++Pn6/9oADAMBAAIRAxEAPwD2aiq1/fQabZyXdy+2KMZJrhr74s2UZK2Vm8pHRm4F +aQpTqfCiZTjHc9CoryC4+KesTNiGGKFfzqez8V+Jr9fMSUlQc5Xj+tb/AFSoleVk +R7aL2PWKK8w/4THWrf78oLDqCKng+Jd1EQLm1SQdyvBpPCVVsrh7WJ6RRXOaF410 +7XJxbIrxTkZ2t/jXRA5rnlFxdpI0TT1QtFFFSMKKKKACiiigAooooA5j4huV8I3W +D1wD+teHV9A+JdPh1TSjZ3BcRytyUIBGATxkH0rgn8AaQp4mvfxlT/4ivQwuIhSg +1I56tOUndHni/eFel+DdR00aasc8yxOg5z34qtB4F0B3ZJLu+Rh0+df/AIirLeB9 +GhOFv70Y/wBpD/7JV1q9GrGzbJhTnB3MfXri3nv5XtceVk4I6Hmufmfk12snhTTE +G3+0LzHXqn/xFM/4QrS5FDfar0g9/MT/AOIq4YqlFJJidKbdzn/CM/leIoXLBQOp +Jx6V69Hr+kJHiTVLQMOo85cj9a88uPB2mWlu08b3MjqyjbKylTlgOgUetbuk6ZFa +kSKpXK4+UcfjXFiakak+aJtTi4qzOpj1/Rpm2x6rZs3p565/nV9WV1DIwZT0IOQa +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 +=hj82 -----END PGP PUBLIC KEY BLOCK----- ----------------------------------------------------------------------- Summary of changes: doc/samplekeys.asc | 843 +++++++++++++++++++++++++--------------------------- 1 files changed, 411 insertions(+), 432 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 11 08:20:37 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Wed, 11 Jan 2012 08:20:37 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-32-gcb8ebf7 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via cb8ebf792e919b1797bf16b6606427d77c45c947 (commit) from 174d2f80bf40c9ae18fcd9fa834092ca2517e977 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cb8ebf792e919b1797bf16b6606427d77c45c947 Author: David Shaw Date: Wed Jan 11 01:23:59 2012 -0500 Distribute dotlock.h diff --git a/include/distfiles b/include/distfiles index d94334c..669fb6e 100644 --- a/include/distfiles +++ b/include/distfiles @@ -16,3 +16,4 @@ assuan.h compat.h srv.h estream-printf.h +dotlock.h ----------------------------------------------------------------------- Summary of changes: include/distfiles | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 11 14:41:56 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 11 Jan 2012 14:41:56 +0100 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-23-g6078b05 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 6078b05f5340d886e0b9e6cee1d9b5043e0cb210 (commit) from 38fcd59ce774eaa3d65f2f7534c989afd860eb56 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6078b05f5340d886e0b9e6cee1d9b5043e0cb210 Author: Werner Koch Date: Mon Jan 9 14:11:41 2012 +0100 Include an IDEA implementation. The code is the old IDEA test code, written by me back in 1997 and distributed on a Danish FTP server. This commit is only for reference. To use the code it has to be adjusted to the Libgcrypt framework. diff --git a/cipher/idea.c b/cipher/idea.c new file mode 100644 index 0000000..65a8ec3 --- /dev/null +++ b/cipher/idea.c @@ -0,0 +1,476 @@ +/* idea.c - IDEA function + * Copyright (c) 1997, 1998, 1999, 2001 by Werner Koch (dd9jn) + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * WERNER KOCH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of Werner Koch shall not be + * used in advertising or otherwise to promote the sale, use or other dealings + * in this Software without prior written authorization from Werner Koch. + * + * DUE TO PATENT CLAIMS THE DISTRIBUTION OF THE SOFTWARE IS NOT ALLOWED IN + * THESE COUNTRIES: + * AUSTRIA, FRANCE, GERMANY, ITALY, JAPAN, THE NETHERLANDS, + * SPAIN, SWEDEN, SWITZERLAND, THE UK AND THE US. + */ + +/* + * Please see http://www.noepatents.org/ to learn why software patents + * are bad for society and what you can do to fight them. + * + * The code herein is based on the one from: + * Bruce Schneier: Applied Cryptography. John Wiley & Sons, 1996. + * ISBN 0-471-11709-9. . + * + * How to compile: + gcc -Wall -O2 -shared -fPIC -o idea idea.c + * + * 2001-06-08 wk Changed distribution conditions + * 2001-06-11 wk Fixed invert_key (which is not used in CFB mode) + * Thanks to Mark A. Borgerding. Added defintion for + * the PowerPC. + */ + + +#include +#include +#include +#include + +/* configuration stuff */ +#ifdef __alpha__ + #define SIZEOF_UNSIGNED_LONG 8 +#else + #define SIZEOF_UNSIGNED_LONG 4 +#endif + +#if defined(__mc68000__) || defined (__sparc__) || defined (__PPC__) \ + || (defined(__mips__) && (defined(MIPSEB) || defined (__MIPSEB__)) ) \ + || defined(__powerpc__) \ + || defined(__hpux__) /* should be replaced by the Macro for the PA */ + #define BIG_ENDIAN_HOST 1 +#else + #define LITTLE_ENDIAN_HOST 1 +#endif + +typedef unsigned long ulong; +typedef unsigned short ushort; +typedef unsigned char byte; + +typedef unsigned short u16; +typedef unsigned long u32; + +/* end configurable stuff */ + +#ifndef DIM + #define DIM(v) (sizeof(v)/sizeof((v)[0])) + #define DIMof(type,member) DIM(((type *)0)->member) +#endif + +/* imports */ +void g10_log_fatal( const char *fmt, ... ); + + +/* local stuff */ + +#define FNCCAST_SETKEY(f) ((int(*)(void*, byte*, unsigned))(f)) +#define FNCCAST_CRYPT(f) ((void(*)(void*, byte*, byte*))(f)) + +#define IDEA_KEYSIZE 16 +#define IDEA_BLOCKSIZE 8 +#define IDEA_ROUNDS 8 +#define IDEA_KEYLEN (6*IDEA_ROUNDS+4) + +typedef struct { + u16 ek[IDEA_KEYLEN]; + u16 dk[IDEA_KEYLEN]; + int have_dk; +} IDEA_context; + + +static int do_setkey( IDEA_context *c, byte *key, unsigned keylen ); +static void encrypt_block( IDEA_context *bc, byte *outbuf, byte *inbuf ); +static void decrypt_block( IDEA_context *bc, byte *outbuf, byte *inbuf ); +static void selftest(int); + + + +static u16 +mul_inv( u16 x ) +{ + u16 t0, t1; + u16 q, y; + + if( x < 2 ) + return x; + t1 = 0x10001L / x; + y = 0x10001L % x; + if( y == 1 ) + return (1-t1) & 0xffff; + + t0 = 1; + do { + q = x / y; + x = x % y; + t0 += q * t1; + if( x == 1 ) + return t0; + q = y / x; + y = y % x; + t1 += q * t0; + } while( y != 1 ); + return (1-t1) & 0xffff; +} + + + +static void +expand_key( byte *userkey, u16 *ek ) +{ + int i,j; + + for(j=0; j < 8; j++ ) { + ek[j] = (*userkey << 8) + userkey[1]; + userkey += 2; + } + for(i=0; j < IDEA_KEYLEN; j++ ) { + i++; + ek[i+7] = ek[i&7] << 9 | ek[(i+1)&7] >> 7; + ek += i & 8; + i &= 7; + } +} + + +static void +invert_key( u16 *ek, u16 dk[IDEA_KEYLEN] ) +{ + int i; + u16 t1, t2, t3; + u16 temp[IDEA_KEYLEN]; + u16 *p = temp + IDEA_KEYLEN; + + t1 = mul_inv( *ek++ ); + t2 = -*ek++; + t3 = -*ek++; + *--p = mul_inv( *ek++ ); + *--p = t3; + *--p = t2; + *--p = t1; + + for(i=0; i < IDEA_ROUNDS-1; i++ ) { + t1 = *ek++; + *--p = *ek++; + *--p = t1; + + t1 = mul_inv( *ek++ ); + t2 = -*ek++; + t3 = -*ek++; + *--p = mul_inv( *ek++ ); + *--p = t2; + *--p = t3; + *--p = t1; + } + t1 = *ek++; + *--p = *ek++; + *--p = t1; + + t1 = mul_inv( *ek++ ); + t2 = -*ek++; + t3 = -*ek++; + *--p = mul_inv( *ek++ ); + *--p = t3; + *--p = t2; + *--p = t1; + memcpy(dk, temp, sizeof(temp) ); + memset(temp, 0, sizeof(temp) ); /* burn temp */ +} + + +static void +cipher( byte *outbuf, byte *inbuf, u16 *key ) +{ + u16 x1, x2, x3,x4, s2, s3; + u16 *in, *out; + int r = IDEA_ROUNDS; + #define MUL(x,y) \ + do {u16 _t16; u32 _t32; \ + if( (_t16 = (y)) ) { \ + if( (x = (x)&0xffff) ) { \ + _t32 = (u32)x * _t16; \ + x = _t32 & 0xffff; \ + _t16 = _t32 >> 16; \ + x = ((x)-_t16) + (x<_t16?1:0); \ + } \ + else { \ + x = 1 - _t16; \ + } \ + } \ + else { \ + x = 1 - x; \ + } \ + } while(0) + + in = (u16*)inbuf; + x1 = *in++; + x2 = *in++; + x3 = *in++; + x4 = *in; + #ifdef LITTLE_ENDIAN_HOST + x1 = (x1>>8) | (x1<<8); + x2 = (x2>>8) | (x2<<8); + x3 = (x3>>8) | (x3<<8); + x4 = (x4>>8) | (x4<<8); + #endif + do { + MUL(x1, *key++); + x2 += *key++; + x3 += *key++; + MUL(x4, *key++ ); + + s3 = x3; + x3 ^= x1; + MUL(x3, *key++); + s2 = x2; + x2 ^=x4; + x2 += x3; + MUL(x2, *key++); + x3 += x2; + + x1 ^= x2; + x4 ^= x3; + + x2 ^= s3; + x3 ^= s2; + } while( --r ); + MUL(x1, *key++); + x3 += *key++; + x2 += *key++; + MUL(x4, *key); + + out = (u16*)outbuf; + #ifdef LITTLE_ENDIAN_HOST + *out++ = (x1>>8) | (x1<<8); + *out++ = (x3>>8) | (x3<<8); + *out++ = (x2>>8) | (x2<<8); + *out = (x4>>8) | (x4<<8); + #else + *out++ = x1; + *out++ = x3; + *out++ = x2; + *out = x4; + #endif + #undef MUL +} + + +static int +do_setkey( IDEA_context *c, byte *key, unsigned keylen ) +{ + static int initialized = 0; + + if( !initialized ) { + initialized = 1; + selftest(0); + } + assert(keylen == 16); + c->have_dk = 0; + expand_key( key, c->ek ); + invert_key( c->ek, c->dk ); + return 0; +} + +static void +encrypt_block( IDEA_context *c, byte *outbuf, byte *inbuf ) +{ + cipher( outbuf, inbuf, c->ek ); +} + +static void +decrypt_block( IDEA_context *c, byte *outbuf, byte *inbuf ) +{ + static int initialized; + + if( !initialized ) { + initialized = 1; + selftest(1); + } + if( !c->have_dk ) { + c->have_dk = 1; + invert_key( c->ek, c->dk ); + } + cipher( outbuf, inbuf, c->dk ); +} + + +static void +selftest( int check_decrypt ) +{ +static struct { + byte key[16]; + byte plain[8]; + byte cipher[8]; +} test_vectors[] = { + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03 }, + { 0x11, 0xFB, 0xED, 0x2B, 0x01, 0x98, 0x6D, 0xE5 } }, + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }, + { 0x54, 0x0E, 0x5F, 0xEA, 0x18, 0xC2, 0xF8, 0xB1 } }, + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0x00, 0x19, 0x32, 0x4B, 0x64, 0x7D, 0x96, 0xAF }, + { 0x9F, 0x0A, 0x0A, 0xB6, 0xE1, 0x0C, 0xED, 0x78 } }, + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0xF5, 0x20, 0x2D, 0x5B, 0x9C, 0x67, 0x1B, 0x08 }, + { 0xCF, 0x18, 0xFD, 0x73, 0x55, 0xE2, 0xC5, 0xC5 } }, + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0xFA, 0xE6, 0xD2, 0xBE, 0xAA, 0x96, 0x82, 0x6E }, + { 0x85, 0xDF, 0x52, 0x00, 0x56, 0x08, 0x19, 0x3D } }, + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0x0A, 0x14, 0x1E, 0x28, 0x32, 0x3C, 0x46, 0x50 }, + { 0x2F, 0x7D, 0xE7, 0x50, 0x21, 0x2F, 0xB7, 0x34 } }, + { { 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, + 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08 }, + { 0x05, 0x0A, 0x0F, 0x14, 0x19, 0x1E, 0x23, 0x28 }, + { 0x7B, 0x73, 0x14, 0x92, 0x5D, 0xE5, 0x9C, 0x09 } }, + { { 0x00, 0x05, 0x00, 0x0A, 0x00, 0x0F, 0x00, 0x14, + 0x00, 0x19, 0x00, 0x1E, 0x00, 0x23, 0x00, 0x28 }, + { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }, + { 0x3E, 0xC0, 0x47, 0x80, 0xBE, 0xFF, 0x6E, 0x20 } }, + { { 0x3A, 0x98, 0x4E, 0x20, 0x00, 0x19, 0x5D, 0xB3, + 0x2E, 0xE5, 0x01, 0xC8, 0xC4, 0x7C, 0xEA, 0x60 }, + { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }, + { 0x97, 0xBC, 0xD8, 0x20, 0x07, 0x80, 0xDA, 0x86 } }, + { { 0x00, 0x64, 0x00, 0xC8, 0x01, 0x2C, 0x01, 0x90, + 0x01, 0xF4, 0x02, 0x58, 0x02, 0xBC, 0x03, 0x20 }, + { 0x05, 0x32, 0x0A, 0x64, 0x14, 0xC8, 0x19, 0xFA }, + { 0x65, 0xBE, 0x87, 0xE7, 0xA2, 0x53, 0x8A, 0xED } }, + { { 0x9D, 0x40, 0x75, 0xC1, 0x03, 0xBC, 0x32, 0x2A, + 0xFB, 0x03, 0xE7, 0xBE, 0x6A, 0xB3, 0x00, 0x06 }, + { 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 }, + { 0xF5, 0xDB, 0x1A, 0xC4, 0x5E, 0x5E, 0xF9, 0xF9 } } +}; + IDEA_context c; + byte buffer[8]; + int i; + + for(i=0; i < DIM(test_vectors); i++ ) { + do_setkey( &c, test_vectors[i].key, 16 ); + if( !check_decrypt ) { + encrypt_block( &c, buffer, test_vectors[i].plain ); + if( memcmp( buffer, test_vectors[i].cipher, 8 ) ) + g10_log_fatal("idea encryption (%d) failed\n", i); + } + else { + decrypt_block( &c, buffer, test_vectors[i].cipher ); + if( memcmp( buffer, test_vectors[i].plain, 8 ) ) + g10_log_fatal("idea decryption (%d) failed\n", i); + } + } +} + + +/**************** + * Return some information about the algorithm. We need algo here to + * distinguish different flavors of the algorithm. + * Returns: A pointer to string describing the algorithm or NULL if + * the ALGO is invalid. + */ +const char * +idea_get_info( int algo, size_t *keylen, + size_t *blocksize, size_t *contextsize, + int (**r_setkey)( void *c, byte *key, unsigned keylen ), + void (**r_encrypt)( void *c, byte *outbuf, byte *inbuf ), + void (**r_decrypt)( void *c, byte *outbuf, byte *inbuf ) + ) +{ + *keylen = 128; + *blocksize = 8; + *contextsize = sizeof(IDEA_context); + *r_setkey = FNCCAST_SETKEY(do_setkey); + *r_encrypt= FNCCAST_CRYPT(encrypt_block); + *r_decrypt= FNCCAST_CRYPT(decrypt_block); + if( algo == 1 ) + return "IDEA"; + return NULL; +} + + + +const char * const gnupgext_version = "IDEA ($Revision: 1.11 $)"; + +static struct { + int class; + int version; + int value; + void (*func)(void); +} func_table[] = { + { 20, 1, 0, (void(*)(void))idea_get_info }, + { 21, 1, 1 }, +}; + + + +/**************** + * Enumerate the names of the functions together with informations about + * this function. Set sequence to an integer with a initial value of 0 and + * do not change it. + * If what is 0 all kind of functions are returned. + * Return values: class := class of function: + * 10 = message digest algorithm info function + * 11 = integer with available md algorithms + * 20 = cipher algorithm info function + * 21 = integer with available cipher algorithms + * 30 = public key algorithm info function + * 31 = integer with available pubkey algorithms + * version = interface version of the function/pointer + * (currently this is 1 for all functions) + */ +void * +gnupgext_enum_func( int what, int *sequence, int *class, int *vers ) +{ + void *ret; + int i = *sequence; + + do { + if( i >= DIM(func_table) || i < 0 ) { + return NULL; + } + *class = func_table[i].class; + *vers = func_table[i].version; + switch( *class ) { + case 11: + case 21: + case 31: + ret = &func_table[i].value; + break; + default: + ret = func_table[i].func; + break; + } + i++; + } while( what && what != *class ); + + *sequence = i; + return ret; +} ----------------------------------------------------------------------- Summary of changes: cipher/idea.c | 476 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 476 insertions(+), 0 deletions(-) create mode 100644 cipher/idea.c hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 11 18:04:43 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 11 Jan 2012 18:04:43 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-15-gb42bc48 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via b42bc48dfb4b6d4f745eb02d8de4f4dcffdacf48 (commit) from 860861279bc17dd80eecc9631c4ae5d161a335fd (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b42bc48dfb4b6d4f745eb02d8de4f4dcffdacf48 Author: Werner Koch Date: Wed Jan 11 17:06:17 2012 +0100 estream: Avoid printing leading zeroes by %p on 32 bit systems. * common/estream-printf.c (pr_pointer): Synchronize definition of AULONG with its use. diff --git a/common/estream-printf.c b/common/estream-printf.c index 797f9aa..848ff03 100644 --- a/common/estream-printf.c +++ b/common/estream-printf.c @@ -1231,7 +1231,7 @@ pr_pointer (estream_printf_out_t outfnc, void *outfncarg, argspec_t arg, value_t value, size_t *nbytes) { int rc; -#ifdef HAVE_LONG_LONG_INT +#if defined(HAVE_LONG_LONG_INT) && (SIZEOF_UNSIGNED_LONG < SIZEOF_VOID_P) unsigned long long aulong; #else unsigned long aulong; ----------------------------------------------------------------------- Summary of changes: common/estream-printf.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 11 21:11:20 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 11 Jan 2012 21:11:20 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-16-g30ec869 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 30ec869b8c63f1edcc58110ed20b83b0e77248f8 (commit) from b42bc48dfb4b6d4f745eb02d8de4f4dcffdacf48 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 30ec869b8c63f1edcc58110ed20b83b0e77248f8 Author: Werner Koch Date: Wed Jan 11 20:15:47 2012 +0100 gpg: Fix segv with RSA_S keys. * g10/misc.c (pubkey_get_npkey, pubkey_get_nskey) (pubkey_get_nsig, pubkey_get_nenc): Map all RSA algo ids to GCRY_PK_RSA. -- The problem is that Libgcrypt has no more support for the alternate RSA ids and thus if asking for the number of parameters, they will return zero. Now, this leads to packing the key parameters into an opaque MPI but because the algorithm id is actually known to GPG, it assumes valid RSA parameters. An example key with RSA_S is 0x5434509D. diff --git a/g10/misc.c b/g10/misc.c index e0c57a1..c49945a 100644 --- a/g10/misc.c +++ b/g10/misc.c @@ -1377,6 +1377,8 @@ pubkey_get_npkey (int algo) /* All other algorithms match those of Libgcrypt. */ if (algo == GCRY_PK_ELG_E) algo = GCRY_PK_ELG; + else if (is_RSA (algo)) + algo = GCRY_PK_RSA; if (gcry_pk_algo_info (algo, GCRYCTL_GET_ALGO_NPKEY, NULL, &n)) n = 0; @@ -1399,6 +1401,8 @@ pubkey_get_nskey (int algo) /* All other algorithms match those of Libgcrypt. */ if (algo == GCRY_PK_ELG_E) algo = GCRY_PK_ELG; + else if (is_RSA (algo)) + algo = GCRY_PK_RSA; if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NSKEY, NULL, &n )) n = 0; @@ -1419,6 +1423,8 @@ pubkey_get_nsig (int algo) if (algo == GCRY_PK_ELG_E) algo = GCRY_PK_ELG; + else if (is_RSA (algo)) + algo = GCRY_PK_RSA; if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NSIGN, NULL, &n)) n = 0; @@ -1440,6 +1446,8 @@ pubkey_get_nenc (int algo) if (algo == GCRY_PK_ELG_E) algo = GCRY_PK_ELG; + else if (is_RSA (algo)) + algo = GCRY_PK_RSA; if (gcry_pk_algo_info( algo, GCRYCTL_GET_ALGO_NENCR, NULL, &n )) n = 0; ----------------------------------------------------------------------- Summary of changes: g10/misc.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 12 13:15:30 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 12 Jan 2012 13:15:30 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-34-g02f2823 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via 02f282368e6e68ac1c8dffcfd6e772ec4ff356f8 (commit) via 16c90b2175c92c0698172b547b90f5325bb9ab17 (commit) from cb8ebf792e919b1797bf16b6606427d77c45c947 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 02f282368e6e68ac1c8dffcfd6e772ec4ff356f8 Author: Werner Koch Date: Thu Jan 12 12:19:54 2012 +0100 gpg: Remove unused fields from a trust data structure. The functions tdbio_read_record and tdbio_write_record control the actual on-disk format. Thus there is no need to keep reserved fields in the internal data structure. * g10/tdbio.h (struct trust_record): Remove reserved fields. diff --git a/g10/tdbio.h b/g10/tdbio.h index d6af98f..5360ce9 100644 --- a/g10/tdbio.h +++ b/g10/tdbio.h @@ -56,10 +56,7 @@ struct trust_record { byte trust_model; ulong created; /* timestamp of trustdb creation */ ulong nextcheck; /* timestamp of next scheduled check */ - ulong reserved; - ulong reserved2; ulong firstfree; - ulong reserved3; ulong trusthashtbl; } ver; struct { /* free record */ @@ -81,7 +78,7 @@ struct trust_record { } trust; struct { byte namehash[20]; - ulong next; + ulong next; byte validity; byte full_count; byte marginal_count; commit 16c90b2175c92c0698172b547b90f5325bb9ab17 Author: Werner Koch Date: Thu Jan 12 11:47:35 2012 +0100 Typo fixes and comment re-formatting. diff --git a/cipher/rndlinux.c b/cipher/rndlinux.c index fd4fd8e..9d40f47 100644 --- a/cipher/rndlinux.c +++ b/cipher/rndlinux.c @@ -61,8 +61,9 @@ get_entropy_count( int fd ) #endif #endif -/**************** - * Used to open the /dev/random devices (Linux, xBSD, Solaris (if it exists), ...) +/* + * Used to open the /dev/random devices (Linux, xBSD, Solaris (if it + * exists), ...) */ static int open_device( const char *name, int minor ) @@ -82,7 +83,7 @@ open_device( const char *name, int minor ) } -/**************** +/* * Note: Using a level of 0 should never block and better add nothing * to the pool. This is easy to accomplish with /dev/urandom. */ @@ -103,8 +104,8 @@ rndlinux_gather_random( void (*add)(const void*, size_t, int), int requester, fd = fd_random; } else { - /* this will also be used for elve 0 but by using /dev/urandom - * we can be sure that oit will never block. */ + /* This will also be used for level 0. By using /dev/urandom + * we can be sure that it will never block. */ if( fd_urandom == -1 ) fd_urandom = open_device( NAME_OF_DEV_URANDOM, 9 ); fd = fd_urandom; ----------------------------------------------------------------------- Summary of changes: cipher/rndlinux.c | 11 ++++++----- g10/tdbio.h | 5 +---- 2 files changed, 7 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 12 19:06:10 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 12 Jan 2012 19:06:10 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-35-g3a22b62 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via 3a22b622c89ae87c4d557ab71c619803a4fed8ed (commit) from 02f282368e6e68ac1c8dffcfd6e772ec4ff356f8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 3a22b622c89ae87c4d557ab71c619803a4fed8ed Author: Werner Koch Date: Thu Jan 12 18:10:30 2012 +0100 Allow building with the 32 bit mingw-w64 toolchain. * scripts/autogen.sh <--build-w32>: Support i686-w64-mingw32 and use it by default if installed. * keyserver/gpgkeys_ldap.c (my_ldap_start_tls_s): Define macro depending on compiler version. (main): Use new macro. * util/miscutil.c [!HAVE_TIMEGM]: Add prototype for the timegm autoconf replacement function. -- It seems that the LDAP keyserver helper build with the old mingw32 toolchain never worked correctly for LDAPS. The prototype there for ldap_start_tls_s is plainly wrong for Windows. Anyway I included special support so not to break building with the old compiler. diff --git a/keyserver/gpgkeys_ldap.c b/keyserver/gpgkeys_ldap.c index 4536325..3541957 100644 --- a/keyserver/gpgkeys_ldap.c +++ b/keyserver/gpgkeys_ldap.c @@ -66,6 +66,20 @@ #include "util.h" #endif +#if HAVE_W32_SYSTEM +# if !defined(__MINGW64_VERSION_MAJOR) || !defined(__MINGW32_MAJOR_VERSION) + /* This is mingw32 with bogus ldap definitions; i.e. Unix style + LDAP definitions. */ +# define my_ldap_start_tls_s(a,b,c) ldap_start_tls_sA ((a),(b),(c)) +# else + /* Standard Microsoft or mingw64. */ +# define my_ldap_start_tls_s(a,b,c) ldap_start_tls_sA ((a),NULL, NULL,(b),(c)) +# endif +#else /*!W32*/ +# define my_ldap_start_tls_s(a,b,c) ldap_start_tls_s ((a),(b),(c)) +#endif /*!W32*/ + + extern char *optarg; extern int optind; @@ -460,7 +474,7 @@ build_attrs(LDAPMod ***modlist,char *line) case 'R': revoked=1; break; - + case 'd': case 'D': disabled=1; @@ -1043,7 +1057,7 @@ get_key(char *getkey) else { /* short key id */ - + sprintf(search,"(pgpkeyid=%.8s)",getkey); } @@ -1773,12 +1787,12 @@ find_basekeyspacedn(void) } ldap_msgfree(si_res); - } + } return LDAP_SUCCESS; } -static void +static void show_help (FILE *fp) { fprintf (fp,"-h, --help\thelp\n"); @@ -2195,7 +2209,7 @@ main(int argc,char *argv[]) #endif if(err==LDAP_SUCCESS) - err=ldap_start_tls_s(ldap,NULL,NULL); + err = my_ldap_start_tls_s (ldap, NULL, NULL); if(err!=LDAP_SUCCESS) { diff --git a/scripts/autogen.sh b/scripts/autogen.sh index 408f760..9d3e739 100755 --- a/scripts/autogen.sh +++ b/scripts/autogen.sh @@ -56,7 +56,7 @@ if test "$1" = "--build-w32"; then # Locate the cross compiler crossbindir= - for host in i586-mingw32msvc i386-mingw32msvc; do + for host in i686-w64-mingw32 i586-mingw32msvc i386-mingw32msvc; do if ${host}-gcc --version >/dev/null 2>&1 ; then crossbindir=/usr/${host}/bin conf_CC="CC=${host}-gcc" diff --git a/util/miscutil.c b/util/miscutil.c index f82c4d9..f0cbaca 100644 --- a/util/miscutil.c +++ b/util/miscutil.c @@ -31,6 +31,10 @@ #include "util.h" #include "i18n.h" +#ifndef HAVE_TIMEGM +time_t timegm (struct tm *tm); +#endif + #ifdef HAVE_UNSIGNED_TIME_T # define INVALID_TIME_CHECK(a) ((a) == (time_t)(-1)) #else ----------------------------------------------------------------------- Summary of changes: keyserver/gpgkeys_ldap.c | 24 +++++++++++++++++++----- scripts/autogen.sh | 2 +- util/miscutil.c | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 13 02:45:02 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Fri, 13 Jan 2012 02:45:02 +0100 Subject: [git] GnuPG - branch, scd-pin-prompt, created. gnupg-2.1.0beta3-17-g633ea85 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, scd-pin-prompt has been created at 633ea8531e4c12164f481d093936f3a9054d8ad9 (commit) - Log ----------------------------------------------------------------- commit 633ea8531e4c12164f481d093936f3a9054d8ad9 Author: Ben Kibbey Date: Tue Jan 10 22:10:36 2012 -0500 Add user defined pinentry prompts for SCD. This adds scdaemon "OPTION pin-prompt" and "OPTION pin-admin-prompt" along with special escapes to replace in the prompt string to inform the user of a signature count and admin PIN attempts remaining. It also adds another "standard" pinentry escape "|I|" to ignore the default pinentry prompt from gpg-agent and use the supplied 'info' parameter unmodified (cannot be used with other pinentry flags). * agent/divert-scd.c (getpin_cb): Add |I| pinentry flag to ignore the default prompt and use the 'info' parameter as the entire prompt. * scd/app-common.h (PIN_PROMPT_NONE, PIN_SIGN_PROMPT, PIN_ADMIN_PROMPT): New enumeration. (set_pin_prompt): New application callback to set a user-defined pinentry prompt. * scd/app-openpgp.c (verify_a_chv): Expand a user-defined pinentry prompt. (build_enter_admin_pin_prompt): Ditto. (do_change_pin): Ditto. (do_set_pin_prompt): New. * scd/app.c (expand_pin_prompt): New. (app_set_pin_prompt): Ditto. * scd/command.c (set_pinentry_prompt): New. (option_handler): Add option 'pin-prompt' and 'pin-admin-prompt'. (open_card): Set the user-defined pinentry prompts after selecting an application. diff --git a/NEWS b/NEWS index 7d1ae47..f261363 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ Noteworthy changes in version 2.1.0beta4 (unreleased) * GPG now accepts a space separated fingerprint as a user ID. This allows to copy and paste the fingerprint from the key listing. + * New option for SCDAEMON to set a user defined pinentry prompt. + Noteworthy changes in version 2.1.0beta3 (2011-12-20) ----------------------------------------------------- diff --git a/agent/divert-scd.c b/agent/divert-scd.c index f176a6b..a2de217 100644 --- a/agent/divert-scd.c +++ b/agent/divert-scd.c @@ -166,6 +166,8 @@ encode_md_for_card (const unsigned char *digest, size_t digestlen, int algo, 'A' = The PIN is an Admin PIN, SO-PIN or alike. 'P' = The PIN is a PUK (Personal Unblocking Key). 'R' = The PIN is a Reset Code. + 'I' = Ignore using the default prompt and use 'info' as the entire + prompt. Cannot be used with other flags. Example: @@ -185,6 +187,7 @@ getpin_cb (void *opaque, const char *info, char *buf, size_t maxbuf) int newpin = 0; int resetcode = 0; int is_puk = 0; + int ignore = 0; const char *again_text = NULL; const char *prompt = "PIN"; @@ -212,6 +215,8 @@ getpin_cb (void *opaque, const char *info, char *buf, size_t maxbuf) prompt = _("Reset Code"); resetcode = 1; } + else if (*s == 'I') + ignore = 1; } info = ends+1; any_flags = 1; @@ -219,6 +224,9 @@ getpin_cb (void *opaque, const char *info, char *buf, size_t maxbuf) else if (info && *info == '|') log_debug ("pin_cb called without proper PIN info hack\n"); + if (ignore) + any_flags = 0; + /* If BUF has been passed as NULL, we are in keypad mode: The callback opens the popup and immediatley returns. */ if (!buf) @@ -305,8 +313,8 @@ getpin_cb (void *opaque, const char *info, char *buf, size_t maxbuf) } else { - char *desc; - if ( asprintf (&desc, + char *desc = NULL; + if (!ignore && asprintf (&desc, _("Please enter the PIN%s%s%s to unlock the card"), info? " (`":"", info? info:"", diff --git a/scd/app-common.h b/scd/app-common.h index e3d23c2..d954932 100644 --- a/scd/app-common.h +++ b/scd/app-common.h @@ -34,6 +34,12 @@ #define APP_CHANGE_FLAG_RESET 1 #define APP_CHANGE_FLAG_NULLPIN 2 +/* For user defined pinentry prompts. */ +enum { + PIN_PROMPT_NONE = -1, + PIN_SIGN_PROMPT, + PIN_ADMIN_PROMPT, +}; struct app_local_s; /* Defined by all app-*.c. */ @@ -119,6 +125,7 @@ struct app_ctx_s { gpg_error_t (*check_pin) (app_t app, const char *keyidstr, gpg_error_t (*pincb)(void*, const char *, char **), void *pincb_arg); + gpg_error_t (*set_pin_prompt)(app_t app, int which, const char *prompt); } fnc; }; @@ -192,6 +199,7 @@ gpg_error_t app_genkey (app_t app, ctrl_t ctrl, time_t createtime, gpg_error_t (*pincb)(void*, const char *, char **), void *pincb_arg); +gpg_error_t app_set_pin_prompt (app_t app, int which, const char *prompt); gpg_error_t app_get_challenge (app_t app, size_t nbytes, unsigned char *buffer); gpg_error_t app_change_pin (app_t app, ctrl_t ctrl, @@ -201,6 +209,8 @@ gpg_error_t app_change_pin (app_t app, ctrl_t ctrl, gpg_error_t app_check_pin (app_t app, const char *keyidstr, gpg_error_t (*pincb)(void*, const char *, char **), void *pincb_arg); +char *expand_pin_prompt(const char *prompt, const char *prepend, int which, + ...); /*-- app-openpgp.c --*/ diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c index e3a4484..ea3e52e 100644 --- a/scd/app-openpgp.c +++ b/scd/app-openpgp.c @@ -198,6 +198,8 @@ struct app_local_s { rsa_key_format_t format; } keyattr[3]; + char *pin_prompt; /* As set with set_pin_prompt() or a default. */ + char *pin_admin_prompt; }; @@ -242,6 +244,8 @@ do_deinit (app_t app) xfree (app->app_local->pk[i].key); app->app_local->pk[i].read_done = 0; } + xfree (app->app_local->pin_prompt); + xfree (app->app_local->pin_admin_prompt); xfree (app->app_local); app->app_local = NULL; } @@ -1520,19 +1524,41 @@ verify_a_chv (app_t app, if (chvno == 1) { + if (app->app_local->pin_prompt) + { + prompt_buffer = expand_pin_prompt (app->app_local->pin_prompt, "|I|", + PIN_SIGN_PROMPT, sigcount); + if (!prompt_buffer) + return gpg_error_from_syserror (); + } + else + { #define PROMPTSTRING _("||Please enter the PIN%%0A[sigs done: %lu]") - size_t promptsize = strlen (PROMPTSTRING) + 50; + size_t promptsize; - prompt_buffer = xtrymalloc (promptsize); - if (!prompt_buffer) - return gpg_error_from_syserror (); - snprintf (prompt_buffer, promptsize-1, PROMPTSTRING, sigcount); - prompt = prompt_buffer; + promptsize = strlen (PROMPTSTRING) + 50; + prompt_buffer = xtrymalloc (promptsize); + if (!prompt_buffer) + return gpg_error_from_syserror (); + snprintf (prompt_buffer, promptsize-1, PROMPTSTRING, sigcount); #undef PROMPTSTRING + } + + prompt = prompt_buffer; } else - prompt = _("||Please enter the PIN"); - + { + if (app->app_local->pin_prompt) + { + prompt_buffer = expand_pin_prompt (app->app_local->pin_prompt, "|I|", + PIN_PROMPT_NONE, NULL); + if (!prompt_buffer) + return gpg_error_from_syserror (); + prompt = prompt_buffer; + } + else + prompt = _("||Please enter the PIN"); + } if (!opt.disable_keypad && !iso7816_check_keypad (app->slot, ISO7816_VERIFY, &pininfo) ) @@ -1673,11 +1699,21 @@ build_enter_admin_pin_prompt (app_t app, char **r_prompt) { /* TRANSLATORS: Do not translate the "|A|" prefix but keep it at the start of the string. Use %%0A to force a linefeed. */ - prompt = xtryasprintf (_("|A|Please enter the Admin PIN%%0A" - "[remaining attempts: %d]"), remaining); + if (app->app_local->pin_admin_prompt) + prompt = expand_pin_prompt (app->app_local->pin_admin_prompt, "|I|", + PIN_ADMIN_PROMPT, remaining); + else + prompt = xtryasprintf (_("|A|Please enter the Admin PIN%%0A" + "[remaining attempts: %d]"), remaining); } else - prompt = xtrystrdup (_("|A|Please enter the Admin PIN")); + { + if (app->app_local->pin_admin_prompt) + prompt = expand_pin_prompt (app->app_local->pin_admin_prompt, "|I|", + PIN_PROMPT_NONE, NULL); + else + prompt = xtrystrdup (_("|A|Please enter the Admin PIN")); + } if (!prompt) return gpg_error_from_syserror (); @@ -1999,7 +2035,21 @@ do_change_pin (app_t app, ctrl_t ctrl, const char *chvnostr, prompt = promptbuf; } else - prompt = _("||Please enter the PIN"); + { + if (app->app_local->pin_prompt) + { + promptbuf = expand_pin_prompt (app->app_local->pin_prompt, + "|I|", PIN_PROMPT_NONE, NULL); + if (!promptbuf) + { + rc = gpg_error_from_syserror (); + goto leave; + } + prompt = promptbuf; + } + else + prompt = _("||Please enter the PIN"); + } rc = pincb (pincb_arg, prompt, &oldpinvalue); xfree (promptbuf); promptbuf = NULL; @@ -3707,6 +3757,40 @@ parse_algorithm_attribute (app_t app, int keyno) xfree (relptr); } +gpg_error_t +do_set_pin_prompt(app_t app, int which, const char *prompt) +{ + gpg_error_t rc = 0; + char **p = NULL; + + switch (which) + { + case PIN_SIGN_PROMPT: + p = &app->app_local->pin_prompt; + break; + case PIN_ADMIN_PROMPT: + p = &app->app_local->pin_admin_prompt; + break; + default: + break; + } + + if (p) + { + xfree (*p); + *p = NULL; + + if (prompt && *prompt != '-' && *(prompt+1) != 0) + { + *p = xtrystrdup (prompt); + if (!*p) + rc = gpg_error_from_syserror (); + } + } + + return rc; +} + /* Select the OpenPGP application on the card in SLOT. This function must be used before any other OpenPGP application functions. */ gpg_error_t @@ -3850,6 +3934,7 @@ app_select_openpgp (app_t app) app->fnc.decipher = do_decipher; app->fnc.change_pin = do_change_pin; app->fnc.check_pin = do_check_pin; + app->fnc.set_pin_prompt = do_set_pin_prompt; } leave: diff --git a/scd/app.c b/scd/app.c index 76dc8b4..e0b2fe6 100644 --- a/scd/app.c +++ b/scd/app.c @@ -922,6 +922,131 @@ app_genkey (app_t app, ctrl_t ctrl, const char *keynostr, unsigned int flags, return err; } +/* For use with user-defined pinentry prompts that are set with the OPTION + * command. This function is called from an application before a pinentry is + * invoked. It replaces special escape strings in the user-defined 'prompt' + * with a single (for now) value set by the calling function. What data type + * the vararg value is depends on the 'which' parameter and is set in the + * calling function. + * + * The 'prepend' parameter are any pinentry flags to be prepended to the + * expanded prompt. These flags, if any, are not set by the user-defined + * prompt but the calling function. In most cases it will be NULL or "|I|". + * + * The following expandos are recognized: + * + * expando | which | description + * ---------------------------------------- + * PIN_PROMPT_NONE NOP. The user-defined prompt is returned along + * with any 'prepend' parameter. + * |S| PIN_SIGN_PROMPT signature count (unsigned long) + * |A| PIN_ADMIN_PROMPT remaining attempts (int) + * + * The following example shows the default pinentry prompt when no + * user-defined prompt is set: + * + * "Please enter the PIN%%0A[sigs done: |S|]" + * + * Here, |S| is expanded to the number of signatures created so far. + */ +char * +expand_pin_prompt(const char *prompt, const char *prepend, int which, ...) +{ + va_list ap; + size_t len, n; + char *buf; + unsigned long luval; + int intval; + char valuebuf[50] = {0}; + char *p, *token = NULL, *tokenp; + + if (!prompt) + return NULL; + + len = strlen (prompt); + len += prepend ? strlen (prepend) : 0; + va_start (ap, which); + + switch (which) + { + /* Signature count. */ + case PIN_SIGN_PROMPT: + luval = va_arg (ap, unsigned long); + snprintf (valuebuf, sizeof (valuebuf), "%lu", luval); + token = "|S|"; + break; + /* Pin tries remaining. */ + case PIN_ADMIN_PROMPT: + intval = va_arg (ap, int); + snprintf (valuebuf, sizeof (valuebuf), "%i", intval); + token = "|A|"; + break; + default: + break; + } + + va_end (ap); + + if (!token) + { + if (prepend) + { + len = strlen (prepend)+strlen (prompt)+1; + p = xtrymalloc (len); + if (!p) + return NULL; + + snprintf (p, len, "%s%s", prepend, prompt); + return p; + } + + return xtrystrdup (prompt); + } + + len += strlen (valuebuf)+1; + buf = xtrymalloc (len); + if (!buf) + return NULL; + + buf[0] = 0; + if (prepend) + strcpy (buf, prepend); + + strcat (buf, prompt); + + if (prepend) + p = buf+strlen (prepend); + else + p = buf; + + tokenp = strstr (p, token); + if (!tokenp) + return buf; + + p = tokenp+strlen (token); + len -= strlen (token)+1; + memmove(&buf[len-strlen (p)], p, strlen (p)); + + for (n = 0; valuebuf[n]; n++) + *tokenp++ = valuebuf[n]; + + buf[len] = 0; + return buf; +} + +/* Set the prompt shown in the pinentry dialog. If not set then a default will + * be used. */ +gpg_error_t +app_set_pin_prompt(app_t app, int which, const char *prompt) +{ + if (!app) + return gpg_error (GPG_ERR_INV_VALUE); + + if (!app->fnc.set_pin_prompt) + return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + + return app->fnc.set_pin_prompt (app, which, prompt); +} /* Perform a GET CHALLENGE operation. This fucntion is special as it directly accesses the card without any application specific diff --git a/scd/command.c b/scd/command.c index 88f8ec2..2704e57 100644 --- a/scd/command.c +++ b/scd/command.c @@ -139,6 +139,13 @@ struct server_local_s this session. */ int stopme; + /* User-defined pinentry prompt strings. Needed both here and in the app + * since they may be set by the user before an app is selected with + * select_application(). They are copied to the app when + * select_application() succeeds and further modifications done in the app. + * */ + char *pin_prompt; + char *pin_admin_prompt; }; @@ -387,6 +394,39 @@ reset_notify (assuan_context_t ctx, char *line) return 0; } +static gpg_error_t +set_pinentry_prompt(struct server_local_s *srv, int which, const char *prompt) +{ + gpg_error_t rc = 0; + char **p = NULL; + + switch (which) + { + case PIN_SIGN_PROMPT: + p = &srv->pin_prompt; + break; + case PIN_ADMIN_PROMPT: + p = &srv->pin_admin_prompt; + break; + default: + break; + } + + if (p) + { + xfree (*p); + *p = NULL; + + if (prompt && *prompt != '-' && *(prompt+1) != 0) + { + *p = xtrystrdup (prompt); + if (!*p) + rc = gpg_error_from_syserror (); + } + } + + return rc; +} static gpg_error_t option_handler (assuan_context_t ctx, const char *key, const char *value) @@ -407,6 +447,22 @@ option_handler (assuan_context_t ctx, const char *key, const char *value) ctrl->server_local->event_signal = i; #endif } + /* A user-defined prompt to show in a pinentry overriding the default. See + * app.c:expand_pin_prompt() for details. */ + else if (!strcmp (key, "pin-prompt")) + { + if (ctrl->app_ctx) + return app_set_pin_prompt (ctrl->app_ctx, PIN_SIGN_PROMPT, value); + else + return set_pinentry_prompt (ctrl->server_local, PIN_SIGN_PROMPT, value); + } + else if (!strcmp (key, "pin-admin-prompt")) + { + if (ctrl->app_ctx) + return app_set_pin_prompt (ctrl->app_ctx, PIN_ADMIN_PROMPT, value); + else + return set_pinentry_prompt (ctrl->server_local, PIN_ADMIN_PROMPT, value); + } return 0; } @@ -523,7 +579,17 @@ open_card (ctrl_t ctrl, const char *apptype) err = gpg_error (GPG_ERR_CARD); } else - err = select_application (ctrl, slot, apptype, &ctrl->app_ctx); + { + err = select_application (ctrl, slot, apptype, &ctrl->app_ctx); + if (!err) + { + err = app_set_pin_prompt(ctrl->app_ctx, PIN_SIGN_PROMPT, + ctrl->server_local->pin_prompt); + if (!err) + err = app_set_pin_prompt(ctrl->app_ctx, PIN_ADMIN_PROMPT, + ctrl->server_local->pin_admin_prompt); + } + } } TEST_CARD_REMOVAL (ctrl, err); @@ -2097,6 +2163,8 @@ scd_command_handler (ctrl_t ctrl, int fd) sl->next_session = ctrl->server_local->next_session; } stopme = ctrl->server_local->stopme || reader_disabled; + xfree (ctrl->server_local->pin_prompt); + xfree (ctrl->server_local->pin_admin_prompt); xfree (ctrl->server_local); ctrl->server_local = NULL; ----------------------------------------------------------------------- hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Sat Jan 14 17:29:08 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Sat, 14 Jan 2012 17:29:08 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-17-g4f21f8d Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 4f21f8d6e109eae111d2da91f4c946afda4174e4 (commit) from 30ec869b8c63f1edcc58110ed20b83b0e77248f8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4f21f8d6e109eae111d2da91f4c946afda4174e4 Author: Ben Kibbey Date: Sat Jan 14 09:57:31 2012 -0500 Fix scdaemon pinentry inquire cancelation. Similar to commit 29af488 but also fixes PKDECRYPT and PKSIGN. * agent/call-scd.c (agent_card_pkdecrypt): Check for GPG_ERR_CANCELED when returning from the PKDECRYPT operation of scdaemon and cancel the inquire. (agent_card_pksign): Ditto. (cancel_inquire): New. diff --git a/agent/call-scd.c b/agent/call-scd.c index deff294..1d73210 100644 --- a/agent/call-scd.c +++ b/agent/call-scd.c @@ -809,6 +809,28 @@ hash_algo_option (int algo) } +static gpg_error_t cancel_inquire(ctrl_t ctrl, gpg_error_t rc) +{ + gpg_error_t oldrc = rc; + + /* The inquire callback was called and transact returned a + cancel error. We assume that the inquired process sent a + CANCEL. The passthrough code is not able to pass on the + CANCEL and thus scdaemon would stuck on this. As a + workaround we send a CANCEL now. */ + rc = assuan_write_line (ctrl->scd_local->ctx, "CAN"); + if (!rc) { + char *line; + size_t len; + + rc = assuan_read_line (ctrl->scd_local->ctx, &line, &len); + if (!rc) + rc = oldrc; + } + + return rc; +} + /* Create a signature using the current card. MDALGO is either 0 or gives the digest algorithm. */ int @@ -861,6 +883,9 @@ agent_card_pksign (ctrl_t ctrl, membuf_data_cb, &data, inq_needpin, &inqparm, NULL, NULL); + if (inqparm.any_inq_seen && gpg_err_code(rc) == GPG_ERR_CANCELED) + rc = cancel_inquire (ctrl, rc); + if (rc) { xfree (get_membuf (&data, &len)); @@ -937,6 +962,9 @@ agent_card_pkdecrypt (ctrl_t ctrl, membuf_data_cb, &data, inq_needpin, &inqparm, NULL, NULL); + if (inqparm.any_inq_seen && gpg_err_code(rc) == GPG_ERR_CANCELED) + rc = cancel_inquire (ctrl, rc); + if (rc) { xfree (get_membuf (&data, &len)); @@ -1185,22 +1213,7 @@ agent_card_scd (ctrl_t ctrl, const char *cmdline, inq_needpin, &inqparm, pass_status_thru, assuan_context); if (inqparm.any_inq_seen && gpg_err_code(rc) == GPG_ERR_ASS_CANCELED) - { - /* The inquire callback was called and transact returned a - cancel error. We assume that the inquired process sent a - CANCEL. The passthrough code is not able to pass on the - CANCEL and thus scdaemon would stuck on this. As a - workaround we send a CANCEL now. */ - rc = assuan_write_line(ctrl->scd_local->ctx, "CAN"); - if (!rc) { - char *line; - size_t len; - - rc = assuan_read_line(ctrl->scd_local->ctx, &line, &len); - if (!rc) - rc = gpg_error(GPG_ERR_ASS_CANCELED); - } - } + rc = cancel_inquire (ctrl, rc); assuan_set_flag (ctrl->scd_local->ctx, ASSUAN_CONVEY_COMMENTS, saveflag); if (rc) ----------------------------------------------------------------------- Summary of changes: agent/call-scd.c | 45 +++++++++++++++++++++++++++++---------------- 1 files changed, 29 insertions(+), 16 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Sun Jan 15 13:33:24 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sun, 15 Jan 2012 13:33:24 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-18-g75a402f Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 75a402fc25e4ec9659723dd58306aff3415736f4 (commit) from 4f21f8d6e109eae111d2da91f4c946afda4174e4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 75a402fc25e4ec9659723dd58306aff3415736f4 Author: Werner Koch Date: Sun Jan 15 12:37:33 2012 +0100 Fix indentation. diff --git a/agent/call-scd.c b/agent/call-scd.c index 1d73210..9a6884b 100644 --- a/agent/call-scd.c +++ b/agent/call-scd.c @@ -809,7 +809,8 @@ hash_algo_option (int algo) } -static gpg_error_t cancel_inquire(ctrl_t ctrl, gpg_error_t rc) +static gpg_error_t +cancel_inquire (ctrl_t ctrl, gpg_error_t rc) { gpg_error_t oldrc = rc; ----------------------------------------------------------------------- Summary of changes: agent/call-scd.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 16 12:47:07 2012 From: cvs at cvs.gnupg.org (by Jim Meyering) Date: Mon, 16 Jan 2012 12:47:07 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-20-g4402dc3 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 4402dc3f0a5c5d0f26ed2ae97f9cda9cf4e695fa (commit) via 37801918cb916ae8c641e003f204dcc70cccb29c (commit) from 75a402fc25e4ec9659723dd58306aff3415736f4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4402dc3f0a5c5d0f26ed2ae97f9cda9cf4e695fa Author: Jim Meyering Date: Sat Jan 14 22:34:58 2012 +0100 yat2m: don't dereference pointer to freed memory * doc/yat2m.c (top_parse_file): Correct macrolist-freeing loop. diff --git a/doc/yat2m.c b/doc/yat2m.c index aaa7ea6..a22176c 100644 --- a/doc/yat2m.c +++ b/doc/yat2m.c @@ -1203,10 +1203,10 @@ top_parse_file (const char *fname, FILE *fp) if not in a section. */ while (macrolist) { - macro_t m = macrolist->next; - free (m->value); - free (m); - macrolist = m; + macro_t next = macrolist->next; + free (macrolist->value); + free (macrolist); + macrolist = next; } parse_file (fname, fp, §ion_name, 0); commit 37801918cb916ae8c641e003f204dcc70cccb29c Author: Jim Meyering Date: Sat Jan 14 22:20:39 2012 +0100 gpg-agent: fix lc-messages handling not to change Xauthority setting * agent/gpg-agent.c (main): Supply omitted "break" statement for lc-messages option. Otherwise, control would fall through to the following oXauthority case and use the same value there. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 63f4ba2..c264ba3 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -817,6 +817,7 @@ main (int argc, char **argv ) case oTTYtype: default_ttytype = xstrdup (pargs.r.ret_str); break; case oLCctype: default_lc_ctype = xstrdup (pargs.r.ret_str); break; case oLCmessages: default_lc_messages = xstrdup (pargs.r.ret_str); + break; case oXauthority: default_xauthority = xstrdup (pargs.r.ret_str); break; ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 1 + doc/yat2m.c | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Mon Jan 16 19:41:19 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Mon, 16 Jan 2012 19:41:19 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-40-geb1c9a4 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via eb1c9a44c352ded1bcb9316f5fa0752b61abbb10 (commit) via 9b16cd09d127a46f8772a2a2ec426767356d1ae2 (commit) via 81839d286137b9804aa2f5b943b51663f3c172b6 (commit) from cfb193a1de2f0553ee65a19a417a885938539225 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit eb1c9a44c352ded1bcb9316f5fa0752b61abbb10 Author: Werner Koch Date: Mon Jan 16 18:45:09 2012 +0100 w32: Always build with -fno-omit-frame-pointer. This is required due to a bug in the mingw32 runtime. * configure.ac (HAVE_W32_SYSTEM): Force use of -fno-omit-frame-pointer. diff --git a/configure.ac b/configure.ac index ad08c23..1a0c58a 100644 --- a/configure.ac +++ b/configure.ac @@ -594,6 +594,14 @@ case "${host}" in agent_support=no use_simple_gettext=yes have_w32_system=yes + # gcc 4.6 uses by default -fomit-frame-pointer. This + # conflicts with mingw runtime's setjmp/longjmp usage. The + # actual bug we notice is a segv related to the dlopened + # iconv.dll: After returning from set_native_charset the stack + # frame is corrupt. + if test -n "$GCC" ; then + CFLAGS="$CFLAGS -fno-omit-frame-pointer" + fi ;; i?86-emx-os2 | i?86-*-os2*emx ) # OS/2 with the EMX environment commit 9b16cd09d127a46f8772a2a2ec426767356d1ae2 Author: Werner Koch Date: Mon Jan 16 18:43:51 2012 +0100 w32: Allow passing a relative name for the tarball * scripts/mk-w32-dist: Prepend PWD to TARBALL. diff --git a/scripts/mk-w32-dist b/scripts/mk-w32-dist index aad2728..eb5e655 100755 --- a/scripts/mk-w32-dist +++ b/scripts/mk-w32-dist @@ -69,10 +69,11 @@ builddir=w32-build-root tarball="$1" patchfile="$2" -if [ ! -f "$tarball" -o "$(echo "$tarball" | head -c 1)" != "/" ]; then - echo "$PGM: tarball does not exist or has no absolute name" >&2 +if [ ! -f "$tarball" ]; then + echo "$PGM: tarball does not exist" >&2 exit 1 fi +[ "$(echo "$tarball" | head -c 1)" != "/" ] && tarball="$(pwd)/$tarball" if [ -n "$patchfile" -a ! -f "$patchfile" ]; then echo "$PGM: patchfile does not exist" >&2 commit 81839d286137b9804aa2f5b943b51663f3c172b6 Author: Werner Koch Date: Mon Jan 16 16:12:24 2012 +0100 Automate W32 installer building. * doc/README.W32: Document new installer build procedure. * scripts/autogen.sh: Pass all args to the installer (regression fix). * scripts/conf-w32/README: Remove from repo. * scripts/conf-w32/bzip2-1.diff: Remove from repo. * scripts/mk-w32-dist: Rewrite. * scripts/w32installer.nsi [WITH_PATCHES]: Use constant patch file name. diff --git a/doc/README.W32 b/doc/README.W32 index 7c9fe9c..8235552 100644 --- a/doc/README.W32 +++ b/doc/README.W32 @@ -101,21 +101,29 @@ directory with the changes relative to the generic version. The source is distributed as a BZIP2 or GZIP compressed tar archive. See the instructions in file README on how to check the integrity of -that file. Wir a properly setup build environment, you unpack the +that file. With a properly setup build environment, you unpack the tarball change to the created directory and run $ ./autogen.sh --build-w32 $ make $ cp g10/gpg*.exe /some_windows_drive/ -Building a version with the installer is a bit more complex and -basically works by creating a top directory, unpacking in that top -directory, switching to the gnupg-1.x.y directory, running -"./autogen.sh --build-w32" and "make", switching back to the top -directory, running a "mkdir dist-w32; mkdir iconv", copying the -required iconv files (iconv.dll, README.iconv, COPYING.LIB) into the -iconv directory, running gnupg-1.x.y/scripts/mk-w32-dist and voila, -the installer package will be available in the dist-w32 directory. +Building a version with the installer requires an install NSIS tool +and a directory with the iconv files. The script mk-w32-dist does the +entire build from the tarball and checks most prerequisites; example: + + $ scripts/mk-w32-dist $(pwd)/gnupg-1.4.3.tar.gz + +If you installed the iconv files in a non-standard place you may use + + $ scripts/mk-w32-dist --iconv-dir /foo/bar/ $(pwd)/gnupg-1.4.3.tar.gz + +If you need to patch the standard tarball, you can supply a patch file: + + $ scripts/mk-w32-dist $(pwd)/gnupg-1.4.3.tar.gz mypatches + +That patch file will then be part of the installer. + Copying: @@ -123,8 +131,9 @@ Copying: GnuPG is - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009, + 2010, 2012 Free Software Foundation, Inc. GnuPG is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -145,7 +154,7 @@ information and bug reporting addresses pertaining to GnuPG. For copying conditions of the GNU LIBICONV library see the file README.iconv. - + The installer software used to create the official binary packages for W32 is NSIS (http://nsis.sourceforge.net/): diff --git a/scripts/autogen.sh b/scripts/autogen.sh index a60f3cf..d820696 100755 --- a/scripts/autogen.sh +++ b/scripts/autogen.sh @@ -94,7 +94,7 @@ if test "$1" = "--build-w32"; then fi [ $DIE = yes ] && exit 1 - $tsdir/configure ${conf_CC} --build=${build} --host=${host} + $tsdir/configure ${conf_CC} --build=${build} --host=${host} \ ${disable_foo_tests} $* exit $? fi diff --git a/scripts/conf-w32/README b/scripts/conf-w32/README deleted file mode 100644 index 12b89c0..0000000 --- a/scripts/conf-w32/README +++ /dev/null @@ -1,2 +0,0 @@ -Files useful for building W32 versions. - diff --git a/scripts/conf-w32/bzip2-1.diff b/scripts/conf-w32/bzip2-1.diff deleted file mode 100644 index 0f15765..0000000 --- a/scripts/conf-w32/bzip2-1.diff +++ /dev/null @@ -1,39 +0,0 @@ -To include support for BZIP2 compression in GunPG for W32, the patch -below should be applied to a stock bzip2-1.0.6 source. The Build as -usual using the mingw32 cross compiler package from Debian and install -the library and header file on top of the cross compiler installation -(/usr/i586-mingw32msvc/lib/). Note that for ease of maintenance we -don't use a DLL. [wk 2005-03-14] - - -diff -u orig/bzip2-1.0.2/Makefile bzip2-1.0.2/Makefile ---- orig/bzip2-1.0.2/Makefile 2002-01-26 00:34:53.000000000 +0100 -+++ bzip2-1.0.2/Makefile 2004-11-03 14:10:45.000000000 +0100 -@@ -2,9 +2,9 @@ - SHELL=/bin/sh - - # To assist in cross-compiling --CC=gcc --AR=ar --RANLIB=ranlib -+CC=i586-mingw32msvc-gcc -+AR=i586-mingw32msvc-ar -+RANLIB=i586-mingw32msvc-ranlib - LDFLAGS= - - # Suitably paranoid flags to avoid bugs in gcc-2.7 -diff -u orig/bzip2-1.0.2/bzlib.h bzip2-1.0.2/bzlib.h ---- orig/bzip2-1.0.2/bzlib.h 2001-12-30 03:19:45.000000000 +0100 -+++ bzip2-1.0.2/bzlib.h 2004-11-03 14:32:41.000000000 +0100 -@@ -113,7 +114,7 @@ - /* Need a definitition for FILE */ - #include - --#ifdef _WIN32 -+#if defined( _WIN32 ) && 0 - # include - # ifdef small - /* windows.h define small to char */ - - - diff --git a/scripts/mk-w32-dist b/scripts/mk-w32-dist index cd4a4cb..aad2728 100755 --- a/scripts/mk-w32-dist +++ b/scripts/mk-w32-dist @@ -1,6 +1,7 @@ #!/bin/sh # -# Copyright (C) 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2000, 2001, 2002, 2004, 2005, +# 2012 Free Software Foundation, Inc. # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -11,30 +12,9 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. set -e -cd dist-w32 - -tmp="`echo $0 | sed 's,.*gnupg-\([^/]*\)/.*,\1,'`" - -topdir= -bindir=.. - -if [ -f "../gnupg-$tmp/README" ]; then - srcdir="../gnupg-$tmp" - bindir="../gnupg-$tmp" - topdir=".." -elif [ -f ../README ]; then - srcdir=.. -elif [ -f ../../README ]; then - srcdir=../.. - bindir=.. -elif [ -f ../../gnupg-stable/README ]; then - srcdir=../../gnupg-stable -elif [ -f ../../../gnupg-stable/README ]; then - srcdir=../../../gnupg-stable -else - echo "cannot figure out the source dir" >&2 - exit 1 -fi + +PGM="mk-w32-dist" +[ -z "$w32root" ] && w32root="$HOME/w32root" # Windows uses an internal build number. We use the last day of the # year concatenated with the hour. for it. If it happens that a new @@ -43,24 +23,112 @@ fi # of days. if [ "$1" = "--build-number" -a -n "$2" ]; then build_number="$2" - shift + shift shift else build_number=$(date -u '+%j%H' | sed 's/^0*\(.*\)/\1/') fi +if [ "$1" = "--iconv-dir" -a -n "$2" ]; then + iconvdir="$2" + shift + shift +else + iconvdir="${w32root}/share/gnupg-1-extra/iconv" +fi + +if [ $# -lt 1 -o $# -gt 2 -o "$1" = "--help" ]; then + echo "usage: $PGM [options] TARBALL [PATCHFILE]" >&2 + echo " Options:" >&2 + echo " --build-number N Windows build number" >&2 + echo " --iconv-dir DIR Directory with inconv files" >&2 + exit 1 +fi + + +if [ ! -d "$iconvdir" ]; then + echo "$PGM: iconv directory does not exists (use option --iconv-dir)" >&2 + exit 1 +fi +( set +e + cd "${iconvdir}" + cat </dev/null +44f7289042b71631acac29b2f143330d2da2479e COPYING.LIB +3f4262714a3b508cf20428f046d511f7bfb9fd89 README.iconv +a21c860b81ed158e91b2b921b752f48fda6d6f1e iconv.dll +EOF + if [ $? != 0 ]; then + echo "$PGM: iconv files are not available or not correct" >&2 + exit 1 + fi + set -e +) + +here="$(pwd)" +builddir=w32-build-root +tarball="$1" +patchfile="$2" + +if [ ! -f "$tarball" -o "$(echo "$tarball" | head -c 1)" != "/" ]; then + echo "$PGM: tarball does not exist or has no absolute name" >&2 + exit 1 +fi -if i586-mingw32msvc-strip --version >/dev/null 2>&1 ; then +if [ -n "$patchfile" -a ! -f "$patchfile" ]; then + echo "$PGM: patchfile does not exist" >&2 + exit 1 +fi + +if ! makensis -version >/dev/null 2>&1 ; then + echo "$PGM: error: makensis is not installed" >&2 + exit 1 +fi + + +if i686-w64-mingw32-strip --version >/dev/null 2>&1 ; then + STRIP=i686-w64-mingw32-strip +elif i586-mingw32msvc-strip --version >/dev/null 2>&1 ; then STRIP=i586-mingw32msvc-strip else - STRIP="mingw32 strip" + echo "$PGM: error: strip tool not found" >&2 + exit 1 fi -# If we don't have an installer we don't need to prepare for it. -if ! makensis -version >/dev/null 2>&1 ; then - topdir= +echo "tarball: $tarball" >&2 +version="$(echo "$tarball" | sed 's,.*/gnupg-\(.*\)\.tar\.gz$,\1,')" +prod_version=$(echo "$version"|awk -F'[^0-9]' '{print $1 "." $2 "." $3 }') +prod_version="${prod_version}.${build_number}" +echo "version: $version ($prod_version)" >&2 + +[ -n "$patchfile" ] && echo "patchfile: $patchfile" >&2 +echo "workdir: $builddir" >&2 + +echo "preparing work directory ..." >&2 +[ -d "$builddir" ] && rm -rf "$builddir" +mkdir "$builddir" +cd "$builddir" +mkdir dist-w32 + +echo "unpacking tarball ..." >&2 +tar xzf "$tarball" +cd gnupg-"$version" + +if [ -n "$patchfile" ]; then + echo "applying patchfile ..." >&2 + patch -p1 -t < "$patchfile" fi +echo "running configure ..." >&2 +./autogen.sh --build-w32 --silent + +echo "running make ..." >&2 +make -s + + +cd ../dist-w32 +srcdir="../gnupg-$version" +bindir="../gnupg-$version" + # A function to return a plain ASCII (or Latin-1) encoded description # text for a language identifier. We need this to display the list of @@ -103,30 +171,18 @@ get_langname () { echo "$r" } - -# Figure out the version -version=$(sed -n 's/^#[ ]*define[ ][ ]*VERSION[ ][ ]*\"\([0-9.a-z-]*\)\"/\1/p' $bindir/config.h) -prod_version=$(echo "$version"|awk -F'[^0-9]' '{print $1 "." $2 "." $3 }') -prod_version="${prod_version}.${build_number}" -echo "building version $version ($prod_version)" - -rm * >/dev/null 2>/dev/null || true - +echo "copying files ..." >&2 cp ${bindir}/g10/gpg.exe gpg.exe $STRIP gpg.exe cp ${bindir}/g10/gpgv.exe gpgv.exe $STRIP gpgv.exe -for name in hkp curl ldap finger; do +for name in hkp curl ldap finger; do cp ${bindir}/keyserver/gpgkeys_$name.exe gpgkeys_$name.exe $STRIP gpgkeys_$name.exe done cp ${bindir}/tools/gpgsplit.exe gpgsplit.exe $STRIP gpgsplit.exe -for i in FAQ; do - cp ${bindir}/doc/$i $i.txt - todos $i.txt -done man -Tlatin1 -l ${srcdir}/doc/gpg.1 | sed `printf "s/_\b//g;s/\b.//g"` >gpg.man todos gpg.man man -Tlatin1 -l ${srcdir}/doc/gpgv.1 | sed `printf "s/_\b//g;s/\b.//g"` >gpgv.man @@ -141,15 +197,16 @@ done cp ${srcdir}/doc/README.W32 README-W32.txt todos README-W32.txt -patches_defs= -for i in `find "$topdir/patches" -type f \( -name '*.diff' -o -name '*.tar.gz' \)`; do - cp $i . +if [ -n "$patchfile" ]; then + echo "copying patch file ..." >&2 + cp $patchfile patches.diff patches_defs="-DWITH_PATCHES" -done +fi +echo "converting MO files ..." >&2 # We must distribute the MO files in UTF-8, the conversion is done by -# gpg at runtime. To include English at the right position in the list we +# gpg at runtime. To include English at the right position in the list we # need a special case. langlist="" langdesclist="" @@ -158,15 +215,15 @@ for i in `(ls ${srcdir}/po/*.po; echo ${srcdir}/po/en.po) | sort`; do if [ $lang != "en" ]; then grep -s $lang ${srcdir}/po/LINGUAS >/dev/null || continue [ -f$lang.mo -a $lang.mo -nt $i ] && continue - + fromset=`sed -n '/^"Content-Type:/ s/.*charset=\([a-zA-Z0-9_-]*\).*/\1/p' $i` - case "$fromset" in - utf8|utf-8|UTF8|UTF-8) - echo "$lang: keeping $fromset" >&2 + case "$fromset" in + utf8|utf-8|UTF8|UTF-8) + echo "$lang: keeping $fromset" >&2 msgfmt --output-file=$lang.mo $i ;; *) - echo "$lang: converting from $fromset to utf-8" >&2 + echo "$lang: converting from $fromset to utf-8" >&2 iconv --silent --from-code=$fromset --to-code=utf-8 < $i | \ sed "/^\"Content-Type:/ s/charset=[a-zA-Z0-9_-]*/charset=utf-8/"|\ msgfmt --output-file=$lang.mo - @@ -195,107 +252,26 @@ ListItems="$langdesclist" EOF -# If we have a topdir, assume the full build environment and -# prepare the installer -if [ -n "$topdir" ]; then - winpt_defs= - src_defs= - buildinfo="`date -u '+%Y-%m-%d %H:%M UTC'`" +src_defs= +buildinfo="`date -u '+%Y-%m-%d %H:%M UTC'`" - # iconv.dll is a hard requirement - if [ ! -f "$topdir/iconv/iconv.dll" ]; then - echo "iconv.dll not available" >&2 - exit 1 - fi - ln "$topdir/iconv/iconv.dll" iconv.dll - for i in COPYING.LIB README.iconv; do - cp ${topdir}/iconv/$i $i.txt - todos $i.txt - done - - # WinPT is optional - if [ -f "$topdir/winpt/WinPT.exe" ]; then - ln "$topdir/winpt/WinPT.exe" WinPT.exe - ln "$topdir/winpt/PTD.dll" PTD.dll - cp "$topdir/winpt/README-0.9.txt" README.winpt.txt - cp "$topdir/winpt/NEWS-0.9.txt" NEWS.winpt.txt - cp "$topdir/winpt/keyserver.conf" keyserver.conf - winpt_defs="-DWITH_WINPT" - fi - - # See whether we should include the source and figure out the - # version numbers of the source files. - if [ -d "$topdir/tarballs" ]; then - have_gnupg_src=no - have_libiconv_src=no - have_winpt_src=no - for i in `find "$topdir/tarballs" -type f -name '*.tar.gz'`; do - fname=$(basename "$i" .gz) - zcat "$i" > "$fname" - case "$fname" in - gnupg-*) - tmp=$(echo "$fname" | \ - sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p') - echo "gnupg source version is $tmp" >&2 - if [ "$version" != "$tmp" ]; then - echo "gnupg source version does not match" >&2 - exit 1 - fi - have_gnupg_src=yes - ;; - libiconv-*) - tmp=$(echo "$fname" | \ - sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p') - echo "libiconv source version is $tmp" >&2 - src_defs="$src_defs -DLIBICONV_VERSION=$tmp" - have_libiconv_src=yes - ;; - winpt-*) - tmp=$(echo "$fname" | \ - sed -n 's/^[^-]*-\([0-9.a-z-]*\)\.tar$/\1/p') - echo "winpt source version is $tmp" >&2 - src_defs="$src_defs -DWINPT_VERSION=$tmp" - have_winpt_src=yes - ;; - - *) - echo "WARNING: unknown source file $fname ignored" >&2 - ;; - esac - done - if [ -n "$src_defs" ]; then - if [ $have_gnupg_src = "no" ]; then - echo "gnupg source missing" >&2 - exit 1 - fi - if [ $have_libiconv_src = "no" ]; then - echo "libiconv source missing" >&2 - exit 1 - fi - if [ -n "$winpt_defs" ]; then - if [ $have_winpt_src = "no" ]; then - echo "winpt source missing" >&2 - exit 1 - fi - fi - - src_defs="$src_defs -DWITH_SOURCE" - fi - - fi +echo "copying iconv ..." >&2 +cp "${iconvdir}/iconv.dll" iconv.dll +for i in COPYING.LIB README.iconv; do + cp ${iconvdir}/$i $i.txt + todos $i.txt +done - # Now run the installer - echo "invoking installer as:" - echo makensis -v0 -nocd -DVERSION="${version}" \ - -DPROD_VERSION="${prod_version}" \ - -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \ - ${patches_defs} ${srcdir}/scripts/w32installer.nsi - BUILDINFO=$buildinfo makensis -v0 -nocd -DVERSION="${version}" \ - -DPROD_VERSION="${prod_version}" \ - -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \ - ${patches_defs} ${srcdir}/scripts/w32installer.nsi - echo "Installer created" >&2 -else - zip -9 "gnupg-w32cli-${version}.zip" * - echo "ZIP archive created" >&2 -fi +# Now run the installer +echo "invoking installer as:" +echo makensis -v0 -nocd -DVERSION="${version}" \ + -DPROD_VERSION="${prod_version}" \ + -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \ + ${patches_defs} ${srcdir}/scripts/w32installer.nsi +BUILDINFO=$buildinfo makensis -v0 -nocd -DVERSION="${version}" \ + -DPROD_VERSION="${prod_version}" \ + -DGNUPG_SRCDIR="${srcdir}" ${winpt_defs} ${src_defs} \ + ${patches_defs} ${srcdir}/scripts/w32installer.nsi +mv gnupg-w32cli-${version}.exe "${here}"/ +cd "${here}" +echo "gnupg-w32cli-${version}.exe ready." >&2 diff --git a/scripts/w32installer.nsi b/scripts/w32installer.nsi index c292a0a..f40544d 100644 --- a/scripts/w32installer.nsi +++ b/scripts/w32installer.nsi @@ -68,12 +68,12 @@ Var STARTMENU_FOLDER !define MUI_UNFINISHPAGE_NOAUTOCLOSE ; Remember the installer language -!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" -!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\GnuPG" +!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" +!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\GnuPG" !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" ; ----- -; Pages +; Pages ; ----- !define MUI_WELCOMEPAGE_TEXT "$(T_About)" @@ -96,10 +96,10 @@ Page custom CustomPageOptions !insertmacro MUI_PAGE_DIRECTORY -!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" -!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\GnuPG" +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" +!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\GnuPG" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" - + !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER !insertmacro MUI_PAGE_INSTFILES @@ -110,7 +110,7 @@ Page custom CustomPageOptions !define MUI_FINISHPAGE_LINK_LOCATION "http://www.gnupg.org/" !insertmacro MUI_PAGE_FINISH - + !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES @@ -128,7 +128,7 @@ Page custom CustomPageOptions !insertmacro MUI_RESERVEFILE_LANGDLL !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS -ReserveFile "opt.ini" +ReserveFile "opt.ini" ReserveFile "COPYING.txt" ReserveFile "README-W32.txt" #ReserveFile "${NSISDIR}/Plugins/System.dll" @@ -220,7 +220,6 @@ Section "Documentation" SecDoc File "gpg.man" File "gpgv.man" File "NEWS.txt" - File "FAQ.txt" !ifdef WITH_WINPT File "NEWS.winpt.txt" @@ -228,8 +227,7 @@ Section "Documentation" SecDoc !ifdef WITH_PATCHES SetOutPath "$INSTDIR\Src" - File '*.diff' - File '*.tar.gz' + File 'patches.diff' !endif SectionEnd ; Section Documentation @@ -285,7 +283,7 @@ Section "-Finish" ;; Create Menu entries ;;--------------------- !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - + CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG README.lnk" \ @@ -295,25 +293,25 @@ Section "-Finish" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG NEWS.lnk" \ "$INSTDIR\Doc\NEWS.txt" - SectionGetFlags ${SecDoc} $R0 - IntOp $R0 $R0 & ${SF_SELECTED} - IntCmp $R0 ${SF_SELECTED} 0 +2 + SectionGetFlags ${SecDoc} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} + IntCmp $R0 ${SF_SELECTED} 0 +2 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\GnuPG Manual Page.lnk" \ "$INSTDIR\Doc\gpg.man" !ifdef WITH_WINPT - SectionGetFlags ${SecWinPT} $R0 - IntOp $R0 $R0 & ${SF_SELECTED} - IntCmp $R0 ${SF_SELECTED} 0 no_winpt_menu + SectionGetFlags ${SecWinPT} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} + IntCmp $R0 ${SF_SELECTED} 0 no_winpt_menu CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\winpt.lnk" \ "$INSTDIR\winpt.exe" CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\WinPT README.lnk" \ "$INSTDIR\Doc\README.winpt.txt" - SectionGetFlags ${SecDoc} $R0 - IntOp $R0 $R0 & ${SF_SELECTED} - IntCmp $R0 ${SF_SELECTED} 0 +2 + SectionGetFlags ${SecDoc} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} + IntCmp $R0 ${SF_SELECTED} 0 +2 CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\WinPT NEWS.lnk" \ "$INSTDIR\Doc\NEWS.winpt.txt" @@ -330,17 +328,17 @@ Section "-Finish" ;;----------------- ;; Set the language ;;----------------- - SectionGetFlags ${SecNLS} $R0 - IntOp $R0 $R0 & ${SF_SELECTED} + SectionGetFlags ${SecNLS} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} IntCmp $R0 ${SF_SELECTED} 0 lang_none - + !insertmacro MUI_INSTALLOPTIONS_READ $R0 "opt.ini" "Field 1" "ListItems" DetailPrint "Available languages: $R0" !insertmacro MUI_INSTALLOPTIONS_READ $R1 "opt.ini" "Field 1" "State" DetailPrint "Selected language: $R1" StrCmp $R1 "" lang_none +1 - ${StrStr} $R2 $R0 $R1 + ${StrStr} $R2 $R0 $R1 StrCmp $R2 "" lang_none +1 ${StrTok} $R3 $R2 " " "0" "1" goto lang_set_finish @@ -463,13 +461,13 @@ Function .onInit !insertmacro MUI_INSTALLOPTIONS_EXTRACT "opt.ini" -FunctionEnd +FunctionEnd -Function un.onInit +Function un.onInit !insertmacro MUI_UNGETLANGUAGE - + FunctionEnd @@ -490,19 +488,19 @@ Function PrintNonAdminWarning FunctionEnd -Function CustomPageOptions - SectionGetFlags ${SecNLS} $R0 - IntOp $R0 $R0 & ${SF_SELECTED} - IntCmp $R0 ${SF_SELECTED} show - - Abort - - show: +Function CustomPageOptions + SectionGetFlags ${SecNLS} $R0 + IntOp $R0 $R0 & ${SF_SELECTED} + IntCmp $R0 ${SF_SELECTED} show + + Abort + + show: !insertmacro MUI_HEADER_TEXT "$(T_InstallOptions)" "$(T_SelectLanguage)" !insertmacro MUI_INSTALLOPTIONS_READ $R0 "opt.ini" "Field 1" "ListItems" - ReadRegStr $R1 HKCU "Software\GNU\GnuPG" "Lang" + ReadRegStr $R1 HKCU "Software\GNU\GnuPG" "Lang" StrCmp $R1 "" use_default +1 - ${StrStr} $R2 $R0 "$R1 - " + ${StrStr} $R2 $R0 "$R1 - " StrCmp $R2 "" +1 set_lang use_default: StrCpy $R2 "$(T_langid) - $(T_langname)" ----------------------------------------------------------------------- Summary of changes: configure.ac | 8 + doc/README.W32 | 33 +++-- scripts/autogen.sh | 2 +- scripts/conf-w32/README | 2 - scripts/conf-w32/bzip2-1.diff | 39 ------ scripts/mk-w32-dist | 291 +++++++++++++++++++---------------------- scripts/w32installer.nsi | 74 +++++------ 7 files changed, 200 insertions(+), 249 deletions(-) delete mode 100644 scripts/conf-w32/README delete mode 100644 scripts/conf-w32/bzip2-1.diff hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 19 02:47:43 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Thu, 19 Jan 2012 02:47:43 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-21-gae981dd Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via ae981dd8f454e2a8bbc6429bed5abc5e87cc83d5 (commit) from 4402dc3f0a5c5d0f26ed2ae97f9cda9cf4e695fa (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ae981dd8f454e2a8bbc6429bed5abc5e87cc83d5 Author: Ben Kibbey Date: Tue Jan 17 19:49:10 2012 -0500 Add the INQUIRE_MAXLEN status message. This status message is used to inform the client of the maximum length of an inquired passphrase and is used in pinentry-mode=loopback. * agent/command.c (pinentry_loopback): Send the INQUIRE_MAXLEN status message before doing the inquire. diff --git a/agent/command.c b/agent/command.c index ad86a35..5fa8bce 100644 --- a/agent/command.c +++ b/agent/command.c @@ -2791,6 +2791,12 @@ pinentry_loopback(ctrl_t ctrl, const char *keyword, { gpg_error_t rc; assuan_context_t ctx = ctrl->server_local->assuan_ctx; + char buf[50]; + + snprintf (buf, sizeof (buf), "%u", max_length); + rc = assuan_write_status (ctx, "INQUIRE_MAXLEN", buf); + if (rc) + return rc; assuan_begin_confidential (ctx); rc = assuan_inquire (ctx, keyword, buffer, size, max_length); ----------------------------------------------------------------------- Summary of changes: agent/command.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 19 23:24:29 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Thu, 19 Jan 2012 23:24:29 +0100 Subject: [git] GnuPG - branch, npth-2, updated. gnupg-2.1.0beta3-11-gbaa383a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, npth-2 has been updated via baa383a8d5db9b1458a2994fb0f7523d7a6849b2 (commit) from 709ad62855dfb5dd49da9cdd6d6a02bbf3407a19 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit baa383a8d5db9b1458a2994fb0f7523d7a6849b2 Author: Marcus Brinkmann Date: Thu Jan 19 22:27:44 2012 +0100 Port Windows code to NPTH. * agent/gpg-agent.c (get_agent_ssh_socket_name): Use INVALID_HANDLE_VALUE instead of 0. (handle_signal) [!HAVE_W32_SYSTEM]: Don't define. (handle_connections): Port Windows code to NPTH. * dirmngr/dirmngr.c (handle_connections): Port Windows code to NPTH. * g13/g13.c (handle_connections): Port Windows code to NPTH. * scd/scdaemon.c (handle_connections): Port Windows code to NPTH. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 9f748a7..12d92d0 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1390,9 +1390,9 @@ get_agent_ssh_socket_name (void) void * get_agent_scd_notify_event (void) { - static HANDLE the_event; + static HANDLE the_event = INVALID_HANDLE_VALUE; - if (!the_event) + if (the_event == INVALID_HANDLE_VALUE) { HANDLE h, h2; SECURITY_ATTRIBUTES sa = { sizeof (SECURITY_ATTRIBUTES), NULL, TRUE}; @@ -1716,6 +1716,7 @@ agent_sigusr2_action (void) } +#ifndef HAVE_W32_SYSTEM /* The signal handler for this program. It is expected to be run in its own trhead and not in the context of a signal handler. */ static void @@ -1768,7 +1769,7 @@ handle_signal (int signo) log_info ("signal %d received - no action defined\n", signo); } } - +#endif /* Check the nonce on a new connection. This is a NOP unless we we are using our Unix domain socket emulation under Windows. */ @@ -1848,7 +1849,6 @@ static void handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) { npth_attr_t tattr; - int signo; struct sockaddr_un paddr; socklen_t plen; fd_set fdset, read_fdset; @@ -1859,6 +1859,10 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) struct timespec abstime; struct timespec curtime; struct timespec timeout; +#ifdef HAVE_W32_SYSTEM + HANDLE events[2]; + int events_set; +#endif ret = npth_attr_init(&tattr); /* FIXME: Check error. */ @@ -1878,9 +1882,8 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) sigs = 0; ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo); # else - sigs = 0; - ev = pth_event (PTH_EVENT_HANDLE, get_agent_scd_notify_event ()); - signo = 0; + events[0] = get_agent_scd_notify_event (); + events[1] = INVALID_HANDLE_VALUE; # endif #endif @@ -1928,16 +1931,19 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) } npth_timersub (&abstime, &curtime, &timeout); +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); -#endif +#else + events_set = 0; + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, events, &events_set); + saved_errno = errno; -#if defined(HAVE_W32_SYSTEM) && defined(PTH_EVENT_HANDLE) - if (pth_event_occurred (ev)) + /* This is valid even if npth_eselect returns an error. */ + if (events_set & 1) agent_sigusr2_action (); #endif @@ -2022,7 +2028,7 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) } else { - pthread_t thread; + npth_t thread; agent_init_default_ctrl (ctrl); ctrl->thread_startup.fd = fd; diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index 51cefd5..b0410af 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -1749,9 +1749,6 @@ handle_connections (assuan_fd_t listen_fd) npth_sigev_add (SIGINT); npth_sigev_add (SIGTERM); npth_sigev_fini (); -#else - /* Use a dummy event. */ - sigs = 0; #endif /* Setup the fdset. It has only one member. This is because we use @@ -1791,12 +1788,15 @@ handle_connections (assuan_fd_t listen_fd) } npth_timersub (&abstime, &curtime, &timeout); +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); +#else + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, NULL, NULL); + saved_errno = errno; #endif if (ret == -1 && saved_errno != EINTR) diff --git a/g13/g13.c b/g13/g13.c index 34b91c1..b33ea61 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -854,8 +854,6 @@ idle_task (void *dummy_arg) npth_sigev_add (SIGINT); npth_sigev_add (SIGTERM); npth_sigev_fini (); -#else - sigs = 0; #endif npth_clock_gettime (&abstime); @@ -882,12 +880,15 @@ idle_task (void *dummy_arg) } npth_timersub (&abstime, &curtime, &timeout); +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (0, NULL, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); +#else + ret = npth_eselect (0, NULL, NULL, NULL, &timeout, NULL, NULL); + saved_errno = errno; #endif if (ret == -1 && saved_errno != EINTR) @@ -920,6 +921,7 @@ start_idle_task (void) sigset_t sigs; /* The set of signals we want to catch. */ int err; +#ifndef HAVE_W32_SYSTEM /* These signals should always go to the idle task, so they need to be blocked everywhere else. We assume start_idle_task is called from the main thread before any other threads are created. */ @@ -930,6 +932,7 @@ start_idle_task (void) sigaddset (&sigs, SIGINT); sigaddset (&sigs, SIGTERM); npth_sigmask (SIG_BLOCK, &sigs, NULL); +#endif npth_attr_init (&tattr); npth_attr_setdetachstate (&tattr, NPTH_CREATE_JOINABLE); diff --git a/scd/scdaemon.c b/scd/scdaemon.c index ad5f691..e8073b7 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -1185,9 +1185,6 @@ handle_connections (int listen_fd) npth_sigev_add (SIGINT); npth_sigev_add (SIGTERM); npth_sigev_fini (); -#else - sigs = 0; - ev = pth_event (PTH_EVENT_SIGS, &sigs, &signo); #endif FD_ZERO (&fdset); @@ -1234,17 +1231,20 @@ handle_connections (int listen_fd) thus a simple assignment is fine to copy the entire set. */ read_fdset = fdset; +#ifndef HAVE_W32_SYSTEM ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; -#ifndef HAVE_W32_SYSTEM while (npth_sigev_get_pending(&signo)) handle_signal (signo); +#else + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, NULL, NULL); + saved_errno = errno; #endif if (ret == -1 && saved_errno != EINTR) { - log_error (_("pth_pselect failed: %s - waiting 1s\n"), + log_error (_("npth_pselect failed: %s - waiting 1s\n"), strerror (saved_errno)); npth_sleep (1); continue; ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 30 ++++++++++++++++++------------ dirmngr/dirmngr.c | 8 ++++---- g13/g13.c | 9 ++++++--- scd/scdaemon.c | 10 +++++----- 4 files changed, 33 insertions(+), 24 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 05:31:48 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Fri, 20 Jan 2012 05:31:48 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-42-g561d898 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via 561d89803bd0b1d754f04b1fa9a815cc8cd0fd8b (commit) via f310735975a199f8fde08e7ffeb42412e75daa3c (commit) from eb1c9a44c352ded1bcb9316f5fa0752b61abbb10 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 561d89803bd0b1d754f04b1fa9a815cc8cd0fd8b Merge: f310735 eb1c9a4 Author: David Shaw Date: Thu Jan 19 22:34:45 2012 -0500 Merge branch 'STABLE-BRANCH-1-4' of git+ssh://playfair.gnupg.org/git/gnupg into STABLE-BRANCH-1-4 diff --cc g10/tdbio.h index 81e08fe,5360ce9..39e8cba --- a/g10/tdbio.h +++ b/g10/tdbio.h @@@ -54,13 -54,9 +54,10 @@@ struct trust_record byte completes; byte cert_depth; byte trust_model; + byte min_cert_level; ulong created; /* timestamp of trustdb creation */ ulong nextcheck; /* timestamp of next scheduled check */ - ulong reserved; - ulong reserved2; ulong firstfree; - ulong reserved3; ulong trusthashtbl; } ver; struct { /* free record */ commit f310735975a199f8fde08e7ffeb42412e75daa3c Author: David Shaw Date: Thu Jan 19 22:33:51 2012 -0500 Changes to --min-cert-level should cause a trustdb rebuild (issue 1366) * g10/gpgv.c, g10/trustdb.c (read_trust_options): Add min_cert_level * g10/trustdb.c (check_trustdb_stale): Request a rebuild if pending_check_trustdb is true (set when we detect a trustdb parameter has changed). * g10/keylist.c (public_key_list): Use 'l' in the "tru" with-colons listing for min_cert_level not matching. * g10/tdbio.c (tdbio_update_version_record, create_version_record, tdbio_db_matches_options, tdbio_dump_record, tdbio_read_record, tdbio_write_record): Add a byte for min_cert_level in the tdbio version record. diff --git a/g10/gpgv.c b/g10/gpgv.c index 8d2a8e6..9ee8032 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -1,6 +1,6 @@ /* gpgv.c - The GnuPG signature verify utility * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2006, - * 2009 Free Software Foundation, Inc. + * 2009, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -214,7 +214,8 @@ check_signatures_trust( PKT_signature *sig ) void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth) {} + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level) {} /* Stub: * We don't have the trustdb , so we have to provide some stub functions diff --git a/g10/keylist.c b/g10/keylist.c index 7f72426..6618a7f 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -1,6 +1,6 @@ /* keylist.c * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - * 2008 Free Software Foundation, Inc. + * 2008, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -60,11 +60,11 @@ public_key_list( STRLIST list ) { if(opt.with_colons) { - byte trust_model,marginals,completes,cert_depth; + byte trust_model,marginals,completes,cert_depth,min_cert_level; ulong created,nextcheck; read_trust_options(&trust_model,&created,&nextcheck, - &marginals,&completes,&cert_depth); + &marginals,&completes,&cert_depth,&min_cert_level); printf("tru:"); @@ -80,6 +80,8 @@ public_key_list( STRLIST list ) printf("c"); if(cert_depth!=opt.max_cert_depth) printf("d"); + if(min_cert_level!=opt.min_cert_level) + printf("l"); } printf(":%d:%lu:%lu",trust_model,created,nextcheck); diff --git a/g10/tdbio.c b/g10/tdbio.c index 2732b1b..4f02ff9 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -1,5 +1,5 @@ /* tdbio.c - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -436,6 +436,7 @@ tdbio_update_version_record (void) rec.r.ver.completes = opt.completes_needed; rec.r.ver.cert_depth = opt.max_cert_depth; rec.r.ver.trust_model = opt.trust_model; + rec.r.ver.min_cert_level = opt.min_cert_level; rc=tdbio_write_record(&rec); } @@ -458,6 +459,7 @@ create_version_record (void) rec.r.ver.trust_model = opt.trust_model; else rec.r.ver.trust_model = TM_PGP; + rec.r.ver.min_cert_level = opt.min_cert_level; rec.rectype = RECTYPE_VER; rec.recnum = 0; rc = tdbio_write_record( &rec ); @@ -679,7 +681,8 @@ tdbio_db_matches_options() yes_no = vr.r.ver.marginals == opt.marginals_needed && vr.r.ver.completes == opt.completes_needed && vr.r.ver.cert_depth == opt.max_cert_depth - && vr.r.ver.trust_model == opt.trust_model; + && vr.r.ver.trust_model == opt.trust_model + && vr.r.ver.min_cert_level == opt.min_cert_level; } return yes_no; @@ -1109,13 +1112,14 @@ tdbio_dump_record( TRUSTREC *rec, FILE *fp ) case 0: fprintf(fp, "blank\n"); break; case RECTYPE_VER: fprintf(fp, - "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d nc=%lu (%s)\n", + "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d mcl=%d nc=%lu (%s)\n", rec->r.ver.trusthashtbl, rec->r.ver.firstfree, rec->r.ver.marginals, rec->r.ver.completes, rec->r.ver.cert_depth, rec->r.ver.trust_model, + rec->r.ver.min_cert_level, rec->r.ver.nextcheck, strtimestamp(rec->r.ver.nextcheck) ); @@ -1209,7 +1213,8 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) rec->r.ver.completes = *p++; rec->r.ver.cert_depth = *p++; rec->r.ver.trust_model = *p++; - p += 3; + rec->r.ver.min_cert_level = *p++; + p += 2; rec->r.ver.created = buftoulong(p); p += 4; rec->r.ver.nextcheck = buftoulong(p); p += 4; p += 4; @@ -1296,7 +1301,8 @@ tdbio_write_record( TRUSTREC *rec ) *p++ = rec->r.ver.completes; *p++ = rec->r.ver.cert_depth; *p++ = rec->r.ver.trust_model; - p += 3; + *p++ = rec->r.ver.min_cert_level; + p += 2; ulongtobuf(p, rec->r.ver.created); p += 4; ulongtobuf(p, rec->r.ver.nextcheck); p += 4; p += 4; diff --git a/g10/tdbio.h b/g10/tdbio.h index d6af98f..81e08fe 100644 --- a/g10/tdbio.h +++ b/g10/tdbio.h @@ -1,5 +1,5 @@ /* tdbio.h - Trust database I/O functions - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -54,6 +54,7 @@ struct trust_record { byte completes; byte cert_depth; byte trust_model; + byte min_cert_level; ulong created; /* timestamp of trustdb creation */ ulong nextcheck; /* timestamp of next scheduled check */ ulong reserved; diff --git a/g10/trustdb.c b/g10/trustdb.c index cffbc28..a3fae5d 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -1,6 +1,6 @@ /* trustdb.c * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - * 2008 Free Software Foundation, Inc. + * 2008, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -660,7 +660,8 @@ trustdb_check_or_update(void) void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth) + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level) { TRUSTREC opts; @@ -680,6 +681,8 @@ read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, *completes=opts.r.ver.completes; if(cert_depth) *cert_depth=opts.r.ver.cert_depth; + if(min_cert_level) + *min_cert_level=opts.r.ver.min_cert_level; } /*********************************************** @@ -1045,7 +1048,8 @@ check_trustdb_stale(void) did_nextcheck = 1; scheduled = tdbio_read_nextcheck (); - if (scheduled && scheduled <= make_timestamp ()) + if ((scheduled && scheduled <= make_timestamp ()) + || pending_check_trustdb) { if (opt.no_auto_check_trustdb) { diff --git a/g10/trustdb.h b/g10/trustdb.h index 9eca2c0..3f8bc27 100644 --- a/g10/trustdb.h +++ b/g10/trustdb.h @@ -1,6 +1,6 @@ /* trustdb.h - Trust database * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, - * 2005 Free Software Foundation, Inc. + * 2005, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -71,7 +71,8 @@ void enum_cert_paths_print( void **context, FILE *fp, int refresh, ulong selected_lid ); void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth); + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level); unsigned int get_ownertrust (PKT_public_key *pk); unsigned int get_min_ownertrust (PKT_public_key *pk); ----------------------------------------------------------------------- Summary of changes: g10/gpgv.c | 5 +++-- g10/keylist.c | 8 +++++--- g10/tdbio.c | 16 +++++++++++----- g10/tdbio.h | 3 ++- g10/trustdb.c | 10 +++++++--- g10/trustdb.h | 5 +++-- 6 files changed, 31 insertions(+), 16 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 06:01:07 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Fri, 20 Jan 2012 06:01:07 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.18-9-g333b870 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 333b870929b9f6f65d9b229d301c0b38719da430 (commit) from 27a1e8d62014ba4550b9cfaff9e01267bce60ad5 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 333b870929b9f6f65d9b229d301c0b38719da430 Author: David Shaw Date: Thu Jan 19 22:33:51 2012 -0500 Changes to --min-cert-level should cause a trustdb rebuild (issue 1366) * g10/gpgv.c, g10/trustdb.c (read_trust_options): Add min_cert_level * g10/trustdb.c (check_trustdb_stale): Request a rebuild if pending_check_trustdb is true (set when we detect a trustdb parameter has changed). * g10/keylist.c (public_key_list): Use 'l' in the "tru" with-colons listing for min_cert_level not matching. * g10/tdbio.c (tdbio_update_version_record, create_version_record, tdbio_db_matches_options, tdbio_dump_record, tdbio_read_record, tdbio_write_record): Add a byte for min_cert_level in the tdbio version record. diff --git a/g10/gpgv.c b/g10/gpgv.c index 747b05f..42452b7 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -1,6 +1,6 @@ /* gpgv.c - The GnuPG signature verify utility - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, - * 2006, 2008 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2006, + * 2008, 2009, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -232,7 +232,8 @@ check_signatures_trust( PKT_signature *sig ) void read_trust_options(byte *trust_model, ulong *created, ulong *nextcheck, - byte *marginals, byte *completes, byte *cert_depth) + byte *marginals, byte *completes, byte *cert_depth, + byte *min_cert_level) { (void)trust_model; (void)created; @@ -240,6 +241,7 @@ read_trust_options(byte *trust_model, ulong *created, ulong *nextcheck, (void)marginals; (void)completes; (void)cert_depth; + (void)min_cert_level; } /* Stub: diff --git a/g10/keylist.c b/g10/keylist.c index 4a76ee0..8201260 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -1,6 +1,6 @@ /* keylist.c - print keys * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - * 2008 Free Software Foundation, Inc. + * 2008, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -65,11 +65,11 @@ public_key_list( strlist_t list, int locate_mode ) { if (opt.with_colons) { - byte trust_model,marginals,completes,cert_depth; + byte trust_model,marginals,completes,cert_depth,min_cert_level; ulong created,nextcheck; read_trust_options(&trust_model,&created,&nextcheck, - &marginals,&completes,&cert_depth); + &marginals,&completes,&cert_depth,&min_cert_level); printf("tru:"); @@ -85,6 +85,8 @@ public_key_list( strlist_t list, int locate_mode ) printf("c"); if(cert_depth!=opt.max_cert_depth) printf("d"); + if(min_cert_level!=opt.min_cert_level) + printf("l"); } printf(":%d:%lu:%lu",trust_model,created,nextcheck); diff --git a/g10/tdbio.c b/g10/tdbio.c index 306935c..3e6091c 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -1,5 +1,5 @@ -/* tdbio.c - trust databse I/O operations - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +/* tdbio.c - trust database I/O operations + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -438,6 +438,7 @@ tdbio_update_version_record (void) rec.r.ver.completes = opt.completes_needed; rec.r.ver.cert_depth = opt.max_cert_depth; rec.r.ver.trust_model = opt.trust_model; + rec.r.ver.min_cert_level = opt.min_cert_level; rc=tdbio_write_record(&rec); } @@ -460,6 +461,7 @@ create_version_record (void) rec.r.ver.trust_model = opt.trust_model; else rec.r.ver.trust_model = TM_PGP; + rec.r.ver.min_cert_level = opt.min_cert_level; rec.rectype = RECTYPE_VER; rec.recnum = 0; rc = tdbio_write_record( &rec ); @@ -681,7 +683,8 @@ tdbio_db_matches_options() yes_no = vr.r.ver.marginals == opt.marginals_needed && vr.r.ver.completes == opt.completes_needed && vr.r.ver.cert_depth == opt.max_cert_depth - && vr.r.ver.trust_model == opt.trust_model; + && vr.r.ver.trust_model == opt.trust_model + && vr.r.ver.min_cert_level == opt.min_cert_level; } return yes_no; @@ -1111,13 +1114,14 @@ tdbio_dump_record( TRUSTREC *rec, FILE *fp ) case 0: fprintf(fp, "blank\n"); break; case RECTYPE_VER: fprintf(fp, - "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d nc=%lu (%s)\n", + "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d mcl=%d nc=%lu (%s)\n", rec->r.ver.trusthashtbl, rec->r.ver.firstfree, rec->r.ver.marginals, rec->r.ver.completes, rec->r.ver.cert_depth, rec->r.ver.trust_model, + rec->r.ver.min_cert_level, rec->r.ver.nextcheck, strtimestamp(rec->r.ver.nextcheck) ); @@ -1213,7 +1217,8 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) rec->r.ver.completes = *p++; rec->r.ver.cert_depth = *p++; rec->r.ver.trust_model = *p++; - p += 3; + rec->r.ver.min_cert_level = *p++; + p += 2; rec->r.ver.created = buftoulong(p); p += 4; rec->r.ver.nextcheck = buftoulong(p); p += 4; p += 4; @@ -1300,7 +1305,8 @@ tdbio_write_record( TRUSTREC *rec ) *p++ = rec->r.ver.completes; *p++ = rec->r.ver.cert_depth; *p++ = rec->r.ver.trust_model; - p += 3; + *p++ = rec->r.ver.min_cert_level; + p += 2; ulongtobuf(p, rec->r.ver.created); p += 4; ulongtobuf(p, rec->r.ver.nextcheck); p += 4; p += 4; diff --git a/g10/tdbio.h b/g10/tdbio.h index ddc5afc..b99b491 100644 --- a/g10/tdbio.h +++ b/g10/tdbio.h @@ -1,5 +1,5 @@ /* tdbio.h - Trust database I/O functions - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -54,6 +54,7 @@ struct trust_record { byte completes; byte cert_depth; byte trust_model; + byte min_cert_level; ulong created; /* timestamp of trustdb creation */ ulong nextcheck; /* timestamp of next scheduled check */ ulong reserved; diff --git a/g10/trustdb.c b/g10/trustdb.c index c83e169..fe8b833 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -1,6 +1,6 @@ /* trustdb.c * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - * 2008 Free Software Foundation, Inc. + * 2008, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -656,7 +656,8 @@ trustdb_check_or_update(void) void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth) + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level) { TRUSTREC opts; @@ -676,6 +677,8 @@ read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, *completes=opts.r.ver.completes; if(cert_depth) *cert_depth=opts.r.ver.cert_depth; + if(min_cert_level) + *min_cert_level=opts.r.ver.min_cert_level; } /*********************************************** @@ -1041,7 +1044,8 @@ check_trustdb_stale(void) did_nextcheck = 1; scheduled = tdbio_read_nextcheck (); - if (scheduled && scheduled <= make_timestamp ()) + if ((scheduled && scheduled <= make_timestamp ()) + || pending_check_trustdb) { if (opt.no_auto_check_trustdb) { diff --git a/g10/trustdb.h b/g10/trustdb.h index e2202f3..0a9ce33 100644 --- a/g10/trustdb.h +++ b/g10/trustdb.h @@ -1,6 +1,6 @@ /* trustdb.h - Trust database * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, - * 2005 Free Software Foundation, Inc. + * 2005, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -70,7 +70,8 @@ void enum_cert_paths_print( void **context, FILE *fp, int refresh, ulong selected_lid ); void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth); + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level); unsigned int get_ownertrust (PKT_public_key *pk); unsigned int get_min_ownertrust (PKT_public_key *pk); ----------------------------------------------------------------------- Summary of changes: g10/gpgv.c | 8 +++++--- g10/keylist.c | 8 +++++--- g10/tdbio.c | 18 ++++++++++++------ g10/tdbio.h | 3 ++- g10/trustdb.c | 10 +++++++--- g10/trustdb.h | 5 +++-- 6 files changed, 34 insertions(+), 18 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 12:14:45 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 20 Jan 2012 12:14:45 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-1-4, updated. gnupg-1.4.11-43-g51c1e84 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-1-4 has been updated via 51c1e84265890b26bf3b6ac0b17fb14c58e6e893 (commit) from 561d89803bd0b1d754f04b1fa9a815cc8cd0fd8b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 51c1e84265890b26bf3b6ac0b17fb14c58e6e893 Author: Werner Koch Date: Fri Jan 20 11:08:06 2012 +0100 Do not copy default merge commit log entries into the ChangeLog. * scripts/gitlog-to-changelog: Skip merge commits. diff --git a/scripts/gitlog-to-changelog b/scripts/gitlog-to-changelog index d9f594f..66fb49f 100755 --- a/scripts/gitlog-to-changelog +++ b/scripts/gitlog-to-changelog @@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' if 0; # Convert git log output to ChangeLog format. -my $VERSION = '2011-11-02 07:53'; # UTC +my $VERSION = '2012-01-20 10:14'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook @@ -204,6 +204,7 @@ sub parse_amend_file($) my $prev_date_line = ''; my @prev_coauthors = (); + while (1) { defined (my $in = ) @@ -217,6 +218,10 @@ sub parse_amend_file($) $n_read == $log_nbytes or die "$ME:$.: unexpected EOF\n"; + # Skip log entries with the default merge commit message. + $log =~ /^.*\n\nMerge branch '.*\n\s*/ + and goto SKIPCOMMIT; + # Extract leading hash. my ($sha, $rest) = split ':', $log, 2; defined $sha @@ -328,6 +333,7 @@ sub parse_amend_file($) print "\n", join ("\n", @line), "\n"; } + SKIPCOMMIT: defined ($in = ) or last; $in ne "\n" ----------------------------------------------------------------------- Summary of changes: scripts/gitlog-to-changelog | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 12:19:29 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 20 Jan 2012 12:19:29 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.18-11-g66e9380 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 66e93807a9fc7e72d7a6458711104d32342e4283 (commit) via 4e7ec0bb838623ffb88faee99ba029a8b66b80c0 (commit) from 333b870929b9f6f65d9b229d301c0b38719da430 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 66e93807a9fc7e72d7a6458711104d32342e4283 Author: Werner Koch Date: Fri Jan 20 11:08:06 2012 +0100 Do not copy default merge commit log entries into the ChangeLog. * scripts/gitlog-to-changelog: Skip merge commits. diff --git a/scripts/gitlog-to-changelog b/scripts/gitlog-to-changelog index 40a8035..056b9b7 100755 --- a/scripts/gitlog-to-changelog +++ b/scripts/gitlog-to-changelog @@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' if 0; # Convert git log output to ChangeLog format. -my $VERSION = '2011-11-02 07:53'; # UTC +my $VERSION = '2012-01-20 10:14'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook @@ -201,6 +201,7 @@ sub parse_amend_file($) my $prev_date_line = ''; my @prev_coauthors = (); + while (1) { defined (my $in = ) @@ -214,6 +215,10 @@ sub parse_amend_file($) $n_read == $log_nbytes or die "$ME:$.: unexpected EOF\n"; + # Skip log entries with the default merge commit message. + $log =~ /^.*\n\nMerge branch '.*\n\s*/ + and goto SKIPCOMMIT; + # Extract leading hash. my ($sha, $rest) = split ':', $log, 2; defined $sha @@ -313,6 +318,7 @@ sub parse_amend_file($) print "\n", join ("\n", @line), "\n"; } + SKIPCOMMIT: defined ($in = ) or last; $in ne "\n" commit 4e7ec0bb838623ffb88faee99ba029a8b66b80c0 Author: Werner Koch Date: Fri Jan 20 11:20:55 2012 +0100 Add files to .gitignore diff --git a/.gitignore b/.gitignore index f1afc9c..65141e3 100644 --- a/.gitignore +++ b/.gitignore @@ -141,3 +141,5 @@ tools/mk-tdata tools/symcryptrun tools/watchgnupg tools/gpgtar +/doc/gnupg1.info +/po/gnupg.pot ----------------------------------------------------------------------- Summary of changes: .gitignore | 2 ++ scripts/gitlog-to-changelog | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 12:24:16 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 20 Jan 2012 12:24:16 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-22-g7589e43 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 7589e43b21c8d80c5a57ecb6eb78dfcd0b5dac46 (commit) from ae981dd8f454e2a8bbc6429bed5abc5e87cc83d5 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 7589e43b21c8d80c5a57ecb6eb78dfcd0b5dac46 Author: Werner Koch Date: Fri Jan 20 11:08:06 2012 +0100 Do not copy default merge commit log entries into the ChangeLog. * scripts/gitlog-to-changelog: Skip merge commits. diff --git a/scripts/gitlog-to-changelog b/scripts/gitlog-to-changelog index d9f594f..66fb49f 100755 --- a/scripts/gitlog-to-changelog +++ b/scripts/gitlog-to-changelog @@ -3,7 +3,7 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' if 0; # Convert git log output to ChangeLog format. -my $VERSION = '2011-11-02 07:53'; # UTC +my $VERSION = '2012-01-20 10:14'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook @@ -204,6 +204,7 @@ sub parse_amend_file($) my $prev_date_line = ''; my @prev_coauthors = (); + while (1) { defined (my $in = ) @@ -217,6 +218,10 @@ sub parse_amend_file($) $n_read == $log_nbytes or die "$ME:$.: unexpected EOF\n"; + # Skip log entries with the default merge commit message. + $log =~ /^.*\n\nMerge branch '.*\n\s*/ + and goto SKIPCOMMIT; + # Extract leading hash. my ($sha, $rest) = split ':', $log, 2; defined $sha @@ -328,6 +333,7 @@ sub parse_amend_file($) print "\n", join ("\n", @line), "\n"; } + SKIPCOMMIT: defined ($in = ) or last; $in ne "\n" ----------------------------------------------------------------------- Summary of changes: scripts/gitlog-to-changelog | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 15:24:05 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 20 Jan 2012 15:24:05 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-23-ge97e2ce Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via e97e2ced6cf3ee295a3cc9f8968969a1910380ea (commit) from 7589e43b21c8d80c5a57ecb6eb78dfcd0b5dac46 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e97e2ced6cf3ee295a3cc9f8968969a1910380ea Author: Werner Koch Date: Fri Jan 20 14:27:36 2012 +0100 estream: Fix unclean usage of realloc. * common/estream-printf.c (_ESTREAM_PRINTF_MALLOC): Remove. (_ESTREAM_PRINTF_FREE): Remove. (_ESTREAM_PRINTF_REALLOC): New. (fixed_realloc) [!_ESTREAM_PRINTF_REALLOC]): New. (estream_vasprintf): Use my_printf_realloc instead of my_printf_malloc and my_printf_free. (dynamic_buffer_out): Use my_printf_realloc instead of realloc. -- This bug will never happen in current GnuPG/Libgcrypt because we use the standard memory allocation functions via Libgcrypt. However, when used in other environments it would mess up the heap for an asprintf with an output length larger than ~512 bytes. diff --git a/common/estream-printf.c b/common/estream-printf.c index 848ff03..e50eb7c 100644 --- a/common/estream-printf.c +++ b/common/estream-printf.c @@ -1,5 +1,5 @@ /* estream-printf.c - Versatile mostly C-99 compliant printf formatting - * Copyright (C) 2007, 2008, 2009, 2010 g10 Code GmbH + * Copyright (C) 2007, 2008, 2009, 2010, 2012 g10 Code GmbH * * This file is part of Libestream. * @@ -109,16 +109,11 @@ /* #define DEBUG 1 */ -/* Allow redefinition of asprintf used malloc functions. */ -#if defined(_ESTREAM_PRINTF_MALLOC) -#define my_printf_malloc(a) _ESTREAM_PRINTF_MALLOC((a)) +/* Allow redefinition of asprintf used realloc function. */ +#if defined(_ESTREAM_PRINTF_REALLOC) +#define my_printf_realloc(a,b) _ESTREAM_PRINTF_REALLOC((a),(b)) #else -#define my_printf_malloc(a) malloc((a)) -#endif -#if defined(_ESTREAM_PRINTF_FREE) -#define my_printf_free(a) _ESTREAM_PRINTF_FREE((a)) -#else -#define my_printf_free(a) free((a)) +#define my_printf_realloc(a,b) fixed_realloc((a),(b)) #endif /* A wrapper to set ERRNO. */ @@ -309,6 +304,26 @@ struct valueitem_s }; typedef struct valueitem_s *valueitem_t; + +/* Not all systems have a C-90 compliant realloc. To cope with this + we use this simple wrapper. */ +#ifndef _ESTREAM_PRINTF_REALLOC +static void * +fixed_realloc (void *a, size_t n) +{ + if (!a) + return malloc (n); + + if (!n) + { + free (a); + return NULL; + } + + return realloc (a, n); +} +#endif /*!_ESTREAM_PRINTF_REALLOC*/ + #ifdef DEBUG static void @@ -1762,7 +1777,7 @@ dynamic_buffer_out (void *outfncarg, const char *buf, size_t buflen) char *p; parm->alloced += buflen + 512; - p = realloc (parm->buffer, parm->alloced); + p = my_printf_realloc (parm->buffer, parm->alloced); if (!p) { parm->error_flag = errno ? errno : ENOMEM; @@ -1792,7 +1807,7 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr) parm.error_flag = 0; parm.alloced = 512; parm.used = 0; - parm.buffer = my_printf_malloc (parm.alloced); + parm.buffer = my_printf_realloc (NULL, parm.alloced); if (!parm.buffer) { *bufp = NULL; @@ -1811,7 +1826,8 @@ estream_vasprintf (char **bufp, const char *format, va_list arg_ptr) if (rc == -1) { memset (parm.buffer, 0, parm.used); - my_printf_free (parm.buffer); + if (parm.buffer) + my_printf_realloc (parm.buffer, 0); *bufp = NULL; return -1; } diff --git a/common/estream-printf.h b/common/estream-printf.h index 9b6b838..1aaad78 100644 --- a/common/estream-printf.h +++ b/common/estream-printf.h @@ -1,5 +1,5 @@ /* estream-printf.h - Versatile mostly C-99 compliant printf formatting. - * Copyright (C) 2007, 2010 g10 Code GmbH + * Copyright (C) 2007, 2010, 2012 g10 Code GmbH * * This file is part of Libestream. * @@ -66,12 +66,13 @@ For the implementation of the code (estream-printf.c) the following macros may be used to tune the implementation for certain systems: - #define _ESTREAM_PRINTF_MALLOC foo_malloc - #define _ESTREAM_PRINTF_FREE foo_free + #define _ESTREAM_PRINTF_REALLOC foo_realloc - Make estream_asprintf and estream_vasprintf use foo_malloc and - foo_free instead of the standard malloc and free functions to - allocate the memory returned to the caller. + Make estream_asprintf and estream_vasprintf use foo_realloc + instead of the standard realloc to allocate memory returned to + the caller. Note that foo_realloc needs to be C-90 compliant: + foo_realloc (NULL,n) is the same as a call to malloc(n) and + foo_realloc (a, 0) is the same as a call to free (a). #define _ESTREAM_PRINTF_EXTRA_INCLUDE "foo.h" diff --git a/common/xasprintf.c b/common/xasprintf.c index f16410d..a403c7b 100644 --- a/common/xasprintf.c +++ b/common/xasprintf.c @@ -24,8 +24,8 @@ #include "util.h" #include "iobuf.h" -#if !defined(_ESTREAM_PRINTF_MALLOC) || !defined(_ESTREAM_PRINTF_FREE) -#error Need to define ESTREAM_PRINTF_MALLOC and _FREE +#if !defined(_ESTREAM_PRINTF_REALLOC) +#error Need to define _ESTREAM_PRINTF_REALLOC #endif /* Same as asprintf but return an allocated buffer suitable to be diff --git a/configure.ac b/configure.ac index 9dd555e..ab847af 100644 --- a/configure.ac +++ b/configure.ac @@ -511,8 +511,7 @@ AH_BOTTOM([ /* We want to use the libgcrypt provided memory allocation for asprintf. */ -#define _ESTREAM_PRINTF_MALLOC gcry_malloc -#define _ESTREAM_PRINTF_FREE gcry_free +#define _ESTREAM_PRINTF_REALLOC gcry_realloc #define _ESTREAM_PRINTF_EXTRA_INCLUDE "../common/util.h" /* Under Windows we use the gettext code from libgpg-error. */ ----------------------------------------------------------------------- Summary of changes: common/estream-printf.c | 42 +++++++++++++++++++++++++++++------------- common/estream-printf.h | 13 +++++++------ common/xasprintf.c | 4 ++-- configure.ac | 3 +-- 4 files changed, 39 insertions(+), 23 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 20 23:49:59 2012 From: cvs at cvs.gnupg.org (by David Shaw) Date: Fri, 20 Jan 2012 23:49:59 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-24-gdeee814 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via deee8147aab086161c91e6aa6fb41d7148a630f6 (commit) from e97e2ced6cf3ee295a3cc9f8968969a1910380ea (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit deee8147aab086161c91e6aa6fb41d7148a630f6 Author: David Shaw Date: Thu Jan 19 22:33:51 2012 -0500 Changes to --min-cert-level should cause a trustdb rebuild (issue 1366) * g10/gpgv.c, g10/trustdb.c (read_trust_options): Add min_cert_level * g10/trustdb.c (check_trustdb_stale): Request a rebuild if pending_check_trustdb is true (set when we detect a trustdb parameter has changed). * g10/keylist.c (public_key_list): Use 'l' in the "tru" with-colons listing for min_cert_level not matching. * g10/tdbio.c (tdbio_update_version_record, create_version_record, tdbio_db_matches_options, tdbio_dump_record, tdbio_read_record, tdbio_write_record): Add a byte for min_cert_level in the tdbio version record. diff --git a/g10/gpgv.c b/g10/gpgv.c index 8ca6752..b62ab82 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -1,6 +1,6 @@ /* gpgv.c - The GnuPG signature verify utility - * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, - * 2006, 2008 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2005, 2006, + * 2008, 2009, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -237,7 +237,8 @@ check_signatures_trust( PKT_signature *sig ) void read_trust_options(byte *trust_model, ulong *created, ulong *nextcheck, - byte *marginals, byte *completes, byte *cert_depth) + byte *marginals, byte *completes, byte *cert_depth, + byte *min_cert_level) { (void)trust_model; (void)created; @@ -245,6 +246,7 @@ read_trust_options(byte *trust_model, ulong *created, ulong *nextcheck, (void)marginals; (void)completes; (void)cert_depth; + (void)min_cert_level; } /* Stub: diff --git a/g10/keylist.c b/g10/keylist.c index f6b8cff..cd868bf 100644 --- a/g10/keylist.c +++ b/g10/keylist.c @@ -1,6 +1,6 @@ /* keylist.c - Print information about OpenPGP keys * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - * 2008, 2010 Free Software Foundation, Inc. + * 2008, 2010, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -67,10 +67,10 @@ public_key_list (ctrl_t ctrl, strlist_t list, int locate_mode) if (opt.with_colons) { byte trust_model, marginals, completes, cert_depth; - ulong created, nextcheck; + ulong created, nextcheck, min_cert_level; read_trust_options (&trust_model, &created, &nextcheck, - &marginals, &completes, &cert_depth); + &marginals, &completes, &cert_depth, &min_cert_level); es_fprintf (es_stdout, "tru:"); @@ -86,6 +86,8 @@ public_key_list (ctrl_t ctrl, strlist_t list, int locate_mode) es_fprintf (es_stdout, "c"); if (cert_depth != opt.max_cert_depth) es_fprintf (es_stdout, "d"); + if (min_cert_level != opt.min_cert_level) + es_fprintf (es_stdout, "l"); } es_fprintf (es_stdout, ":%d:%lu:%lu", trust_model, created, nextcheck); diff --git a/g10/tdbio.c b/g10/tdbio.c index 1ab11f2..ef05cf2 100644 --- a/g10/tdbio.c +++ b/g10/tdbio.c @@ -1,5 +1,5 @@ -/* tdbio.c - trust databse I/O operations - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. +/* tdbio.c - trust database I/O operations + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -445,6 +445,7 @@ tdbio_update_version_record (void) rec.r.ver.completes = opt.completes_needed; rec.r.ver.cert_depth = opt.max_cert_depth; rec.r.ver.trust_model = opt.trust_model; + rec.r.ver.min_cert_level = opt.min_cert_level; rc=tdbio_write_record(&rec); } @@ -467,6 +468,7 @@ create_version_record (void) rec.r.ver.trust_model = opt.trust_model; else rec.r.ver.trust_model = TM_PGP; + rec.r.ver.min_cert_level = opt.min_cert_level; rec.rectype = RECTYPE_VER; rec.recnum = 0; rc = tdbio_write_record( &rec ); @@ -713,7 +715,8 @@ tdbio_db_matches_options() yes_no = vr.r.ver.marginals == opt.marginals_needed && vr.r.ver.completes == opt.completes_needed && vr.r.ver.cert_depth == opt.max_cert_depth - && vr.r.ver.trust_model == opt.trust_model; + && vr.r.ver.trust_model == opt.trust_model + && vr.r.ver.min_cert_level == opt.min_cert_level; } return yes_no; @@ -1143,13 +1146,14 @@ tdbio_dump_record( TRUSTREC *rec, FILE *fp ) case 0: fprintf(fp, "blank\n"); break; case RECTYPE_VER: fprintf(fp, - "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d nc=%lu (%s)\n", + "version, td=%lu, f=%lu, m/c/d=%d/%d/%d tm=%d mcl=%d nc=%lu (%s)\n", rec->r.ver.trusthashtbl, rec->r.ver.firstfree, rec->r.ver.marginals, rec->r.ver.completes, rec->r.ver.cert_depth, rec->r.ver.trust_model, + rec->r.ver.min_cert_level, rec->r.ver.nextcheck, strtimestamp(rec->r.ver.nextcheck) ); @@ -1245,7 +1249,8 @@ tdbio_read_record( ulong recnum, TRUSTREC *rec, int expected ) rec->r.ver.completes = *p++; rec->r.ver.cert_depth = *p++; rec->r.ver.trust_model = *p++; - p += 3; + rec->r.ver.min_cert_level = *p++; + p += 2; rec->r.ver.created = buftoulong(p); p += 4; rec->r.ver.nextcheck = buftoulong(p); p += 4; p += 4; @@ -1332,7 +1337,8 @@ tdbio_write_record( TRUSTREC *rec ) *p++ = rec->r.ver.completes; *p++ = rec->r.ver.cert_depth; *p++ = rec->r.ver.trust_model; - p += 3; + *p++ = rec->r.ver.min_cert_level; + p += 2; ulongtobuf(p, rec->r.ver.created); p += 4; ulongtobuf(p, rec->r.ver.nextcheck); p += 4; p += 4; diff --git a/g10/tdbio.h b/g10/tdbio.h index c2434fa..252a393 100644 --- a/g10/tdbio.h +++ b/g10/tdbio.h @@ -1,5 +1,5 @@ /* tdbio.h - Trust database I/O functions - * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -54,6 +54,7 @@ struct trust_record { byte completes; byte cert_depth; byte trust_model; + byte min_cert_level; ulong created; /* timestamp of trustdb creation */ ulong nextcheck; /* timestamp of next scheduled check */ ulong reserved; diff --git a/g10/trustdb.c b/g10/trustdb.c index 006db04..63b03c4 100644 --- a/g10/trustdb.c +++ b/g10/trustdb.c @@ -1,6 +1,6 @@ /* trustdb.c * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, - * 2008 Free Software Foundation, Inc. + * 2008, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -658,7 +658,8 @@ trustdb_check_or_update(void) void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth) + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level) { TRUSTREC opts; @@ -678,6 +679,8 @@ read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, *completes=opts.r.ver.completes; if(cert_depth) *cert_depth=opts.r.ver.cert_depth; + if(min_cert_level) + *min_cert_level=opts.r.ver.min_cert_level; } /*********************************************** @@ -1042,7 +1045,8 @@ check_trustdb_stale(void) did_nextcheck = 1; scheduled = tdbio_read_nextcheck (); - if (scheduled && scheduled <= make_timestamp ()) + if ((scheduled && scheduled <= make_timestamp ()) + || pending_check_trustdb) { if (opt.no_auto_check_trustdb) { diff --git a/g10/trustdb.h b/g10/trustdb.h index e2202f3..0a9ce33 100644 --- a/g10/trustdb.h +++ b/g10/trustdb.h @@ -1,6 +1,6 @@ /* trustdb.h - Trust database * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, - * 2005 Free Software Foundation, Inc. + * 2005, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -70,7 +70,8 @@ void enum_cert_paths_print( void **context, FILE *fp, int refresh, ulong selected_lid ); void read_trust_options(byte *trust_model,ulong *created,ulong *nextcheck, - byte *marginals,byte *completes,byte *cert_depth); + byte *marginals,byte *completes,byte *cert_depth, + byte *min_cert_level); unsigned int get_ownertrust (PKT_public_key *pk); unsigned int get_min_ownertrust (PKT_public_key *pk); ----------------------------------------------------------------------- Summary of changes: g10/gpgv.c | 8 +++++--- g10/keylist.c | 8 +++++--- g10/tdbio.c | 18 ++++++++++++------ g10/tdbio.h | 3 ++- g10/trustdb.c | 10 +++++++--- g10/trustdb.h | 5 +++-- 6 files changed, 34 insertions(+), 18 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 24 04:10:29 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Tue, 24 Jan 2012 04:10:29 +0100 Subject: [git] GnuPG - branch, scd-pin-prompt, updated. gnupg-2.1.0beta3-18-gb5aa197 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, scd-pin-prompt has been updated via b5aa197a5f8d3ad6c484f8cc19e0b4513573a9a3 (commit) from 633ea8531e4c12164f481d093936f3a9054d8ad9 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b5aa197a5f8d3ad6c484f8cc19e0b4513573a9a3 Author: Ben Kibbey Date: Mon Jan 23 20:27:14 2012 -0500 Set both the app and default SCD pin prompt at the same time. Fixes the case when scdaemon prompts for card insertion. * scd/app-openpgp.c (do_set_pin_prompt): Fix indentation. No longer unset the prompt with '-' since the OPTION command without a value does this anyway. * scd/app.c (expand_pin_prompt): Fix indentation. * scd/command.c (set_pinentry_prompt): Set both the default and application prompt when available. diff --git a/scd/app-openpgp.c b/scd/app-openpgp.c index ea3e52e..a5e9807 100644 --- a/scd/app-openpgp.c +++ b/scd/app-openpgp.c @@ -3765,14 +3765,14 @@ do_set_pin_prompt(app_t app, int which, const char *prompt) switch (which) { - case PIN_SIGN_PROMPT: - p = &app->app_local->pin_prompt; - break; - case PIN_ADMIN_PROMPT: - p = &app->app_local->pin_admin_prompt; + case PIN_SIGN_PROMPT: + p = &app->app_local->pin_prompt; + break; + case PIN_ADMIN_PROMPT: + p = &app->app_local->pin_admin_prompt; + break; + default: break; - default: - break; } if (p) @@ -3780,7 +3780,7 @@ do_set_pin_prompt(app_t app, int which, const char *prompt) xfree (*p); *p = NULL; - if (prompt && *prompt != '-' && *(prompt+1) != 0) + if (prompt && *prompt) { *p = xtrystrdup (prompt); if (!*p) diff --git a/scd/app.c b/scd/app.c index e0b2fe6..51bd207 100644 --- a/scd/app.c +++ b/scd/app.c @@ -969,20 +969,20 @@ expand_pin_prompt(const char *prompt, const char *prepend, int which, ...) switch (which) { - /* Signature count. */ - case PIN_SIGN_PROMPT: - luval = va_arg (ap, unsigned long); - snprintf (valuebuf, sizeof (valuebuf), "%lu", luval); - token = "|S|"; - break; - /* Pin tries remaining. */ - case PIN_ADMIN_PROMPT: - intval = va_arg (ap, int); - snprintf (valuebuf, sizeof (valuebuf), "%i", intval); - token = "|A|"; - break; - default: - break; + /* Signature count. */ + case PIN_SIGN_PROMPT: + luval = va_arg (ap, unsigned long); + snprintf (valuebuf, sizeof (valuebuf), "%lu", luval); + token = "|S|"; + break; + /* Pin tries remaining. */ + case PIN_ADMIN_PROMPT: + intval = va_arg (ap, int); + snprintf (valuebuf, sizeof (valuebuf), "%i", intval); + token = "|A|"; + break; + default: + break; } va_end (ap); diff --git a/scd/command.c b/scd/command.c index 2704e57..7b7536b 100644 --- a/scd/command.c +++ b/scd/command.c @@ -395,9 +395,10 @@ reset_notify (assuan_context_t ctx, char *line) } static gpg_error_t -set_pinentry_prompt(struct server_local_s *srv, int which, const char *prompt) +set_pinentry_prompt(ctrl_t ctrl, int which, const char *prompt) { gpg_error_t rc = 0; + struct server_local_s *srv = ctrl->server_local; char **p = NULL; switch (which) @@ -417,7 +418,7 @@ set_pinentry_prompt(struct server_local_s *srv, int which, const char *prompt) xfree (*p); *p = NULL; - if (prompt && *prompt != '-' && *(prompt+1) != 0) + if (prompt && *prompt) { *p = xtrystrdup (prompt); if (!*p) @@ -425,6 +426,9 @@ set_pinentry_prompt(struct server_local_s *srv, int which, const char *prompt) } } + if (!rc && ctrl->app_ctx) + rc = app_set_pin_prompt (ctrl->app_ctx, PIN_SIGN_PROMPT, prompt); + return rc; } @@ -451,17 +455,11 @@ option_handler (assuan_context_t ctx, const char *key, const char *value) * app.c:expand_pin_prompt() for details. */ else if (!strcmp (key, "pin-prompt")) { - if (ctrl->app_ctx) - return app_set_pin_prompt (ctrl->app_ctx, PIN_SIGN_PROMPT, value); - else - return set_pinentry_prompt (ctrl->server_local, PIN_SIGN_PROMPT, value); + return set_pinentry_prompt (ctrl, PIN_SIGN_PROMPT, value); } else if (!strcmp (key, "pin-admin-prompt")) { - if (ctrl->app_ctx) - return app_set_pin_prompt (ctrl->app_ctx, PIN_ADMIN_PROMPT, value); - else - return set_pinentry_prompt (ctrl->server_local, PIN_ADMIN_PROMPT, value); + return set_pinentry_prompt (ctrl, PIN_ADMIN_PROMPT, value); } return 0; ----------------------------------------------------------------------- Summary of changes: scd/app-openpgp.c | 16 ++++++++-------- scd/app.c | 28 ++++++++++++++-------------- scd/command.c | 18 ++++++++---------- 3 files changed, 30 insertions(+), 32 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 24 04:29:13 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Tue, 24 Jan 2012 04:29:13 +0100 Subject: [git] GnuPG - branch, scd-pin-prompt, updated. gnupg-2.1.0beta3-19-gadd0e34 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, scd-pin-prompt has been updated via add0e34babcc6750f4675a8ab3b189b01127116f (commit) from b5aa197a5f8d3ad6c484f8cc19e0b4513573a9a3 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit add0e34babcc6750f4675a8ab3b189b01127116f Author: Ben Kibbey Date: Mon Jan 23 21:26:41 2012 -0500 Fix setting the wrong SCD pin prompt in the app. * scd/command.c (set_pinentry_prompt): Fix typo. diff --git a/scd/command.c b/scd/command.c index 7b7536b..0b82a2b 100644 --- a/scd/command.c +++ b/scd/command.c @@ -427,7 +427,7 @@ set_pinentry_prompt(ctrl_t ctrl, int which, const char *prompt) } if (!rc && ctrl->app_ctx) - rc = app_set_pin_prompt (ctrl->app_ctx, PIN_SIGN_PROMPT, prompt); + rc = app_set_pin_prompt (ctrl->app_ctx, which, prompt); return rc; } ----------------------------------------------------------------------- Summary of changes: scd/command.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 24 18:48:44 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 24 Jan 2012 18:48:44 +0100 Subject: [git] GnuPG - branch, npth-2, updated. gnupg-2.1.0beta3-12-g122d1d1 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, npth-2 has been updated via 122d1d1babf919d491390ad2e3fa8ab8271a19a1 (commit) from baa383a8d5db9b1458a2994fb0f7523d7a6849b2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 122d1d1babf919d491390ad2e3fa8ab8271a19a1 Author: Marcus Brinkmann Date: Tue Jan 24 17:37:01 2012 +0100 Port LDAP wrapper to NPTH. * agent/gpg-agent.c (handle_connections): Handle error. * dirmngr/dirmngr_ldap.c, dirmngr/ldap-wrapper-ce.c: Port to NPTH. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 12d92d0..9bd0c46 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1865,7 +1865,9 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) #endif ret = npth_attr_init(&tattr); - /* FIXME: Check error. */ + if (ret) + log_fatal ("error allocating thread attributes: %s\n", + gpg_strerror (ret)); npth_attr_setdetachstate (&tattr, NPTH_CREATE_DETACHED); #ifndef HAVE_W32_SYSTEM diff --git a/dirmngr/dirmngr_ldap.c b/dirmngr/dirmngr_ldap.c index 166ba4a..f166f19 100644 --- a/dirmngr/dirmngr_ldap.c +++ b/dirmngr/dirmngr_ldap.c @@ -58,13 +58,13 @@ #include "i18n.h" #include "util.h" -/* With the ldap wrapper, there is no need for the pth_enter and leave +/* With the ldap wrapper, there is no need for the npth_unprotect and leave functions; thus we redefine them to nops. If we are not using the ldap wrapper process we need to include the prototype for our module's main function. */ #ifdef USE_LDAPWRAPPER -static void pth_enter (void) { } -static void pth_leave (void) { } +static void npth_unprotect (void) { } +static void npth_protect (void) { } #else # include "./ldap-wrapper.h" #endif @@ -392,9 +392,9 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr) LDAPMessage *item; int any = 0; - for (pth_enter (), item = ldap_first_entry (ld, msg), pth_leave (); + for (npth_unprotect (), item = ldap_first_entry (ld, msg), npth_protect (); item; - pth_enter (), item = ldap_next_entry (ld, item), pth_leave ()) + npth_unprotect (), item = ldap_next_entry (ld, item), npth_protect ()) { BerElement *berctx; char *attr; @@ -414,11 +414,11 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr) } - for (pth_enter (), attr = my_ldap_first_attribute (ld, item, &berctx), - pth_leave (); + for (npth_unprotect (), attr = my_ldap_first_attribute (ld, item, &berctx), + npth_protect (); attr; - pth_enter (), attr = my_ldap_next_attribute (ld, item, berctx), - pth_leave ()) + npth_unprotect (), attr = my_ldap_next_attribute (ld, item, berctx), + npth_protect ()) { struct berval **values; int idx; @@ -455,9 +455,9 @@ print_ldap_entries (my_opt_t myopt, LDAP *ld, LDAPMessage *msg, char *want_attr) } } - pth_enter (); + npth_unprotect (); values = my_ldap_get_values_len (ld, item, attr); - pth_leave (); + npth_protect (); if (!values) { @@ -618,19 +618,19 @@ fetch_ldap (my_opt_t myopt, const char *url, const LDAPURLDesc *ludp) set_timeout (myopt); - pth_enter (); + npth_unprotect (); ld = my_ldap_init (host, port); - pth_leave (); + npth_protect (); if (!ld) { log_error (_("LDAP init to `%s:%d' failed: %s\n"), host, port, strerror (errno)); return -1; } - pth_enter (); + npth_unprotect (); /* Fixme: Can we use MYOPT->user or is it shared with other theeads?. */ ret = my_ldap_simple_bind_s (ld, myopt->user, myopt->pass); - pth_leave (); + npth_protect (); if (ret) { log_error (_("binding to `%s:%d' failed: %s\n"), @@ -640,13 +640,13 @@ fetch_ldap (my_opt_t myopt, const char *url, const LDAPURLDesc *ludp) } set_timeout (myopt); - pth_enter (); + npth_unprotect (); rc = my_ldap_search_st (ld, dn, ludp->lud_scope, filter, myopt->multi && !myopt->attr && ludp->lud_attrs? ludp->lud_attrs:attrs, 0, &myopt->timeout, &msg); - pth_leave (); + npth_protect (); if (rc == LDAP_SIZELIMIT_EXCEEDED && myopt->multi) { if (es_fwrite ("E\0\0\0\x09truncated", 14, 1, myopt->outstream) != 1) diff --git a/dirmngr/ldap-wrapper-ce.c b/dirmngr/ldap-wrapper-ce.c index 9bc5d06..9af70af 100644 --- a/dirmngr/ldap-wrapper-ce.c +++ b/dirmngr/ldap-wrapper-ce.c @@ -106,12 +106,93 @@ struct outstream_cookie_s { int refcount; /* Reference counter - possible values are 1 and 2. */ + /* We don't need a mutex for the conditions, as npth provides a + simpler condition interface that relies on the global lock. This + can be used if we never yield between testing the condition and + waiting on it. */ + npth_cond_t wait_data; /* Condition that data is available. */ + npth_cond_t wait_space; /* Condition that space is available. */ + int eof_seen; /* EOF indicator. */ - size_t buffer_len; /* The valid length of the BUFFER. */ + char buffer[4000]; /* Data ring buffer. */ + size_t buffer_len; /* The amount of data in the BUFFER. */ size_t buffer_pos; /* The next read position of the BUFFER. */ - char buffer[4000]; /* Data buffer. */ }; +#define BUFFER_EMPTY(c) ((c)->buffer_len == 0) +#define BUFFER_FULL(c) ((c)->buffer_len == DIM((c)->buffer)) +#define BUFFER_DATA_AVAILABLE(c) ((c)->buffer_len) +#define BUFFER_SPACE_AVAILABLE(c) (DIM((c)->buffer) - (c)->buffer_len) +#define BUFFER_INC_POS(c,n) (c)->buffer_pos = ((c)->buffer_pos + (n)) % DIM((c)->buffer) +#define BUFFER_CUR_POS(c) (&(c)->buffer[(c)->buffer_pos]) + +static int +buffer_get_data (struct outstream_cookie_s *cookie, char *dst, int cnt) +{ + int amount; + int left; + int chunk; + + amount = cnt; + if (BUFFER_DATA_AVAILABLE (cookie) < amount) + amount = BUFFER_DATA_AVAILABLE (cookie); + left = amount; + + /* How large is the part up to the end of the buffer array? */ + chunk = DIM(cookie->buffer) - cookie->buffer_pos; + if (chunk > left) + chunk = left; + + memcpy (dst, BUFFER_CUR_POS (cookie), chunk); + BUFFER_INC_POS (cookie, chunk); + left -= chunk; + dst += chunk; + + if (left) + { + memcpy (dst, BUFFER_CUR_POS (cookie), left); + BUFFER_INC_POS (cookie, left); + } + + return amount; +} + + +static int +buffer_put_data (struct outstream_cookie_s *cookie, const char *src, int cnt) +{ + int amount; + int remain; + int left; + int chunk; + + remain = DIM(cookie->buffer) - cookie->buffer_len; + + amount = cnt; + if (remain < amount) + amount = remain; + left = amount; + + /* How large is the part up to the end of the buffer array? */ + chunk = DIM(cookie->buffer) - cookie->buffer_pos; + if (chunk > left) + chunk = left; + + memcpy (BUFFER_CUR_POS (cookie), src, chunk); + BUFFER_INC_POS (cookie, chunk); + left -= chunk; + src += chunk; + + if (left) + { + memcpy (BUFFER_CUR_POS (cookie), src, left); + BUFFER_INC_POS (cookie, left); + } + + cookie->buffer_len -= amount; + return amount; +} + /* The writer function for the outstream. This is used to transfer the output of the ldap wrapper thread to the ksba reader object. */ @@ -120,43 +201,42 @@ outstream_cookie_writer (void *cookie_arg, const void *buffer, size_t size) { struct outstream_cookie_s *cookie = cookie_arg; const char *src; - char *dst; ssize_t nwritten = 0; + int res; + ssize_t amount = 0; src = buffer; do { + int was_empty = 0; + /* Wait for free space. */ - while (cookie->buffer_len == DIM (cookie->buffer)) + while (BUFFER_FULL(cookie)) { /* Buffer is full: Wait for space. */ - pth_yield (NULL); + res = npth_cond_wait (&cookie->wait_space, NULL); + if (res) + { + gpg_err_set_errno (res); + return -1; + } } + if (BUFFER_EMPTY(cookie)) + was_empty = 1; + /* Copy data. */ - dst = cookie->buffer + cookie->buffer_len; - while (size && cookie->buffer_len < DIM (cookie->buffer)) - { - *dst++ = *src++; - size--; - cookie->buffer_len++; - nwritten++; - } - } - while (size); /* Until done. */ + nwritten = buffer_put_data (cookie, buffer, size); + size -= nwritten; + src += nwritten; + amount += nwritten; - if (nwritten) - { - /* Signal data is available - a pth_yield is sufficient because - the test is explicit. To increase performance we could do a - pth_yield to the other thread and only fall back to yielding - to any thread if that returns an error (i.e. the other thread - is not runnable). However our w32pth does not yet support - yielding to a specific thread, thus this won't help. */ - pth_yield (NULL); + if (was_empty) + npth_cond_signal (&cookie->wait_data); } + while (size); /* Until done. */ - return nwritten; + return amount; } @@ -165,7 +245,11 @@ outstream_release_cookie (struct outstream_cookie_s *cookie) { cookie->refcount--; if (!cookie->refcount) - xfree (cookie); + { + npth_cond_destroy (&cookie->wait_data); + npth_cond_destroy (&cookie->wait_space); + xfree (cookie); + } } @@ -198,6 +282,7 @@ outstream_reader_cb (void *cb_value, char *buffer, size_t count, char *dst; const char *src; size_t nread = 0; + int was_full = 0; if (!buffer && !count && !r_nread) return gpg_error (GPG_ERR_NOT_SUPPORTED); /* Rewind is not supported. */ @@ -205,31 +290,26 @@ outstream_reader_cb (void *cb_value, char *buffer, size_t count, *r_nread = 0; dst = buffer; - while (cookie->buffer_pos == cookie->buffer_len) + while (BUFFER_EMPTY(cookie)) { if (cookie->eof_seen) return gpg_error (GPG_ERR_EOF); /* Wait for data to become available. */ - pth_yield (NULL); + npth_cond_wait (&cookie->wait_data, NULL); } + if (BUFFER_FULL(cookie)) + was_full = 1; + src = cookie->buffer + cookie->buffer_pos; - while (count && cookie->buffer_pos < cookie->buffer_len) + nread = buffer_get_data (cookie, buffer, count); + + if (was_full) { - *dst++ = *src++; - count--; - cookie->buffer_pos++; - nread++; + npth_cond_signal (&cookie->wait_space); } - if (cookie->buffer_pos == cookie->buffer_len) - cookie->buffer_pos = cookie->buffer_len = 0; - - /* Now there should be some space available. We do this even if - COUNT was zero so to give the writer end a chance to continue. */ - pth_yield (NULL); - *r_nread = nread; return 0; /* Success. */ } @@ -351,10 +431,12 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *r_reader, const char *argv[]) { gpg_error_t err; struct ldap_wrapper_thread_parms *parms; - pth_attr_t tattr; + npth_attr_t tattr; es_cookie_io_functions_t outstream_func = { NULL }; struct outstream_cookie_s *outstream_cookie; ksba_reader_t reader; + int res; + npth_t thread; (void)ctrl; @@ -381,6 +463,22 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *r_reader, const char *argv[]) } outstream_cookie->refcount++; + res = npth_cond_init (&outstream_cookie->wait_data, NULL); + if (res) + { + free_arg_list (parms->arg_list); + xfree (parms); + return gpg_error_from_errno (res); + } + res = npth_cond_init (&outstream_cookie->wait_space, NULL); + if (res) + { + npth_cond_destroy (&outstream_cookie->wait_data); + free_arg_list (parms->arg_list); + xfree (parms); + return gpg_error_from_errno (res); + } + err = ksba_reader_new (&reader); if (!err) err = ksba_reader_set_release_notify (reader, @@ -407,27 +505,37 @@ ldap_wrapper (ctrl_t ctrl, ksba_reader_t *r_reader, const char *argv[]) if (!parms->outstream) { err = gpg_error_from_syserror (); - free_arg_list (parms->arg_list); + ksba_reader_release (reader); outstream_release_cookie (outstream_cookie); + free_arg_list (parms->arg_list); xfree (parms); return err; } outstream_cookie->refcount++; - tattr = pth_attr_new(); - pth_attr_set (tattr, PTH_ATTR_JOINABLE, 0); - pth_attr_set (tattr, PTH_ATTR_STACK_SIZE, 128*1024); - pth_attr_set (tattr, PTH_ATTR_NAME, "ldap-wrapper"); + res = npth_attr_init(&tattr); + if (res) + { + err = gpg_error_from_errno (res); + ksba_reader_release (reader); + free_arg_list (parms->arg_list); + es_fclose (parms->outstream); + xfree (parms); + return err; + } + npth_attr_setdetachstate (&tattr, NPTH_CREATE_DETACHED); - if (pth_spawn (tattr, ldap_wrapper_thread, parms)) - parms = NULL; /* Now owned by the thread. */ - else + res = npth_create (&thread, &tattr, ldap_wrapper_thread, parms); + npth_attr_destroy (&tattr); + if (res) { - err = gpg_error_from_syserror (); + err = gpg_error_from_errno (res); log_error ("error spawning ldap wrapper thread: %s\n", - strerror (errno) ); + strerror (res) ); } - pth_attr_destroy (tattr); + else + parms = NULL; /* Now owned by the thread. */ + if (parms) { free_arg_list (parms->arg_list); ----------------------------------------------------------------------- Summary of changes: agent/gpg-agent.c | 4 +- dirmngr/dirmngr_ldap.c | 34 ++++---- dirmngr/ldap-wrapper-ce.c | 212 ++++++++++++++++++++++++++++++++++----------- 3 files changed, 180 insertions(+), 70 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 24 19:48:40 2012 From: cvs at cvs.gnupg.org (by Marcus Brinkmann) Date: Tue, 24 Jan 2012 19:48:40 +0100 Subject: [git] Assuan - branch, master, updated. libassuan-2.0.3-3-gcef5514 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "IPC library used by GnuPG". The branch, master has been updated via cef55142f2552538714f8296479f58a63d14a239 (commit) from e23e6f2bd49f415f4fdca013e4f61e1b17995a51 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cef55142f2552538714f8296479f58a63d14a239 Author: Marcus Brinkmann Date: Tue Jan 24 18:49:57 2012 +0100 Fix npth port file handle use. * assuan.h.in (ASSUAN_SYSTEM_NPTH_IMPL): Use npth_unprotect and npth_protect with actual assuan functions instead of npth wrappers. * libassuan.def: Add __assuan_read, __assuan_write, __assuan_sendmsg, __assuan_recvmsg, __assuan_waitpid exports. * system-w32.c (__assuan_read, __assuan_write, __assuan_sendmsg, __assuan_recvmsg, __assuan_waitpid): Make non-static. diff --git a/src/assuan.h.in b/src/assuan.h.in index 2e43c81..69a6a9c 100644 --- a/src/assuan.h.in +++ b/src/assuan.h.in @@ -482,6 +482,11 @@ int __assuan_socketpair (assuan_context_t ctx, int _namespace, int style, int protocol, assuan_fd_t filedes[2]); int __assuan_socket (assuan_context_t ctx, int _namespace, int style, int protocol); int __assuan_connect (assuan_context_t ctx, int sock, struct sockaddr *addr, socklen_t length); +ssize_t __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size); +ssize_t __assuan_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, size_t size); +int __assuan_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, int flags); +int __assuan_sendmsg (assuan_context_t ctx, assuan_fd_t fd, const assuan_msghdr_t msg, int flags); +pid_t __assuan_waitpid (assuan_context_t ctx, pid_t pid, int nowait, int *status, int options); #define ASSUAN_SYSTEM_PTH_IMPL \ @@ -515,21 +520,29 @@ extern struct assuan_system_hooks _assuan_system_pth; { (void) ctx; npth_usleep (usec); } \ static ssize_t _assuan_npth_read (assuan_context_t ctx, assuan_fd_t fd, \ void *buffer, size_t size) \ - { (void) ctx; return npth_read (fd, buffer, size); } \ + { ssize_t res; (void) ctx; npth_unprotect(); \ + res = __assuan_read (ctx, fd, buffer, size); \ + npth_protect(); return res; } \ static ssize_t _assuan_npth_write (assuan_context_t ctx, assuan_fd_t fd, \ const void *buffer, size_t size) \ - { (void) ctx; return npth_write (fd, buffer, size); } \ + { ssize_t res; (void) ctx; npth_unprotect(); \ + res = __assuan_write (ctx, fd, buffer, size); \ + npth_protect(); return res; } \ static int _assuan_npth_recvmsg (assuan_context_t ctx, assuan_fd_t fd, \ assuan_msghdr_t msg, int flags) \ - { (void) ctx; return npth_recvmsg (fd, msg, flags); } \ + { int res; (void) ctx; npth_unprotect(); \ + res = __assuan_recvmsg (ctx, fd, msg, flags); \ + npth_protect(); return res; } \ static int _assuan_npth_sendmsg (assuan_context_t ctx, assuan_fd_t fd, \ const assuan_msghdr_t msg, int flags) \ - { (void) ctx; return npth_sendmsg (fd, msg, flags); } \ + { int res; (void) ctx; npth_unprotect(); \ + res = __assuan_sendmsg (ctx, fd, msg, flags); \ + npth_protect(); return res; } \ static pid_t _assuan_npth_waitpid (assuan_context_t ctx, pid_t pid, \ int nowait, int *status, int options) \ - { (void) ctx; \ - if (!nowait) return npth_waitpid (pid, status, options); \ - else return 0; } \ + { pid_t res; (void) ctx; npth_unprotect(); \ + res = __assuan_waitpid (ctx, pid, nowait, status, options); \ + npth_protect(); return res; } \ \ struct assuan_system_hooks _assuan_system_npth = \ { ASSUAN_SYSTEM_HOOKS_VERSION, _assuan_npth_usleep, __assuan_pipe, \ diff --git a/src/libassuan.def b/src/libassuan.def index 9287486..b634b1c 100644 --- a/src/libassuan.def +++ b/src/libassuan.def @@ -105,6 +105,11 @@ EXPORTS __assuan_connect @84 assuan_register_pre_cmd_notify @85 assuan_socket_connect_fd @86 + __assuan_read @87 + __assuan_write @88 + __assuan_recvmsg @89 + __assuan_sendmsg @90 + __assuan_waitpid @91 ; END diff --git a/src/system-w32.c b/src/system-w32.c index 9753f71..c6ced5e 100644 --- a/src/system-w32.c +++ b/src/system-w32.c @@ -190,7 +190,7 @@ is_socket (HANDLE hd) } -static ssize_t +ssize_t __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size) { int res; @@ -239,7 +239,7 @@ __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size) -static ssize_t +ssize_t __assuan_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, size_t size) { @@ -292,7 +292,7 @@ __assuan_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, -static int +int __assuan_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, int flags) { @@ -303,7 +303,7 @@ __assuan_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, -static int +int __assuan_sendmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, int flags) { @@ -496,7 +496,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, /* FIXME: Add some sort of waitpid function that covers GPGME and gpg-agent's use of assuan. */ -static pid_t +pid_t __assuan_waitpid (assuan_context_t ctx, pid_t pid, int nowait, int *status, int options) { ----------------------------------------------------------------------- Summary of changes: src/assuan.h.in | 27 ++++++++++++++++++++------- src/libassuan.def | 5 +++++ src/system-w32.c | 10 +++++----- 3 files changed, 30 insertions(+), 12 deletions(-) hooks/post-receive -- IPC library used by GnuPG http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 25 03:49:21 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Wed, 25 Jan 2012 03:49:21 +0100 Subject: [git] GnuPG - branch, scd-pin-prompt, updated. gnupg-2.1.0beta3-21-g74fe0b7 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, scd-pin-prompt has been updated via 74fe0b79a1dc50a810b23100aa10284e792cc3e5 (commit) via 7a61398e67b376ea5bdf30cdbbd0c5a25a2cf070 (commit) from add0e34babcc6750f4675a8ab3b189b01127116f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 74fe0b79a1dc50a810b23100aa10284e792cc3e5 Author: Ben Kibbey Date: Tue Jan 24 18:52:02 2012 -0500 Let the RESTART command reset any scdaemon pin prompts. The gpg-agent sends the RESTART command to scdaemon when the client has disconnected. This commit allows future connections to scdaemon use the default pinentry prompts. It is recommended to use the scdaemon LOCK command to prevent other scdaemon clients from altering the prompts before the current client has finished with the scdaemon pinentry since the set prompts are global to the application. * scd/command.c (cmd_restart): Free any allocated custom pinentry prompt strings to let the application use its default. diff --git a/scd/command.c b/scd/command.c index 0b82a2b..d85f0fc 100644 --- a/scd/command.c +++ b/scd/command.c @@ -142,7 +142,7 @@ struct server_local_s /* User-defined pinentry prompt strings. Needed both here and in the app * since they may be set by the user before an app is selected with * select_application(). They are copied to the app when - * select_application() succeeds and further modifications done in the app. + * select_application() succeeds. * */ char *pin_prompt; char *pin_admin_prompt; @@ -1838,6 +1838,11 @@ cmd_restart (assuan_context_t ctx, char *line) locked_session = NULL; log_info ("implicitly unlocking due to RESTART\n"); } + + xfree (ctrl->server_local->pin_prompt); + xfree (ctrl->server_local->pin_admin_prompt); + ctrl->server_local->pin_prompt = NULL; + ctrl->server_local->pin_admin_prompt = NULL; return 0; } commit 7a61398e67b376ea5bdf30cdbbd0c5a25a2cf070 Author: Ben Kibbey Date: Tue Jan 24 18:14:16 2012 -0500 Return successfully when the app has no SCD pin prompt callback. * scd/app.c (app_set_pin_prompt): Create a log message when the app contains no pinentry prompt callback and return 0. diff --git a/scd/app.c b/scd/app.c index 51bd207..4705e0a 100644 --- a/scd/app.c +++ b/scd/app.c @@ -1043,7 +1043,10 @@ app_set_pin_prompt(app_t app, int which, const char *prompt) return gpg_error (GPG_ERR_INV_VALUE); if (!app->fnc.set_pin_prompt) - return gpg_error (GPG_ERR_UNSUPPORTED_OPERATION); + { + log_info ("no pinentry prompt callback for app has been set"); + return 0; + } return app->fnc.set_pin_prompt (app, which, prompt); } ----------------------------------------------------------------------- Summary of changes: scd/app.c | 5 ++++- scd/command.c | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 25 12:56:07 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 25 Jan 2012 12:56:07 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-25-g2a5f61c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 2a5f61c4779eb9b24a11296c2f422fa0d694463b (commit) from deee8147aab086161c91e6aa6fb41d7148a630f6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2a5f61c4779eb9b24a11296c2f422fa0d694463b Author: Werner Koch Date: Wed Jan 25 11:58:54 2012 +0100 Extend gitlog-to-changelog option --tear-off. -- It is now possible to suppress git log entries from being copied to the ChangeLog by using the option --tear-off and having a "--" line as the first line in the body (like this very log entry). Note that the GnuPG master branch is the canonical source for our version of the gitlog-to-changelog script. diff --git a/scripts/gitlog-to-changelog b/scripts/gitlog-to-changelog index 66fb49f..5cf071f 100755 --- a/scripts/gitlog-to-changelog +++ b/scripts/gitlog-to-changelog @@ -3,13 +3,13 @@ eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' if 0; # Convert git log output to ChangeLog format. -my $VERSION = '2012-01-20 10:14'; # UTC +my $VERSION = '2012-01-24 15:58 (wk)'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook # do its job. Otherwise, update this string manually. -# Copyright (C) 2008-2011 Free Software Foundation, Inc. +# Copyright (C) 2008-2012 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -25,6 +25,7 @@ my $VERSION = '2012-01-20 10:14'; # UTC # along with this program. If not, see . # Written by Jim Meyering +# Custom bugs bred by Werner Koch use strict; use warnings; @@ -64,7 +65,8 @@ OPTIONS: makes a change to SHA1's commit log text or metadata. --append-dot append a dot to the first line of each commit message if there is no other punctuation or blank at the end. - --tear-off tear off all commit log lines after a '--' line. + --tear-off tear off all commit log lines after a '--' line and + skip log entry with the first body line being '--'. --since=DATE convert only the logs since DATE; the default is to convert all log entries. --format=FMT set format string for commit subject and body; @@ -222,6 +224,13 @@ sub parse_amend_file($) $log =~ /^.*\n\nMerge branch '.*\n\s*/ and goto SKIPCOMMIT; + # Skip log entries if the body starts with a tear off marker. + if ($tear_off) + { + $log =~ /^.*\n\n.*\n--\s*/ + and goto SKIPCOMMIT; + } + # Extract leading hash. my ($sha, $rest) = split ':', $log, 2; defined $sha @@ -360,7 +369,7 @@ sub parse_amend_file($) # indent-tabs-mode: nil # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "my $VERSION = '" -# time-stamp-format: "%:y-%02m-%02d %02H:%02M" +# time-stamp-format: "%:y-%02m-%02d %02H:%02M (wk)" # time-stamp-time-zone: "UTC" # time-stamp-end: "'; # UTC" # End: ----------------------------------------------------------------------- Summary of changes: scripts/gitlog-to-changelog | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 25 13:09:09 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 25 Jan 2012 13:09:09 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-26-g495dc68 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 495dc68586356891b82a2d2b6367c4131fd17f08 (commit) from 2a5f61c4779eb9b24a11296c2f422fa0d694463b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 495dc68586356891b82a2d2b6367c4131fd17f08 Author: Werner Koch Date: Wed Jan 25 12:11:41 2012 +0100 Require gitlog-to-changelog to be installed. * Makefile.am (GITLOG_TO_CHANGELOG): New. (gen-ChangeLog): Use installed version of gitlog-to-changelog. -- In case an appropriate version of gitlog-to-changelog is not in the PATH, it is possible to override it using something like: make distcheck GITLOG_TO_CHANGELOG=/foo/bar/my-gitlog-to-changelog diff --git a/Makefile.am b/Makefile.am index 49ec3fc..6207d7b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,6 +22,8 @@ ACLOCAL_AMFLAGS = -I m4 -I gl/m4 AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip DISTCHECK_CONFIGURE_FLAGS = --enable-symcryptrun --enable-mailto --enable-gpgtar +GITLOG_TO_CHANGELOG=gitlog-to-changelog + EXTRA_DIST = scripts/config.rpath scripts/potomo autogen.sh README.GIT \ ChangeLog-2011 po/ChangeLog-2011 scripts/ChangeLog-2011 \ scripts/gitlog-to-changelog \ @@ -115,8 +117,7 @@ gen_start_date = 2011-12-01T06:00:00 gen-ChangeLog: if test -d $(top_srcdir)/.git; then \ (cd $(top_srcdir) && \ - ./scripts/gitlog-to-changelog \ - --append-dot --tear-off \ + $(GITLOG_TO_CHANGELOG) --append-dot --tear-off \ --amend=scripts/git-log-fix \ --since=$(gen_start_date) ) > $(distdir)/cl-t; \ cat $(top_srcdir)/scripts/git-log-footer >> $(distdir)/cl-t; \ ----------------------------------------------------------------------- Summary of changes: Makefile.am | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 25 15:41:48 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 25 Jan 2012 15:41:48 +0100 Subject: [git] GnuPG - branch, npth-2, updated. gnupg-2.1.0beta3-15-gd974920 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, npth-2 has been updated via d97492064c20953b4e401f5c14e1a93108b4e8e3 (commit) via 4ee5b5c91e23f6e022385b13477ed1db36c364fb (commit) via add8ac3d56ca69246b11a3fd1358c2c46dbf25b7 (commit) from 122d1d1babf919d491390ad2e3fa8ab8271a19a1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d97492064c20953b4e401f5c14e1a93108b4e8e3 Author: Werner Koch Date: Wed Jan 25 14:44:34 2012 +0100 Re-indent overlong lines. -- diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 155fe73..537f526 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1934,7 +1934,8 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) npth_timersub (&abstime, &curtime, &timeout); #ifndef HAVE_W32_SYSTEM - ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); + ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, + npth_sigev_sigmask ()); saved_errno = errno; { @@ -1944,7 +1945,8 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) } #else events_set = 0; - ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, events, &events_set); + ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, + events, &events_set); saved_errno = errno; /* This is valid even if npth_eselect returns an error. */ @@ -1993,7 +1995,8 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) npth_t thread; ctrl->thread_startup.fd = fd; - ret = npth_create (&thread, &tattr, start_connection_thread, ctrl); + ret = npth_create (&thread, &tattr, + start_connection_thread, ctrl); if (ret) { log_error ("error spawning connection handler: %s\n", @@ -2037,7 +2040,8 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) agent_init_default_ctrl (ctrl); ctrl->thread_startup.fd = fd; - ret = npth_create (&thread, &tattr, start_connection_thread_ssh, ctrl); + ret = npth_create (&thread, &tattr, + start_connection_thread_ssh, ctrl); if (ret) { log_error ("error spawning ssh connection handler: %s\n", commit 4ee5b5c91e23f6e022385b13477ed1db36c364fb Author: Werner Koch Date: Wed Jan 25 12:11:41 2012 +0100 Add missing variable. * agent/gpg-agent.c (handle_connections) [!W32]: Add missing variable. diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 9bd0c46..155fe73 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -1937,8 +1937,11 @@ handle_connections (gnupg_fd_t listen_fd, gnupg_fd_t listen_fd_ssh) ret = npth_pselect (nfd+1, &read_fdset, NULL, NULL, &timeout, npth_sigev_sigmask()); saved_errno = errno; - while (npth_sigev_get_pending(&signo)) - handle_signal (signo); + { + int signo; + while (npth_sigev_get_pending (&signo)) + handle_signal (signo); + } #else events_set = 0; ret = npth_eselect (nfd+1, &read_fdset, NULL, NULL, &timeout, events, &events_set); commit add8ac3d56ca69246b11a3fd1358c2c46dbf25b7 Author: Werner Koch Date: Wed Jan 25 12:11:41 2012 +0100 Require gitlog-to-changelog to be installed. * Makefile.am (GITLOG_TO_CHANGELOG): New. (gen-ChangeLog): Use installed version of gitlog-to-changelog. -- In case an appropriate version of gitlog-to-changelog is not in the PATH, it is possible to override it using something like: make distcheck GITLOG_TO_CHANGELOG=/foo/bar/my-gitlog-to-changelog diff --git a/Makefile.am b/Makefile.am index 49ec3fc..6207d7b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,6 +22,8 @@ ACLOCAL_AMFLAGS = -I m4 -I gl/m4 AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip DISTCHECK_CONFIGURE_FLAGS = --enable-symcryptrun --enable-mailto --enable-gpgtar +GITLOG_TO_CHANGELOG=gitlog-to-changelog + EXTRA_DIST = scripts/config.rpath scripts/potomo autogen.sh README.GIT \ ChangeLog-2011 po/ChangeLog-2011 scripts/ChangeLog-2011 \ scripts/gitlog-to-changelog \ @@ -115,8 +117,7 @@ gen_start_date = 2011-12-01T06:00:00 gen-ChangeLog: if test -d $(top_srcdir)/.git; then \ (cd $(top_srcdir) && \ - ./scripts/gitlog-to-changelog \ - --append-dot --tear-off \ + $(GITLOG_TO_CHANGELOG) --append-dot --tear-off \ --amend=scripts/git-log-fix \ --since=$(gen_start_date) ) > $(distdir)/cl-t; \ cat $(top_srcdir)/scripts/git-log-footer >> $(distdir)/cl-t; \ ----------------------------------------------------------------------- Summary of changes: Makefile.am | 5 +++-- agent/gpg-agent.c | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 8 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed Jan 25 16:16:39 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 25 Jan 2012 16:16:39 +0100 Subject: [git] Assuan - branch, master, updated. libassuan-2.0.3-5-g5c00c7c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "IPC library used by GnuPG". The branch, master has been updated via 5c00c7cc2901a879927a5756e1bb7ecf49439ebc (commit) via dbfbc908121afd1cf3177249d9378fc787a9cff7 (commit) from cef55142f2552538714f8296479f58a63d14a239 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5c00c7cc2901a879927a5756e1bb7ecf49439ebc Author: Werner Koch Date: Wed Jan 25 15:19:45 2012 +0100 Make new functions also visible on non-W32. * src/system-posix.c (__assuan_read, __assuan_write, __assuan_recvmsg) (__assuan_sendmsg, __assuan_waitpid): Make functions global. * src/libassuan.vers: Add above functions. * configure.ac: Set version to 2.1.0-git. diff --git a/NEWS b/NEWS index a4979c9..4876a50 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,19 @@ +Noteworthy changes in version 2.1.0 (unreleased) +------------------------------------------------ + + * Support for the nPth library. + + * Interface changes relative to the 2.0.3 release: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ASSUAN_SYSTEM_NPTH_IMPL NEW macro. + ASSUAN_SYSTEM_NPTH NEW macro. + __assuan_read NEW (private). + __assuan_write NEW (private). + __assuan_recvmsg NEW (private). + __assuan_sendmsg NEW (private). + __assuan_waitpid NEW (private). + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Noteworthy changes in version 2.0.3 (2011-12-20) ------------------------------------------------ diff --git a/configure.ac b/configure.ac index f08a3d7..c908ef2 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,7 @@ min_automake_version="1.10" # Remember to change the version number immediately *after* a release. # Set my_issvn to "yes" for non-released code. Remember to run an # "svn up" and "autogen.sh" right before creating a distribution. -m4_define([my_version], [2.0.4]) +m4_define([my_version], [2.1.0]) m4_define([my_issvn], [yes]) m4_define([svn_revision], m4_esyscmd([printf "%d" $( (svn info 2>/dev/null \ diff --git a/doc/assuan.texi b/doc/assuan.texi index 637ad84..1d48391 100644 --- a/doc/assuan.texi +++ b/doc/assuan.texi @@ -963,6 +963,12 @@ The following system hook collections are defined by the library for your convenience: @table @code + at item ASSUAN_SYSTEM_NPTH +System hooks suitable for use with the nPth library. + at item ASSUAN_SYSTEM_NPTH_IMPL +The implementation of system hooks for use with the nPth library. +This must be invoked once somewhere in the application, and defines +the structure that is referenced by @code{ASSUAN_SYSTEM_NPTH}. @item ASSUAN_SYSTEM_PTH System hooks suitable for use with the GNU Pth library. @item ASSUAN_SYSTEM_PTH_IMPL diff --git a/src/assuan-buffer.c b/src/assuan-buffer.c index 96d1f99..f2238e7 100644 --- a/src/assuan-buffer.c +++ b/src/assuan-buffer.c @@ -46,7 +46,7 @@ writen (assuan_context_t ctx, const char *buffer, size_t length) while (length) { ssize_t nwritten = ctx->engine.writefnc (ctx, buffer, length); - + if (nwritten < 0) { if (errno == EINTR) @@ -202,7 +202,7 @@ _assuan_read_line (assuan_context_t ctx) ctx->inbound.linelen); if (monitor_result & ASSUAN_IO_MONITOR_IGNORE) ctx->inbound.linelen = 0; - + if ( !(monitor_result & ASSUAN_IO_MONITOR_NOLOG)) _assuan_log_control_channel (ctx, 0, NULL, ctx->inbound.line, ctx->inbound.linelen, @@ -211,11 +211,11 @@ _assuan_read_line (assuan_context_t ctx) } else { - _assuan_log_control_channel (ctx, 0, "invalid line", + _assuan_log_control_channel (ctx, 0, "invalid line", NULL, 0, NULL, 0); *line = 0; ctx->inbound.linelen = 0; - return _assuan_error (ctx, ctx->inbound.eof + return _assuan_error (ctx, ctx->inbound.eof ? GPG_ERR_ASS_INCOMPLETE_LINE : GPG_ERR_ASS_LINE_TOO_LONG); } @@ -261,7 +261,7 @@ assuan_pending_line (assuan_context_t ctx) } -gpg_error_t +gpg_error_t _assuan_write_line (assuan_context_t ctx, const char *prefix, const char *line, size_t len) { @@ -272,7 +272,7 @@ _assuan_write_line (assuan_context_t ctx, const char *prefix, /* Make sure that the line is short enough. */ if (len + prefixlen + 2 > ASSUAN_LINELENGTH) { - _assuan_log_control_channel (ctx, 1, + _assuan_log_control_channel (ctx, 1, "supplied line too long - truncated", NULL, 0, NULL, 0); if (prefixlen > 5) @@ -313,7 +313,7 @@ _assuan_write_line (assuan_context_t ctx, const char *prefix, } -gpg_error_t +gpg_error_t assuan_write_line (assuan_context_t ctx, const char *line) { size_t len; @@ -364,7 +364,7 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) *line++ = ' '; linelen += 2; } - + /* Copy data, keep space for the CRLF and to escape one character. */ while (size && linelen < LINELENGTH-2-2) { @@ -382,8 +382,8 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) } size--; } - - + + monitor_result = 0; if (ctx->io_monitor) monitor_result = ctx->io_monitor (ctx, ctx->io_monitor_data, 1, @@ -414,7 +414,7 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) } -/* Write out any buffered data +/* Write out any buffered data This function is used for GNU's custom streams */ int _assuan_cookie_write_flush (void *cookie) @@ -435,7 +435,7 @@ _assuan_cookie_write_flush (void *cookie) if (ctx->io_monitor) monitor_result = ctx->io_monitor (ctx, ctx->io_monitor_data, 1, ctx->outbound.data.line, linelen); - + if (linelen) { if (!(monitor_result & ASSUAN_IO_MONITOR_NOLOG)) @@ -461,7 +461,7 @@ _assuan_cookie_write_flush (void *cookie) * @ctx: An assuan context * @buffer: Data to send or NULL to flush * @length: length of the data to send/ - * + * * This function may be used by the server or the client to send data * lines. The data will be escaped as required by the Assuan protocol * and may get buffered until a line is full. To force sending the @@ -470,10 +470,10 @@ _assuan_cookie_write_flush (void *cookie) * also send the terminating "END" command to terminate the reponse on * a INQUIRE response. However, when assuan_transact() is used, this * function takes care of sending END itself. - * + * * If BUFFER is NULL and LENGTH is 1 and we are a client, a "CAN" is * send instead of an "END". - * + * * Return value: 0 on success or an error code **/ diff --git a/src/libassuan.vers b/src/libassuan.vers index 8126fab..8f3419f 100644 --- a/src/libassuan.vers +++ b/src/libassuan.vers @@ -108,6 +108,11 @@ LIBASSUAN_1.0 { __assuan_usleep; __assuan_socket; __assuan_connect; + __assuan_read; + __assuan_write; + __assuan_recvmsg; + __assuan_sendmsg; + __assuan_waitpid; local: *; diff --git a/src/system-posix.c b/src/system-posix.c index 68294c0..5bdc676 100644 --- a/src/system-posix.c +++ b/src/system-posix.c @@ -62,17 +62,17 @@ __assuan_usleep (assuan_context_t ctx, unsigned int usec) { struct timespec req; struct timespec rem; - + req.tv_sec = 0; req.tv_nsec = usec * 1000; - + while (nanosleep (&req, &rem) < 0 && errno == EINTR) req = rem; } #else { struct timeval tv; - + tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; select (0, NULL, NULL, NULL, &tv); @@ -101,7 +101,7 @@ __assuan_close (assuan_context_t ctx, assuan_fd_t fd) -static ssize_t +ssize_t __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size) { return read (fd, buffer, size); @@ -109,7 +109,7 @@ __assuan_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size) -static ssize_t +ssize_t __assuan_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, size_t size) { @@ -118,7 +118,7 @@ __assuan_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, -static int +int __assuan_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, int flags) { @@ -133,7 +133,7 @@ __assuan_recvmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, -static int +int __assuan_sendmsg (assuan_context_t ctx, assuan_fd_t fd, assuan_msghdr_t msg, int flags) { @@ -154,7 +154,7 @@ writen (int fd, const char *buffer, size_t length) while (length) { int nwritten = write (fd, buffer, length); - + if (nwritten < 0) { if (errno == EINTR) @@ -201,7 +201,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, "can't open `/dev/null': %s", strerror (errno)); _exit (4); } - + /* Dup handles to stdin/stdout. */ if (fd_out != STDOUT_FILENO) { @@ -213,7 +213,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, _exit (4); } } - + if (fd_in != STDIN_FILENO) { if (dup2 (fd_in == ASSUAN_INVALID_FD ? fdnul : fd_in, @@ -224,7 +224,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, _exit (4); } } - + /* Dup stderr to /dev/null unless it is in the list of FDs to be passed to the child. */ fdp = fd_child_list; @@ -243,7 +243,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, } } close (fdnul); - + /* Close all files which will not be duped and are not in the fd_child_list. */ n = sysconf (_SC_OPEN_MAX); @@ -259,24 +259,24 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, while (*fdp != -1 && *fdp != i) fdp++; } - + if (!(fdp && *fdp != -1)) close (i); } gpg_err_set_errno (0); - + if (! name) { /* No name and no args given, thus we don't do an exec but continue the forked process. */ *argv = "server"; - + /* FIXME: Cleanup. */ return 0; } - - execv (name, (char *const *) argv); - + + execv (name, (char *const *) argv); + /* oops - use the pipe to tell the parent about it */ snprintf (errbuf, sizeof(errbuf)-1, "ERR %d can't exec `%s': %.50s\n", @@ -289,7 +289,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, if (! name) *argv = "client"; - + *r_pid = pid; return 0; @@ -299,7 +299,7 @@ __assuan_spawn (assuan_context_t ctx, pid_t *r_pid, const char *name, /* FIXME: Add some sort of waitpid function that covers GPGME and gpg-agent's use of assuan. */ -static pid_t +pid_t __assuan_waitpid (assuan_context_t ctx, pid_t pid, int nowait, int *status, int options) { @@ -307,7 +307,7 @@ __assuan_waitpid (assuan_context_t ctx, pid_t pid, int nowait, NOWAIT in POSIX systems just means the caller already did the waitpid for this child. */ if (! nowait) - return waitpid (pid, NULL, 0); + return waitpid (pid, NULL, 0); return 0; } commit dbfbc908121afd1cf3177249d9378fc787a9cff7 Author: Werner Koch Date: Wed Jan 25 13:34:26 2012 +0100 Require gitlog-to-changelog to be installed. * Makefile.am (GITLOG_TO_CHANGELOG): New. (gen-ChangeLog): Use installed version of gitlog-to-changelog. * build-aux/gitlog-to-changelog: Remove from repo. diff --git a/Makefile.am b/Makefile.am index 3103c7d..7b328f1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -21,11 +21,13 @@ ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip +# (A suitable gitlog-to-changelog script can be found in GnuPG master.) +GITLOG_TO_CHANGELOG=gitlog-to-changelog + EXTRA_DIST = config.rpath autogen.sh README.GIT \ ChangeLog-2011 doc/ChangeLog-2011 src/ChangeLog-2011 \ tests/ChangeLog-2011 contrib/ChangeLog-2011 \ - build-aux/gitlog-to-changelog build-aux/git-log-footer \ - build-aux/git-log-fix + build-aux/git-log-footer build-aux/git-log-fix SUBDIRS = m4 src doc tests @@ -37,9 +39,10 @@ dist-hook: gen-ChangeLog gen_start_date = 2011-12-01T00:00:00 .PHONY: gen-ChangeLog gen-ChangeLog: + set -e; \ if test -d $(top_srcdir)/.git; then \ (cd $(top_srcdir) && \ - ./build-aux/gitlog-to-changelog \ + $(GITLOG_TO_CHANGELOG) --append-dot --tear-off \ --amend=build-aux/git-log-fix --tear-off \ --since=$(gen_start_date) ) > $(distdir)/cl-t; \ cat $(top_srcdir)/build-aux/git-log-footer >> $(distdir)/cl-t;\ diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog deleted file mode 100755 index d9f594f..0000000 --- a/build-aux/gitlog-to-changelog +++ /dev/null @@ -1,360 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' - & eval 'exec perl -wS "$0" $argv:q' - if 0; -# Convert git log output to ChangeLog format. - -my $VERSION = '2011-11-02 07:53'; # UTC -# The definition above must lie within the first 8 lines in order -# for the Emacs time-stamp write hook (at end) to update it. -# If you change this file with Emacs, please let the write hook -# do its job. Otherwise, update this string manually. - -# Copyright (C) 2008-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program 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 General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Written by Jim Meyering - -use strict; -use warnings; -use Getopt::Long; -use POSIX qw(strftime); - -(my $ME = $0) =~ s|.*/||; - -# use File::Coda; # http://meyering.net/code/Coda/ -END { - defined fileno STDOUT or return; - close STDOUT and return; - warn "$ME: failed to close standard output: $!\n"; - $? ||= 1; -} - -sub usage ($) -{ - my ($exit_code) = @_; - my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); - if ($exit_code != 0) - { - print $STREAM "Try `$ME --help' for more information.\n"; - } - else - { - print $STREAM < ChangeLog - $ME -- -n 5 foo > last-5-commits-to-branch-foo - -In a FILE specified via --amend, comment lines (starting with "#") are ignored. -FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on -a line) referring to a commit in the current project, and CODE refers to one -or more consecutive lines of Perl code. Pairs must be separated by one or -more blank line. - -Here is sample input for use with --amend=FILE, from coreutils: - -3a169f4c5d9159283548178668d2fae6fced3030 -# fix typo in title: -s/all tile types/all file types/ - -1379ed974f1fa39b12e2ffab18b3f7a607082202 -# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. -# Change the author to be Paul. Note the escaped "@": -s,Jim .*>,Paul Eggert , - -EOF - } - exit $exit_code; -} - -# If the string $S is a well-behaved file name, simply return it. -# If it contains white space, quotes, etc., quote it, and return the new string. -sub shell_quote($) -{ - my ($s) = @_; - if ($s =~ m![^\w+/.,-]!) - { - # Convert each single quote to '\'' - $s =~ s/\'/\'\\\'\'/g; - # Then single quote the string. - $s = "'$s'"; - } - return $s; -} - -sub quoted_cmd(@) -{ - return join (' ', map {shell_quote $_} @_); -} - -# Parse file F. -# Comment lines (starting with "#") are ignored. -# F must consist of pairs where SHA is a 40-byte SHA1 -# (alone on a line) referring to a commit in the current project, and -# CODE refers to one or more consecutive lines of Perl code. -# Pairs must be separated by one or more blank line. -sub parse_amend_file($) -{ - my ($f) = @_; - - open F, '<', $f - or die "$ME: $f: failed to open for reading: $!\n"; - - my $fail; - my $h = {}; - my $in_code = 0; - my $sha; - while (defined (my $line = )) - { - $line =~ /^\#/ - and next; - chomp $line; - $line eq '' - and $in_code = 0, next; - - if (!$in_code) - { - $line =~ /^([0-9a-fA-F]{40})$/ - or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), - $fail = 1, next; - $sha = lc $1; - $in_code = 1; - exists $h->{$sha} - and (warn "$ME: $f:$.: duplicate SHA1\n"), - $fail = 1, next; - } - else - { - $h->{$sha} ||= ''; - $h->{$sha} .= "$line\n"; - } - } - close F; - - $fail - and exit 1; - - return $h; -} - -{ - my $since_date; - my $format_string = '%s%n%b%n'; - my $amend_file; - my $append_dot = 0; - my $tear_off = 0; - GetOptions - ( - help => sub { usage 0 }, - version => sub { print "$ME version $VERSION\n"; exit }, - 'since=s' => \$since_date, - 'format=s' => \$format_string, - 'amend=s' => \$amend_file, - 'append-dot' => \$append_dot, - 'tear-off' => \$tear_off, - ) or usage 1; - - - defined $since_date - and unshift @ARGV, "--since=$since_date"; - - # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) - # that makes a correction in the log or attribution of that commit. - my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; - - my @cmd = (qw (git log --log-size), - '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV); - open PIPE, '-|', @cmd - or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n" - . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); - - my $prev_date_line = ''; - my @prev_coauthors = (); - while (1) - { - defined (my $in = ) - or last; - $in =~ /^log size (\d+)$/ - or die "$ME:$.: Invalid line (expected log size):\n$in"; - my $log_nbytes = $1; - - my $log; - my $n_read = read PIPE, $log, $log_nbytes; - $n_read == $log_nbytes - or die "$ME:$.: unexpected EOF\n"; - - # Extract leading hash. - my ($sha, $rest) = split ':', $log, 2; - defined $sha - or die "$ME:$.: malformed log entry\n"; - $sha =~ /^[0-9a-fA-F]{40}$/ - or die "$ME:$.: invalid SHA1: $sha\n"; - - # If this commit's log requires any transformation, do it now. - my $code = $amend_code->{$sha}; - if (defined $code) - { - eval 'use Safe'; - my $s = new Safe; - # Put the unpreprocessed entry into "$_". - $_ = $rest; - - # Let $code operate on it, safely. - my $r = $s->reval("$code") - or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; - - # Note that we've used this entry. - delete $amend_code->{$sha}; - - # Update $rest upon success. - $rest = $_; - } - - my @line = split "\n", $rest; - my $author_line = shift @line; - defined $author_line - or die "$ME:$.: unexpected EOF\n"; - $author_line =~ /^(\d+) (.*>)$/ - or die "$ME:$.: Invalid line " - . "(expected date/author/email):\n$author_line\n"; - - my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1)); - - # Format 'Co-authored-by: A U Thor ' lines in - # standard multi-author ChangeLog format. - my @coauthors = grep /^Co-authored-by:.*$/, @line; - for (@coauthors) - { - s/^Co-authored-by:\s*/\t /; - s/\s*/ - or warn "$ME: warning: missing email address for " - . substr ($_, 5) . "\n"; - } - - # If this header would be the same as the previous date/name/email/ - # coauthors header, then arrange not to print it. - if ($date_line ne $prev_date_line or "@coauthors" ne "@prev_coauthors") - { - $prev_date_line eq '' - or print "\n"; - print $date_line; - @coauthors - and print join ("\n", @coauthors), "\n"; - } - $prev_date_line = $date_line; - @prev_coauthors = @coauthors; - - # Omit "Co-authored-by..." and "Signed-off-by..." lines. - @line = grep !/^Signed-off-by: .*>$/, @line; - @line = grep !/^Co-authored-by: /, @line; - - # Remove everything after a line with 2 dashes at the beginning. - if ($tear_off) - { - my @tmpline; - foreach (@line) - { - last if /^--\s*$/; - push @tmpline,$_; - } - @line = @tmpline; - } - - # Remove leading and trailing blank lines. - if (@line) - { - while ($line[0] =~ /^\s*$/) { shift @line; } - while ($line[$#line] =~ /^\s*$/) { pop @line; } - } - - # If there were any lines - if (@line == 0) - { - warn "$ME: warning: empty commit message:\n $date_line\n"; - } - else - { - if ($append_dot) - { - # If the first line of the message has enough room, then - if (length $line[0] < 72) - { - # append a dot if there is no other punctuation or blank - # at the end. - $line[0] =~ /[[:punct:]\s]$/ - or $line[0] .= '.'; - } - } - - # Prefix each non-empty line with a TAB. - @line = map { length $_ ? "\t$_" : '' } @line; - - print "\n", join ("\n", @line), "\n"; - } - - defined ($in = ) - or last; - $in ne "\n" - and die "$ME:$.: unexpected line:\n$in"; - } - - close PIPE - or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; - # FIXME-someday: include $PROCESS_STATUS in the diagnostic - - # Complain about any unused entry in the --amend=F specified file. - my $fail = 0; - foreach my $sha (keys %$amend_code) - { - warn "$ME:$amend_file: unused entry: $sha\n"; - $fail = 1; - } - - exit $fail; -} - -# Local Variables: -# mode: perl -# indent-tabs-mode: nil -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "my $VERSION = '" -# time-stamp-format: "%:y-%02m-%02d %02H:%02M" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "'; # UTC" -# End: ----------------------------------------------------------------------- Summary of changes: Makefile.am | 9 +- NEWS | 16 ++ build-aux/gitlog-to-changelog | 360 ----------------------------------------- configure.ac | 2 +- doc/assuan.texi | 6 + src/assuan-buffer.c | 30 ++-- src/libassuan.vers | 5 + src/system-posix.c | 42 +++--- 8 files changed, 70 insertions(+), 400 deletions(-) delete mode 100755 build-aux/gitlog-to-changelog hooks/post-receive -- IPC library used by GnuPG http://git.gnupg.org From cvs at cvs.gnupg.org Thu Jan 26 03:16:27 2012 From: cvs at cvs.gnupg.org (by Ben Kibbey) Date: Thu, 26 Jan 2012 03:16:27 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-36-gcf748e8 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via cf748e8736b984194345bfd74887b35d3d23fa37 (commit) via 3da10eefcb09a520f11e4fae7f59a33f80ffba69 (commit) from 001352077cdc7e402421c77328bea1a052005673 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cf748e8736b984194345bfd74887b35d3d23fa37 Author: Ben Kibbey Date: Wed Jan 25 19:16:33 2012 -0500 Return GPG_ERR_CARD_NOT_PRESENT when pinentry-mode=loopback. Since there isn't a way to prompt the user to insert the smartcard when pinentry-mode=loopback, return GPG_ERR_CARD_NOT_PRESENT instead of GPG_ERR_NO_PIN_ENTRY. * agent/divert-scd.c (ask_for_card): Return GPG_ERR_CARD_NOT_PRESENT when pinentry-mode=loopback. diff --git a/agent/divert-scd.c b/agent/divert-scd.c index f176a6b..5926424 100644 --- a/agent/divert-scd.c +++ b/agent/divert-scd.c @@ -99,6 +99,10 @@ ask_for_card (ctrl_t ctrl, const unsigned char *shadow_info, char **r_kid) else { rc = agent_get_confirmation (ctrl, desc, NULL, NULL, 0); + if (ctrl->pinentry_mode == PINENTRY_MODE_LOOPBACK && + gpg_err_code (rc) == GPG_ERR_NO_PIN_ENTRY) + rc = gpg_error (GPG_ERR_CARD_NOT_PRESENT); + xfree (desc); } } commit 3da10eefcb09a520f11e4fae7f59a33f80ffba69 Author: Ben Kibbey Date: Wed Jan 25 18:14:51 2012 -0500 Also check for GPG_ERR_ASS_CANCELED during an inquire. Fix pinentry-mode=loopback when cancelling an inquire from scdaemon. This is similar to commit 4f21f8d but for both protocol command cancellation and pinentry cancellation. * agent/call-scd.c (agent_card_pkdecrypt): Check for GPG_ERR_ASS_CANCELED. (agent_card_pksign): Ditto. diff --git a/agent/call-scd.c b/agent/call-scd.c index ccdb637..f9ededb 100644 --- a/agent/call-scd.c +++ b/agent/call-scd.c @@ -870,7 +870,8 @@ agent_card_pksign (ctrl_t ctrl, membuf_data_cb, &data, inq_needpin, &inqparm, NULL, NULL); - if (inqparm.any_inq_seen && gpg_err_code(rc) == GPG_ERR_CANCELED) + if (inqparm.any_inq_seen && (gpg_err_code(rc) == GPG_ERR_CANCELED || + gpg_err_code(rc) == GPG_ERR_ASS_CANCELED)) rc = cancel_inquire (ctrl, rc); if (rc) @@ -949,7 +950,8 @@ agent_card_pkdecrypt (ctrl_t ctrl, membuf_data_cb, &data, inq_needpin, &inqparm, NULL, NULL); - if (inqparm.any_inq_seen && gpg_err_code(rc) == GPG_ERR_CANCELED) + if (inqparm.any_inq_seen && (gpg_err_code(rc) == GPG_ERR_CANCELED || + gpg_err_code(rc) == GPG_ERR_ASS_CANCELED)) rc = cancel_inquire (ctrl, rc); if (rc) ----------------------------------------------------------------------- Summary of changes: agent/call-scd.c | 6 ++++-- agent/divert-scd.c | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 27 16:37:30 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 27 Jan 2012 16:37:30 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-37-g2871422 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 2871422d9a889cb632f59efda4d9cd170fc9fca7 (commit) from cf748e8736b984194345bfd74887b35d3d23fa37 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2871422d9a889cb632f59efda4d9cd170fc9fca7 Author: Werner Koch Date: Fri Jan 27 15:40:24 2012 +0100 gpg-connect-tool: Take the string "true" as a true condition. * tools/gpg-connect-agent.c (main): Handle strings "true" and "yes" in conditions as expected. diff --git a/doc/tools.texi b/doc/tools.texi index 5e9a024..be1233b 100644 --- a/doc/tools.texi +++ b/doc/tools.texi @@ -1407,11 +1407,11 @@ input lines which makes scripts easier to read. @item /while @var{condition} @itemx /end -These commands provide a way for executing loops. All lines between the - at code{while} and the corresponding @code{end} are executed as long as -the evaluation of @var{condition} yields a non-zero value. The -evaluation is done by passing @var{condition} to the @code{strtol} -function. Example: +These commands provide a way for executing loops. All lines between +the @code{while} and the corresponding @code{end} are executed as long +as the evaluation of @var{condition} yields a non-zero value or is the +string @code{true} or @code{yes}. The evaluation is done by passing + at var{condition} to the @code{strtol} function. Example: @smallexample /subst @@ -1422,6 +1422,13 @@ function. Example: /end @end smallexample + at item /if @var{condition} + at itemx /end +These commands provide a way for conditional execution. All lines between +the @code{if} and the corresponding @code{end} are executed only if +the evaluation of @var{condition} yields a non-zero value or is the +string @code{true} or @code{yes}. The evaluation is done by passing + at var{condition} to the @code{strtol} function. @item /run @var{file} Run commands from @var{file}. diff --git a/tools/gpg-connect-agent.c b/tools/gpg-connect-agent.c index 117f338..7472728 100644 --- a/tools/gpg-connect-agent.c +++ b/tools/gpg-connect-agent.c @@ -1747,7 +1747,14 @@ main (int argc, char **argv) } tmpline = substitute_line (tmpcond); value = tmpline? tmpline : tmpcond; - condition = strtol (value, NULL, 0); + /* "true" or "yes" are commonly used to mean TRUE; + all other strings will evaluate to FALSE due to + the strtoul. */ + if (!ascii_strcasecmp (value, "true") + || !ascii_strcasecmp (value, "yes")) + condition = 1; + else + condition = strtol (value, NULL, 0); xfree (tmpline); xfree (tmpcond); ----------------------------------------------------------------------- Summary of changes: doc/tools.texi | 17 ++++++++++++----- tools/gpg-connect-agent.c | 9 ++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Fri Jan 27 20:11:12 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 27 Jan 2012 20:11:12 +0100 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-38-gbdde44a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via bdde44ae8d4709e33c09781c3d37a5da2c7a5e0d (commit) from 2871422d9a889cb632f59efda4d9cd170fc9fca7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit bdde44ae8d4709e33c09781c3d37a5da2c7a5e0d Author: Werner Koch Date: Fri Jan 27 17:29:57 2012 +0100 gl: Add support for Android to stdint.h replacement. * gl/stdint_.h: When included from Bionic , just include the system's . diff --git a/gl/stdint_.h b/gl/stdint_.h index bc27595..19577e7 100644 --- a/gl/stdint_.h +++ b/gl/stdint_.h @@ -23,6 +23,16 @@ * */ +/* On Android (Bionic libc), includes this file before + having defined 'time_t'. Therefore in this case avoid including + other system header files; just include the system's . + Ideally we should test __BIONIC__ here, but it is only defined after + has been included; hence test __ANDROID__ instead. */ +#if defined __ANDROID__ \ + && defined _SYS_TYPES_H_ && !defined _SSIZE_T_DEFINED_ +# include_next +#else + /* Get those types that are already defined in other system include files, so that we can "#define int8_t signed char" below without worrying about a later system include file containing a "typedef @@ -243,38 +253,38 @@ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits. */ -#undef INT8_MIN -#undef INT8_MAX -#undef UINT8_MAX -#define INT8_MIN (~ INT8_MAX) -#define INT8_MAX 127 -#define UINT8_MAX 255 - -#undef INT16_MIN -#undef INT16_MAX -#undef UINT16_MAX -#define INT16_MIN (~ INT16_MAX) -#define INT16_MAX 32767 -#define UINT16_MAX 65535 - -#undef INT32_MIN -#undef INT32_MAX -#undef UINT32_MAX -#define INT32_MIN (~ INT32_MAX) -#define INT32_MAX 2147483647 -#define UINT32_MAX 4294967295U - -#undef INT64_MIN -#undef INT64_MAX -#ifdef int64_t -# define INT64_MIN (~ INT64_MAX) -# define INT64_MAX INTMAX_C (9223372036854775807) -#endif +# undef INT8_MIN +# undef INT8_MAX +# undef UINT8_MAX +# define INT8_MIN (~ INT8_MAX) +# define INT8_MAX 127 +# define UINT8_MAX 255 + +# undef INT16_MIN +# undef INT16_MAX +# undef UINT16_MAX +# define INT16_MIN (~ INT16_MAX) +# define INT16_MAX 32767 +# define UINT16_MAX 65535 + +# undef INT32_MIN +# undef INT32_MAX +# undef UINT32_MAX +# define INT32_MIN (~ INT32_MAX) +# define INT32_MAX 2147483647 +# define UINT32_MAX 4294967295U + +# undef INT64_MIN +# undef INT64_MAX +# ifdef int64_t +# define INT64_MIN (~ INT64_MAX) +# define INT64_MAX INTMAX_C (9223372036854775807) +# endif -#undef UINT64_MAX -#ifdef uint64_t -# define UINT64_MAX UINTMAX_C (18446744073709551615) -#endif +# undef UINT64_MAX +# ifdef uint64_t +# define UINT64_MAX UINTMAX_C (18446744073709551615) +# endif /* 7.18.2.2. Limits of minimum-width integer types */ @@ -282,38 +292,38 @@ types have 8, 16, 32, optionally 64 bits. Therefore the leastN_t types are the same as the corresponding N_t types. */ -#undef INT_LEAST8_MIN -#undef INT_LEAST8_MAX -#undef UINT_LEAST8_MAX -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define UINT_LEAST8_MAX UINT8_MAX - -#undef INT_LEAST16_MIN -#undef INT_LEAST16_MAX -#undef UINT_LEAST16_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define UINT_LEAST16_MAX UINT16_MAX - -#undef INT_LEAST32_MIN -#undef INT_LEAST32_MAX -#undef UINT_LEAST32_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define UINT_LEAST32_MAX UINT32_MAX - -#undef INT_LEAST64_MIN -#undef INT_LEAST64_MAX -#ifdef int64_t -# define INT_LEAST64_MIN INT64_MIN -# define INT_LEAST64_MAX INT64_MAX -#endif +# undef INT_LEAST8_MIN +# undef INT_LEAST8_MAX +# undef UINT_LEAST8_MAX +# define INT_LEAST8_MIN INT8_MIN +# define INT_LEAST8_MAX INT8_MAX +# define UINT_LEAST8_MAX UINT8_MAX + +# undef INT_LEAST16_MIN +# undef INT_LEAST16_MAX +# undef UINT_LEAST16_MAX +# define INT_LEAST16_MIN INT16_MIN +# define INT_LEAST16_MAX INT16_MAX +# define UINT_LEAST16_MAX UINT16_MAX + +# undef INT_LEAST32_MIN +# undef INT_LEAST32_MAX +# undef UINT_LEAST32_MAX +# define INT_LEAST32_MIN INT32_MIN +# define INT_LEAST32_MAX INT32_MAX +# define UINT_LEAST32_MAX UINT32_MAX + +# undef INT_LEAST64_MIN +# undef INT_LEAST64_MAX +# ifdef int64_t +# define INT_LEAST64_MIN INT64_MIN +# define INT_LEAST64_MAX INT64_MAX +# endif -#undef UINT_LEAST64_MAX -#ifdef uint64_t -# define UINT_LEAST64_MAX UINT64_MAX -#endif +# undef UINT_LEAST64_MAX +# ifdef uint64_t +# define UINT_LEAST64_MAX UINT64_MAX +# endif /* 7.18.2.3. Limits of fastest minimum-width integer types */ @@ -321,105 +331,105 @@ types have 8, 16, 32, optionally 64 bits. Therefore the fastN_t types are taken from the same list of types. */ -#undef INT_FAST8_MIN -#undef INT_FAST8_MAX -#undef UINT_FAST8_MAX -#define INT_FAST8_MIN LONG_MIN -#define INT_FAST8_MAX LONG_MAX -#define UINT_FAST8_MAX ULONG_MAX - -#undef INT_FAST16_MIN -#undef INT_FAST16_MAX -#undef UINT_FAST16_MAX -#define INT_FAST16_MIN LONG_MIN -#define INT_FAST16_MAX LONG_MAX -#define UINT_FAST16_MAX ULONG_MAX - -#undef INT_FAST32_MIN -#undef INT_FAST32_MAX -#undef UINT_FAST32_MAX -#define INT_FAST32_MIN LONG_MIN -#define INT_FAST32_MAX LONG_MAX -#define UINT_FAST32_MAX ULONG_MAX - -#undef INT_FAST64_MIN -#undef INT_FAST64_MAX -#ifdef int64_t -# define INT_FAST64_MIN INT64_MIN -# define INT_FAST64_MAX INT64_MAX -#endif +# undef INT_FAST8_MIN +# undef INT_FAST8_MAX +# undef UINT_FAST8_MAX +# define INT_FAST8_MIN LONG_MIN +# define INT_FAST8_MAX LONG_MAX +# define UINT_FAST8_MAX ULONG_MAX + +# undef INT_FAST16_MIN +# undef INT_FAST16_MAX +# undef UINT_FAST16_MAX +# define INT_FAST16_MIN LONG_MIN +# define INT_FAST16_MAX LONG_MAX +# define UINT_FAST16_MAX ULONG_MAX + +# undef INT_FAST32_MIN +# undef INT_FAST32_MAX +# undef UINT_FAST32_MAX +# define INT_FAST32_MIN LONG_MIN +# define INT_FAST32_MAX LONG_MAX +# define UINT_FAST32_MAX ULONG_MAX + +# undef INT_FAST64_MIN +# undef INT_FAST64_MAX +# ifdef int64_t +# define INT_FAST64_MIN INT64_MIN +# define INT_FAST64_MAX INT64_MAX +# endif -#undef UINT_FAST64_MAX -#ifdef uint64_t -# define UINT_FAST64_MAX UINT64_MAX -#endif +# undef UINT_FAST64_MAX +# ifdef uint64_t +# define UINT_FAST64_MAX UINT64_MAX +# endif /* 7.18.2.4. Limits of integer types capable of holding object pointers */ -#undef INTPTR_MIN -#undef INTPTR_MAX -#undef UINTPTR_MAX -#define INTPTR_MIN LONG_MIN -#define INTPTR_MAX LONG_MAX -#define UINTPTR_MAX ULONG_MAX +# undef INTPTR_MIN +# undef INTPTR_MAX +# undef UINTPTR_MAX +# define INTPTR_MIN LONG_MIN +# define INTPTR_MAX LONG_MAX +# define UINTPTR_MAX ULONG_MAX /* 7.18.2.5. Limits of greatest-width integer types */ -#undef INTMAX_MIN -#undef INTMAX_MAX -#define INTMAX_MIN (~ INTMAX_MAX) -#ifdef INT64_MAX -# define INTMAX_MAX INT64_MAX -#else -# define INTMAX_MAX INT32_MAX -#endif +# undef INTMAX_MIN +# undef INTMAX_MAX +# define INTMAX_MIN (~ INTMAX_MAX) +# ifdef INT64_MAX +# define INTMAX_MAX INT64_MAX +# else +# define INTMAX_MAX INT32_MAX +# endif -#undef UINTMAX_MAX -#ifdef UINT64_MAX -# define UINTMAX_MAX UINT64_MAX -#else -# define UINTMAX_MAX UINT32_MAX -#endif +# undef UINTMAX_MAX +# ifdef UINT64_MAX +# define UINTMAX_MAX UINT64_MAX +# else +# define UINTMAX_MAX UINT32_MAX +# endif /* 7.18.3. Limits of other integer types */ /* ptrdiff_t limits */ -#undef PTRDIFF_MIN -#undef PTRDIFF_MAX -#define PTRDIFF_MIN \ +# undef PTRDIFF_MIN +# undef PTRDIFF_MAX +# define PTRDIFF_MIN \ _STDINT_MIN (1, @BITSIZEOF_PTRDIFF_T@, 0 at PTRDIFF_T_SUFFIX@) -#define PTRDIFF_MAX \ +# define PTRDIFF_MAX \ _STDINT_MAX (1, @BITSIZEOF_PTRDIFF_T@, 0 at PTRDIFF_T_SUFFIX@) /* sig_atomic_t limits */ -#undef SIG_ATOMIC_MIN -#undef SIG_ATOMIC_MAX -#define SIG_ATOMIC_MIN \ +# undef SIG_ATOMIC_MIN +# undef SIG_ATOMIC_MAX +# define SIG_ATOMIC_MIN \ _STDINT_MIN (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ 0 at SIG_ATOMIC_T_SUFFIX@) -#define SIG_ATOMIC_MAX \ +# define SIG_ATOMIC_MAX \ _STDINT_MAX (@HAVE_SIGNED_SIG_ATOMIC_T@, @BITSIZEOF_SIG_ATOMIC_T@, \ 0 at SIG_ATOMIC_T_SUFFIX@) /* size_t limit */ -#undef SIZE_MAX -#define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0 at SIZE_T_SUFFIX@) +# undef SIZE_MAX +# define SIZE_MAX _STDINT_MAX (0, @BITSIZEOF_SIZE_T@, 0 at SIZE_T_SUFFIX@) /* wchar_t limits */ -#undef WCHAR_MIN -#undef WCHAR_MAX -#define WCHAR_MIN \ +# undef WCHAR_MIN +# undef WCHAR_MAX +# define WCHAR_MIN \ _STDINT_MIN (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0 at WCHAR_T_SUFFIX@) -#define WCHAR_MAX \ +# define WCHAR_MAX \ _STDINT_MAX (@HAVE_SIGNED_WCHAR_T@, @BITSIZEOF_WCHAR_T@, 0 at WCHAR_T_SUFFIX@) /* wint_t limits */ -#undef WINT_MIN -#undef WINT_MAX -#define WINT_MIN \ +# undef WINT_MIN +# undef WINT_MAX +# define WINT_MIN \ _STDINT_MIN (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0 at WINT_T_SUFFIX@) -#define WINT_MAX \ +# define WINT_MAX \ _STDINT_MAX (@HAVE_SIGNED_WINT_T@, @BITSIZEOF_WINT_T@, 0 at WINT_T_SUFFIX@) #endif /* !defined __cplusplus || defined __STDC_LIMIT_MACROS */ @@ -434,58 +444,58 @@ /* Here we assume a standard architecture where the hardware integer types have 8, 16, 32, optionally 64 bits, and int is 32 bits. */ -#undef INT8_C -#undef UINT8_C -#define INT8_C(x) x -#define UINT8_C(x) x - -#undef INT16_C -#undef UINT16_C -#define INT16_C(x) x -#define UINT16_C(x) x - -#undef INT32_C -#undef UINT32_C -#define INT32_C(x) x -#define UINT32_C(x) x ## U - -#undef INT64_C -#undef UINT64_C -#if LONG_MAX >> 31 >> 31 == 1 -# define INT64_C(x) x##L -#elif defined _MSC_VER -# define INT64_C(x) x##i64 -#elif @HAVE_LONG_LONG_INT@ -# define INT64_C(x) x##LL -#endif -#if ULONG_MAX >> 31 >> 31 >> 1 == 1 -# define UINT64_C(x) x##UL -#elif defined _MSC_VER -# define UINT64_C(x) x##ui64 -#elif @HAVE_UNSIGNED_LONG_LONG_INT@ -# define UINT64_C(x) x##ULL -#endif +# undef INT8_C +# undef UINT8_C +# define INT8_C(x) x +# define UINT8_C(x) x + +# undef INT16_C +# undef UINT16_C +# define INT16_C(x) x +# define UINT16_C(x) x + +# undef INT32_C +# undef UINT32_C +# define INT32_C(x) x +# define UINT32_C(x) x ## U + +# undef INT64_C +# undef UINT64_C +# if LONG_MAX >> 31 >> 31 == 1 +# define INT64_C(x) x##L +# elif defined _MSC_VER +# define INT64_C(x) x##i64 +# elif @HAVE_LONG_LONG_INT@ +# define INT64_C(x) x##LL +# endif +# if ULONG_MAX >> 31 >> 31 >> 1 == 1 +# define UINT64_C(x) x##UL +# elif defined _MSC_VER +# define UINT64_C(x) x##ui64 +# elif @HAVE_UNSIGNED_LONG_LONG_INT@ +# define UINT64_C(x) x##ULL +# endif /* 7.18.4.2. Macros for greatest-width integer constants */ -#undef INTMAX_C -#if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1 -# define INTMAX_C(x) x##LL -#elif defined int64_t -# define INTMAX_C(x) INT64_C(x) -#else -# define INTMAX_C(x) x##L -#endif +# undef INTMAX_C +# if @HAVE_LONG_LONG_INT@ && LONG_MAX >> 30 == 1 +# define INTMAX_C(x) x##LL +# elif defined int64_t +# define INTMAX_C(x) INT64_C(x) +# else +# define INTMAX_C(x) x##L +# endif -#undef UINTMAX_C -#if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1 -# define UINTMAX_C(x) x##ULL -#elif defined uint64_t -# define UINTMAX_C(x) UINT64_C(x) -#else -# define UINTMAX_C(x) x##UL -#endif +# undef UINTMAX_C +# if @HAVE_UNSIGNED_LONG_LONG_INT@ && ULONG_MAX >> 31 == 1 +# define UINTMAX_C(x) x##ULL +# elif defined uint64_t +# define UINTMAX_C(x) UINT64_C(x) +# else +# define UINTMAX_C(x) x##UL +# endif +#endif /* !(defined __ANDROID__ && ...) */ #endif /* !defined __cplusplus || defined __STDC_CONSTANT_MACROS */ - #endif /* _GL_STDINT_H */ ----------------------------------------------------------------------- Summary of changes: gl/stdint_.h | 368 ++++++++++++++++++++++++++++++---------------------------- 1 files changed, 189 insertions(+), 179 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue Jan 31 19:07:04 2012 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 31 Jan 2012 19:07:04 +0100 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.18-17-g4a9d69c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 4a9d69ca87d4e21b015b7ceab6b2b6ba3809ec22 (commit) via 92844f475ba7989772c407fbced3229379053cf4 (commit) from a4b3a420a16a5d3b900ce6c7c06e00a83fee4953 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4a9d69ca87d4e21b015b7ceab6b2b6ba3809ec22 Author: Werner Koch Date: Tue Jan 31 18:08:24 2012 +0100 Update copyright year. diff --git a/Makefile.am b/Makefile.am index a0a9aa1..447976e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ -# Makefile.am - main makefile for NewPG/GnuPG -# Copyright (C) 2001, 2004 Free Software Foundation, Inc. +# Makefile.am - Top level makefile for GnuPG +# Copyright (C) 2001, 2004, 2012 Free Software Foundation, Inc. # # This file is part of GnuPG. # diff --git a/README b/README index 5ba647c..e7289c9 100644 --- a/README +++ b/README @@ -2,8 +2,9 @@ ========================= Version 2.0 - Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009, 2010, 2011, + 2012 Free Software Foundation, Inc. INTRODUCTION @@ -35,7 +36,7 @@ GnuPG 2.0 depends on the following packages: libgcrypt (ftp://ftp.gnupg.org/gcrypt/libgcrypt/) libksba (ftp://ftp.gnupg.org/gcrypt/libksba/) libassuan >= 2.0 (ftp://ftp.gnupg.org/gcrypt/libassuan/) - + You also need the Pinentry package for most function of GnuPG; however it is not a build requirement. Pinentry is available at ftp://ftp.gnupg.org/gcrypt/pinentry/ . @@ -105,7 +106,7 @@ and use them if possible. You may also find GnuPG mirrored on some of the regular GNU mirrors. We have some mailing lists dedicated to GnuPG: - + gnupg-announce at gnupg.org For important announcements like new versions and such stuff. This is a moderated list and has very low traffic. diff --git a/configure.ac b/configure.ac index 758d00c..289e0f9 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,7 @@ # configure.ac - for GnuPG 2.0 # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -# 2006, 2007, 2008, 2010, 2011 Free Software Foundation, Inc. +# 2006, 2007, 2008, 2010, 2011, +# 2012 Free Software Foundation, Inc. # # This file is part of GnuPG. # diff --git a/jnlib/argparse.c b/jnlib/argparse.c index dac6878..c9b5384 100644 --- a/jnlib/argparse.c +++ b/jnlib/argparse.c @@ -153,8 +153,8 @@ static void show_version(void); static void initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno ) { - if( !(arg->flags & (1<<15)) ) - { + if( !(arg->flags & (1<<15)) ) + { /* Initialize this instance. */ arg->internal.idx = 0; arg->internal.last = NULL; @@ -167,13 +167,13 @@ initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno ) if ( *arg->argc < 0 ) jnlib_log_bug ("invalid argument for arg_parsee\n"); } - - + + if (arg->err) { /* Last option was erroneous. */ const char *s; - + if (filename) { if ( arg->r_opt == ARGPARSE_UNEXPECTED_ARG ) @@ -194,10 +194,10 @@ initialize( ARGPARSE_ARGS *arg, const char *filename, unsigned *lineno ) s = _("invalid option"); jnlib_log_error ("%s:%u: %s\n", filename, *lineno, s); } - else + else { s = arg->internal.last? arg->internal.last:"[??]"; - + if ( arg->r_opt == ARGPARSE_MISSING_ARG ) jnlib_log_error (_("missing argument for option \"%.50s\"\n"), s); else if ( arg->r_opt == ARGPARSE_UNEXPECTED_ARG ) @@ -271,10 +271,10 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, char *buffer = NULL; size_t buflen = 0; int in_alias=0; - + if (!fp) /* Divert to to arg_parse() in this case. */ return arg_parse (arg, opts); - + initialize (arg, filename, lineno); /* Find the next keyword. */ @@ -302,9 +302,9 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, arg->r_opt = ((opts[idx].flags & ARGPARSE_OPT_COMMAND) ? ARGPARSE_INVALID_COMMAND : ARGPARSE_INVALID_OPTION); - else if (!(opts[idx].flags & 7)) + else if (!(opts[idx].flags & 7)) arg->r_type = 0; /* Does not take an arg. */ - else if ((opts[idx].flags & 8) ) + else if ((opts[idx].flags & 8) ) arg->r_type = 0; /* Arg is optional. */ else arg->r_opt = ARGPARSE_MISSING_ARG; @@ -312,13 +312,13 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, break; } else if (state == 3) - { + { /* No argument found. */ if (in_alias) arg->r_opt = ARGPARSE_MISSING_ARG; - else if (!(opts[idx].flags & 7)) + else if (!(opts[idx].flags & 7)) arg->r_type = 0; /* Does not take an arg. */ - else if ((opts[idx].flags & 8)) + else if ((opts[idx].flags & 8)) arg->r_type = 0; /* No optional argument. */ else arg->r_opt = ARGPARSE_MISSING_ARG; @@ -328,14 +328,14 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, else if (state == 4) { /* Has an argument. */ - if (in_alias) + if (in_alias) { if (!buffer) arg->r_opt = ARGPARSE_UNEXPECTED_ARG; - else + else { char *p; - + buffer[i] = 0; p = strpbrk (buffer, " \t"); if (p) @@ -369,13 +369,13 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, } else buffer[i] = 0; - + if (buffer) { trim_spaces (buffer); p = buffer; if (*p == '"') - { + { /* Remove quotes. */ p++; if (*p && p[strlen(p)-1] == '\"' ) @@ -422,7 +422,7 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, in_alias = 1; state = 3; } - else + else { arg->r_opt = ((opts[idx].flags & ARGPARSE_OPT_COMMAND) ? ARGPARSE_INVALID_COMMAND @@ -444,13 +444,13 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, } } else if (state == 4) - { + { /* Collect the argument. */ if (buffer) { if (i < buflen-1) buffer[i++] = c; - else + else { char *tmp; size_t tmplen = buflen + 50; @@ -472,7 +472,7 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, } else if (i < DIM(keyword)-1) keyword[i++] = c; - else + else { size_t tmplen = DIM(keyword) + 50; buffer = jnlib_malloc (tmplen); @@ -494,13 +494,13 @@ optfile_parse (FILE *fp, const char *filename, unsigned *lineno, arg->r_opt = ARGPARSE_KEYWORD_TOO_LONG; state = -1; /* Skip rest of line and leave. */ } - else + else { keyword[i++] = c; state = 2; } } - + return arg->r_opt; } @@ -562,7 +562,7 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) char **argv; char *s, *s2; int i; - + initialize( arg, NULL, NULL ); argc = *arg->argc; argv = *arg->argv; @@ -573,10 +573,10 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) /* Skip the first argument. */ argc--; argv++; idx++; } - + next_one: - if (!argc) - { + if (!argc) + { /* No more args. */ arg->r_opt = 0; goto leave; /* Ready. */ @@ -585,14 +585,14 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) s = *argv; arg->internal.last = s; - if (arg->internal.stopped && (arg->flags & ARGPARSE_FLAG_ALL)) + if (arg->internal.stopped && (arg->flags & ARGPARSE_FLAG_ALL)) { arg->r_opt = ARGPARSE_IS_ARG; /* Not an option but an argument. */ arg->r_type = 2; arg->r.ret_str = s; argc--; argv++; idx++; /* set to next one */ } - else if( arg->internal.stopped ) + else if( arg->internal.stopped ) { arg->r_opt = 0; goto leave; /* Ready. */ @@ -601,10 +601,10 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) { /* Long option. */ char *argpos; - + arg->internal.inarg = 0; if (!s[2] && !(arg->flags & ARGPARSE_FLAG_NOSTOP)) - { + { /* Stop option processing. */ arg->internal.stopped = 1; argc--; argv++; idx++; @@ -643,7 +643,7 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) fputs ("--dump-options\n--help\n--version\n--warranty\n", stdout); exit (0); } - + if ( i == -2 ) arg->r_opt = ARGPARSE_AMBIGUOUS_OPTION; else if ( i == -1 ) @@ -673,40 +673,40 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) { arg->r_opt = ARGPARSE_MISSING_ARG; } - else if ( !argpos && *s2 == '-' - && (opts[i].flags & ARGPARSE_OPT_OPTIONAL) ) + else if ( !argpos && *s2 == '-' + && (opts[i].flags & ARGPARSE_OPT_OPTIONAL) ) { /* The argument is optional and the next seems to be an option. We do not check this possible option but assume no argument */ arg->r_type = ARGPARSE_TYPE_NONE; } - else + else { set_opt_arg (arg, opts[i].flags, s2); - if ( !argpos ) + if ( !argpos ) { argc--; argv++; idx++; /* Skip one. */ } } } else - { + { /* Does not take an argument. */ if ( argpos ) - arg->r_type = ARGPARSE_UNEXPECTED_ARG; + arg->r_type = ARGPARSE_UNEXPECTED_ARG; else arg->r_type = 0; } argc--; argv++; idx++; /* Set to next one. */ } - else if ( (*s == '-' && s[1]) || arg->internal.inarg ) + else if ( (*s == '-' && s[1]) || arg->internal.inarg ) { /* Short option. */ int dash_kludge = 0; i = 0; - if ( !arg->internal.inarg ) + if ( !arg->internal.inarg ) { arg->internal.inarg++; if ( (arg->flags & ARGPARSE_FLAG_ONEDASH) ) @@ -727,7 +727,7 @@ arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts) if ( opts[i].short_opt == *s ) break; } - + if ( !opts[i].short_opt && ( *s == 'h' || *s == '?' ) ) show_help (opts, arg->flags); @@ -837,13 +837,13 @@ long_opt_strlen( ARGPARSE_OPTS *o ) { size_t n = strlen (o->long_opt); - if ( o->description && *o->description == '|' ) + if ( o->description && *o->description == '|' ) { const char *s; #ifdef JNLIB_NEED_UTF8CONV int is_utf8 = is_native_utf8 (); #endif - + s=o->description+1; if ( *s != '=' ) n++; @@ -875,7 +875,7 @@ static void show_help (ARGPARSE_OPTS *opts, unsigned int flags) { const char *s; - + show_version (); putchar ('\n'); s = strusage(41); @@ -904,8 +904,8 @@ show_help (ARGPARSE_OPTS *opts, unsigned int flags) if ( s && *s== '@' && !s[1] ) /* Hide this line. */ continue; if ( s && *s == '@' ) /* Unindented comment only line. */ - { - for (s++; *s; s++ ) + { + for (s++; *s; s++ ) { if ( *s == '\n' ) { @@ -923,9 +923,9 @@ show_help (ARGPARSE_OPTS *opts, unsigned int flags) if ( opts[i].short_opt < 256 ) { printf (" -%c", opts[i].short_opt); - if ( !opts[i].long_opt ) + if ( !opts[i].long_opt ) { - if (s && *s == '|' ) + if (s && *s == '|' ) { putchar (' '); j++; for (s++ ; *s && *s != '|'; s++, j++ ) @@ -937,11 +937,11 @@ show_help (ARGPARSE_OPTS *opts, unsigned int flags) } else fputs(" ", stdout); - if ( opts[i].long_opt ) + if ( opts[i].long_opt ) { j += printf ("%c --%s", opts[i].short_opt < 256?',':' ', opts[i].long_opt ); - if (s && *s == '|' ) + if (s && *s == '|' ) { if ( *++s != '=' ) { @@ -970,7 +970,7 @@ show_help (ARGPARSE_OPTS *opts, unsigned int flags) { if ( *s == '\n' ) { - if ( s[1] ) + if ( s[1] ) { putchar ('\n'); for (j=0; j < indent; j++ ) @@ -987,10 +987,10 @@ show_help (ARGPARSE_OPTS *opts, unsigned int flags) puts ("\n(A single dash may be used instead of the double ones)"); } if ( (s=strusage(19)) ) - { + { /* bug reports to ... */ char *s2; - + putchar('\n'); s2 = strstr (s, "@EMAIL@"); if (s2) @@ -1066,7 +1066,7 @@ usage (int level) putc ('\n', stderr); exit (2); } - else if (level == 2) + else if (level == 2) { puts (strusage(41)); exit (0); @@ -1096,10 +1096,10 @@ const char * strusage( int level ) { const char *p = strusage_handler? strusage_handler(level) : NULL; - + if ( p ) return p; - + switch ( level ) { case 10: p = ("License GPLv3+: GNU GPL version 3 or later " @@ -1107,7 +1107,7 @@ strusage( int level ) break; case 11: p = "foo"; break; case 13: p = "0.0"; break; - case 14: p = "Copyright (C) 2011 Free Software Foundation, Inc."; break; + case 14: p = "Copyright (C) 2012 Free Software Foundation, Inc."; break; case 15: p = "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n"; @@ -1127,7 +1127,7 @@ strusage( int level ) case 40: /* short and long usage */ case 41: p = ""; break; } - + return p; } @@ -1178,7 +1178,7 @@ main(int argc, char **argv) case 'c': opt.crf = pargs.r_type? pargs.r.ret_str:"a.crf"; break; case 'm': opt.myopt = pargs.r_type? pargs.r.ret_int : 1; break; case 500: opt.a_long_one++; break; - default : pargs.err = ARGPARSE_PRINT_WARNING; break; + default : pargs.err = ARGPARSE_PRINT_WARNING; break; } } for(i=0; i < argc; i++ ) diff --git a/tools/watchgnupg.c b/tools/watchgnupg.c index 145a76b..aae1120 100644 --- a/tools/watchgnupg.c +++ b/tools/watchgnupg.c @@ -40,7 +40,7 @@ #define MYVERSION_LINE PGM " (GnuPG) " VERSION #define BUGREPORT_LINE "\nReport bugs to .\n" #else -#define MYVERSION_LINE PGM +#define MYVERSION_LINE PGM #define BUGREPORT_LINE "" #endif #if !defined(SUN_LEN) || !defined(PF_LOCAL) || !defined(AF_LOCAL) @@ -109,7 +109,7 @@ xrealloc (void *old, size_t n) die ("out of core"); return p; } - + struct client_s { struct client_s *next; @@ -117,7 +117,7 @@ struct client_s { size_t size; /* Allocated size of buffer. */ size_t len; /* Current length of buffer. */ unsigned char *buffer; /* Buffer to with data already read. */ - + }; typedef struct client_s *client_t; @@ -128,7 +128,7 @@ print_fd_and_time (int fd) { struct tm *tp; time_t atime = time (NULL); - + tp = localtime (&atime); printf ("%3d - %04d-%02d-%02d %02d:%02d:%02d ", fd, @@ -150,7 +150,7 @@ print_line (client_t c, const char *line) if (c->buffer && c->len) { print_fd_and_time (c->fd); - fwrite (c->buffer, c->len, 1, stdout); + fwrite (c->buffer, c->len, 1, stdout); putc ('\n', stdout); c->len = 0; } @@ -162,10 +162,10 @@ print_line (client_t c, const char *line) print_fd_and_time (c->fd); if (c->buffer && c->len) { - fwrite (c->buffer, c->len, 1, stdout); + fwrite (c->buffer, c->len, 1, stdout); c->len = 0; } - fwrite (line, s - line + 1, 1, stdout); + fwrite (line, s - line + 1, 1, stdout); line = s + 1; } n = strlen (line); @@ -188,12 +188,12 @@ static void print_version (int with_help) { fputs (MYVERSION_LINE "\n" - "Copyright (C) 2004 Free Software Foundation, Inc.\n" + "Copyright (C) 2012 Free Software Foundation, Inc.\n" "This program comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions. See the file COPYING for details.\n", stdout); - + if (with_help) fputs ("\n" "Usage: " PGM " [OPTIONS] SOCKETNAME\n" @@ -204,11 +204,11 @@ print_version (int with_help) " --version print version of the program and exit\n" " --help display this help and exit\n" BUGREPORT_LINE, stdout ); - + exit (0); } -int +int main (int argc, char **argv) { int last_argc = -1; @@ -219,7 +219,7 @@ main (int argc, char **argv) int server; int flags; client_t client_list = NULL; - + if (argc) { argc--; argv++; @@ -246,8 +246,8 @@ main (int argc, char **argv) force = 1; argc--; argv++; } - } - + } + if (argc != 1) { fprintf (stderr, "usage: " PGM " socketname\n"); @@ -272,7 +272,7 @@ main (int argc, char **argv) die ("fcntl (F_GETFL) failed: %s\n", strerror (errno)); if ( fcntl (server, F_SETFL, (flags | O_NONBLOCK)) == -1) die ("fcntl (F_SETFL) failed: %s\n", strerror (errno)); - + memset (&srvr_addr, 0, sizeof srvr_addr); srvr_addr.sun_family = AF_LOCAL; @@ -280,10 +280,10 @@ main (int argc, char **argv) srvr_addr.sun_path[sizeof (srvr_addr.sun_path) - 1] = 0; addrlen = SUN_LEN (&srvr_addr); - + again: if (bind (server, (struct sockaddr *) &srvr_addr, addrlen)) - { + { if (errno == EADDRINUSE && force) { force = 0; @@ -320,7 +320,7 @@ main (int argc, char **argv) continue; /* Ignore any errors. */ if (FD_ISSET (server, &rfds)) /* New connection. */ - { + { struct sockaddr_un clnt_addr; int fd; @@ -335,7 +335,7 @@ main (int argc, char **argv) close (fd); printf ("[connection request denied: too many connections]\n"); } - else + else { for (client = client_list; client && client->fd != -1; client = client->next) @@ -355,7 +355,7 @@ main (int argc, char **argv) { char line[256]; int n; - + n = read (client->fd, line, sizeof line - 1); if (n < 0) { @@ -366,7 +366,7 @@ main (int argc, char **argv) close (client->fd); client->fd = -1; } - else if (!n) + else if (!n) { print_line (client, NULL); /* flush */ close (client->fd); commit 92844f475ba7989772c407fbced3229379053cf4 Author: Werner Koch Date: Tue Jan 31 18:01:17 2012 +0100 Require an installed gitlog_to_changelog for make dist. * scripts/gitlog-to-changelog: Remove. * Makefile.am (GITLOG_TO_CHANGELOG): New. (gen-ChangeLog): Use it. Add set -e. diff --git a/Makefile.am b/Makefile.am index 8a54655..a0a9aa1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,6 +22,8 @@ ACLOCAL_AMFLAGS = -I m4 -I gl/m4 AUTOMAKE_OPTIONS = dist-bzip2 no-dist-gzip DISTCHECK_CONFIGURE_FLAGS = --enable-symcryptrun --enable-mailto --enable-gpgtar +GITLOG_TO_CHANGELOG=gitlog-to-changelog + EXTRA_DIST = scripts/config.rpath autogen.sh README.SVN \ ChangeLog-2011 po/ChangeLog-2011 scripts/ChangeLog-2011 @@ -86,9 +88,10 @@ dist-hook: gen-ChangeLog gen_start_date = 2011-12-01T06:00:00 .PHONY: gen-ChangeLog gen-ChangeLog: + set -e; \ if test -d $(top_srcdir)/.git; then \ (cd $(top_srcdir) && \ - ./scripts/gitlog-to-changelog \ + $(GITLOG_TO_CHANGELOG) --append-dot --tear-off \ --amend=scripts/git-log-fix \ --since=$(gen_start_date) ) > $(distdir)/cl-t; \ cat $(top_srcdir)/scripts/git-log-footer >> $(distdir)/cl-t; \ @@ -99,5 +102,3 @@ gen-ChangeLog: stowinstall: $(MAKE) $(AM_MAKEFLAGS) install prefix=/usr/local/stow/gnupg - - diff --git a/scripts/gitlog-to-changelog b/scripts/gitlog-to-changelog deleted file mode 100755 index 056b9b7..0000000 --- a/scripts/gitlog-to-changelog +++ /dev/null @@ -1,351 +0,0 @@ -eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' - & eval 'exec perl -wS "$0" $argv:q' - if 0; -# Convert git log output to ChangeLog format. - -my $VERSION = '2012-01-20 10:14'; # UTC -# The definition above must lie within the first 8 lines in order -# for the Emacs time-stamp write hook (at end) to update it. -# If you change this file with Emacs, please let the write hook -# do its job. Otherwise, update this string manually. - -# Copyright (C) 2008-2011 Free Software Foundation, Inc. - -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# This program 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 General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# Written by Jim Meyering - -use strict; -use warnings; -use Getopt::Long; -use POSIX qw(strftime); - -(my $ME = $0) =~ s|.*/||; - -# use File::Coda; # http://meyering.net/code/Coda/ -END { - defined fileno STDOUT or return; - close STDOUT and return; - warn "$ME: failed to close standard output: $!\n"; - $? ||= 1; -} - -sub usage ($) -{ - my ($exit_code) = @_; - my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); - if ($exit_code != 0) - { - print $STREAM "Try `$ME --help' for more information.\n"; - } - else - { - print $STREAM < ChangeLog - $ME -- -n 5 foo > last-5-commits-to-branch-foo - -In a FILE specified via --amend, comment lines (starting with "#") are ignored. -FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on -a line) referring to a commit in the current project, and CODE refers to one -or more consecutive lines of Perl code. Pairs must be separated by one or -more blank line. - -Here is sample input for use with --amend=FILE, from coreutils: - -3a169f4c5d9159283548178668d2fae6fced3030 -# fix typo in title: -s/all tile types/all file types/ - -1379ed974f1fa39b12e2ffab18b3f7a607082202 -# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. -# Change the author to be Paul. Note the escaped "@": -s,Jim .*>,Paul Eggert , - -EOF - } - exit $exit_code; -} - -# If the string $S is a well-behaved file name, simply return it. -# If it contains white space, quotes, etc., quote it, and return the new string. -sub shell_quote($) -{ - my ($s) = @_; - if ($s =~ m![^\w+/.,-]!) - { - # Convert each single quote to '\'' - $s =~ s/\'/\'\\\'\'/g; - # Then single quote the string. - $s = "'$s'"; - } - return $s; -} - -sub quoted_cmd(@) -{ - return join (' ', map {shell_quote $_} @_); -} - -# Parse file F. -# Comment lines (starting with "#") are ignored. -# F must consist of pairs where SHA is a 40-byte SHA1 -# (alone on a line) referring to a commit in the current project, and -# CODE refers to one or more consecutive lines of Perl code. -# Pairs must be separated by one or more blank line. -sub parse_amend_file($) -{ - my ($f) = @_; - - open F, '<', $f - or die "$ME: $f: failed to open for reading: $!\n"; - - my $fail; - my $h = {}; - my $in_code = 0; - my $sha; - while (defined (my $line = )) - { - $line =~ /^\#/ - and next; - chomp $line; - $line eq '' - and $in_code = 0, next; - - if (!$in_code) - { - $line =~ /^([0-9a-fA-F]{40})$/ - or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), - $fail = 1, next; - $sha = lc $1; - $in_code = 1; - exists $h->{$sha} - and (warn "$ME: $f:$.: duplicate SHA1\n"), - $fail = 1, next; - } - else - { - $h->{$sha} ||= ''; - $h->{$sha} .= "$line\n"; - } - } - close F; - - $fail - and exit 1; - - return $h; -} - -{ - my $since_date; - my $format_string = '%s%n%b%n'; - my $amend_file; - my $append_dot = 0; - GetOptions - ( - help => sub { usage 0 }, - version => sub { print "$ME version $VERSION\n"; exit }, - 'since=s' => \$since_date, - 'format=s' => \$format_string, - 'amend=s' => \$amend_file, - 'append-dot' => \$append_dot, - ) or usage 1; - - - defined $since_date - and unshift @ARGV, "--since=$since_date"; - - # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) - # that makes a correction in the log or attribution of that commit. - my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; - - my @cmd = (qw (git log --log-size), - '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV); - open PIPE, '-|', @cmd - or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n" - . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); - - my $prev_date_line = ''; - my @prev_coauthors = (); - - while (1) - { - defined (my $in = ) - or last; - $in =~ /^log size (\d+)$/ - or die "$ME:$.: Invalid line (expected log size):\n$in"; - my $log_nbytes = $1; - - my $log; - my $n_read = read PIPE, $log, $log_nbytes; - $n_read == $log_nbytes - or die "$ME:$.: unexpected EOF\n"; - - # Skip log entries with the default merge commit message. - $log =~ /^.*\n\nMerge branch '.*\n\s*/ - and goto SKIPCOMMIT; - - # Extract leading hash. - my ($sha, $rest) = split ':', $log, 2; - defined $sha - or die "$ME:$.: malformed log entry\n"; - $sha =~ /^[0-9a-fA-F]{40}$/ - or die "$ME:$.: invalid SHA1: $sha\n"; - - # If this commit's log requires any transformation, do it now. - my $code = $amend_code->{$sha}; - if (defined $code) - { - eval 'use Safe'; - my $s = new Safe; - # Put the unpreprocessed entry into "$_". - $_ = $rest; - - # Let $code operate on it, safely. - my $r = $s->reval("$code") - or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; - - # Note that we've used this entry. - delete $amend_code->{$sha}; - - # Update $rest upon success. - $rest = $_; - } - - my @line = split "\n", $rest; - my $author_line = shift @line; - defined $author_line - or die "$ME:$.: unexpected EOF\n"; - $author_line =~ /^(\d+) (.*>)$/ - or die "$ME:$.: Invalid line " - . "(expected date/author/email):\n$author_line\n"; - - my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1)); - - # Format 'Co-authored-by: A U Thor ' lines in - # standard multi-author ChangeLog format. - my @coauthors = grep /^Co-authored-by:.*$/, @line; - for (@coauthors) - { - s/^Co-authored-by:\s*/\t /; - s/\s*/ - or warn "$ME: warning: missing email address for " - . substr ($_, 5) . "\n"; - } - - # If this header would be the same as the previous date/name/email/ - # coauthors header, then arrange not to print it. - if ($date_line ne $prev_date_line or "@coauthors" ne "@prev_coauthors") - { - $prev_date_line eq '' - or print "\n"; - print $date_line; - @coauthors - and print join ("\n", @coauthors), "\n"; - } - $prev_date_line = $date_line; - @prev_coauthors = @coauthors; - - # Omit "Co-authored-by..." and "Signed-off-by..." lines. - @line = grep !/^Signed-off-by: .*>$/, @line; - @line = grep !/^Co-authored-by: /, @line; - - # Remove leading and trailing blank lines. - if (@line) - { - while ($line[0] =~ /^\s*$/) { shift @line; } - while ($line[$#line] =~ /^\s*$/) { pop @line; } - } - - # If there were any lines - if (@line == 0) - { - warn "$ME: warning: empty commit message:\n $date_line\n"; - } - else - { - if ($append_dot) - { - # If the first line of the message has enough room, then - if (length $line[0] < 72) - { - # append a dot if there is no other punctuation or blank - # at the end. - $line[0] =~ /[[:punct:]\s]$/ - or $line[0] .= '.'; - } - } - - # Prefix each non-empty line with a TAB. - @line = map { length $_ ? "\t$_" : '' } @line; - - print "\n", join ("\n", @line), "\n"; - } - - SKIPCOMMIT: - defined ($in = ) - or last; - $in ne "\n" - and die "$ME:$.: unexpected line:\n$in"; - } - - close PIPE - or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; - # FIXME-someday: include $PROCESS_STATUS in the diagnostic - - # Complain about any unused entry in the --amend=F specified file. - my $fail = 0; - foreach my $sha (keys %$amend_code) - { - warn "$ME:$amend_file: unused entry: $sha\n"; - $fail = 1; - } - - exit $fail; -} - -# Local Variables: -# mode: perl -# indent-tabs-mode: nil -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "my $VERSION = '" -# time-stamp-format: "%:y-%02m-%02d %02H:%02M" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "'; # UTC" -# End: ----------------------------------------------------------------------- Summary of changes: Makefile.am | 11 +- README | 9 +- configure.ac | 3 +- jnlib/argparse.c | 122 ++++++++-------- scripts/gitlog-to-changelog | 351 ------------------------------------------- tools/watchgnupg.c | 42 +++--- 6 files changed, 95 insertions(+), 443 deletions(-) delete mode 100755 scripts/gitlog-to-changelog hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org