diff --git a/g10/ChangeLog b/g10/ChangeLog index 60c9d8cf8..623ea22e3 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,13 @@ +2009-05-26 Werner Koch + + * parse-packet.c (mpi_read): Workaround for zero-length MPI bug in + libgcrypt<1.5.0. + +2009-05-22 Werner Koch + + * signal.c (got_fatal_signal): Call new function + tty_cleanup_after_signal. + 2009-05-20 Werner Koch * gpg.c (main): Fix --fingerprint/--with-fingerprint command diff --git a/g10/parse-packet.c b/g10/parse-packet.c index fd01e7635..324ab5e2e 100644 --- a/g10/parse-packet.c +++ b/g10/parse-packet.c @@ -139,9 +139,19 @@ mpi_read (iobuf_t inp, unsigned int *ret_nread, int secure) p[i+2] = iobuf_get(inp) & 0xff; nread++; } - if ( gcry_mpi_scan( &a, GCRYMPI_FMT_PGP, buf, nread, &nread ) ) - a = NULL; - + + if (nread >= 2 && !(buf[0] << 8 | buf[1])) + { + /* Libgcrypt < 1.5.0 accidently rejects zero-length (i.e. zero) + MPIs. We fix this here. */ + a = gcry_mpi_new (0); + } + else + { + if ( gcry_mpi_scan( &a, GCRYMPI_FMT_PGP, buf, nread, &nread ) ) + a = NULL; + } + leave: gcry_free(buf); if ( nread > *ret_nread ) diff --git a/g10/signal.c b/g10/signal.c index 2cabd1990..c9e683f72 100644 --- a/g10/signal.c +++ b/g10/signal.c @@ -81,6 +81,7 @@ got_fatal_signal( int sig ) gcry_control (GCRYCTL_TERM_SECMEM ); tty_cleanup_rl_after_signal (); + tty_cleanup_after_signal (); /* Better don't translate these messages. */ write(2, "\n", 1 );