aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2009-05-26 09:29:02 +0000
committerWerner Koch <[email protected]>2009-05-26 09:29:02 +0000
commit21ad035cc9fef070df8ff09aaebad604411442c7 (patch)
tree4d574eb10b880837f7eb785fc3f8d9e3ccd4aa28
parentMake PIN changing code work for v2 cards. (diff)
downloadgnupg-21ad035cc9fef070df8ff09aaebad604411442c7.tar.gz
gnupg-21ad035cc9fef070df8ff09aaebad604411442c7.zip
Fix a signal cleanup problem.
Fix zero length MPI reading.
-rw-r--r--g10/ChangeLog10
-rw-r--r--g10/parse-packet.c16
-rw-r--r--g10/signal.c1
3 files changed, 24 insertions, 3 deletions
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 <[email protected]>
+
+ * parse-packet.c (mpi_read): Workaround for zero-length MPI bug in
+ libgcrypt<1.5.0.
+
+2009-05-22 Werner Koch <[email protected]>
+
+ * signal.c (got_fatal_signal): Call new function
+ tty_cleanup_after_signal.
+
2009-05-20 Werner Koch <[email protected]>
* 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 );