aboutsummaryrefslogtreecommitdiffstats
path: root/g10/free-packet.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2020-06-09 16:16:44 +0000
committerWerner Koch <[email protected]>2020-06-09 16:16:44 +0000
commiteeb599c9e261586a664430058b7cfad7025a503f (patch)
tree242b3d9dbd7ed0c912e85f84a92e441ce90aaeaa /g10/free-packet.c
parentgpg: Extend the TRUST_ status lines. (diff)
downloadgnupg-eeb599c9e261586a664430058b7cfad7025a503f.tar.gz
gnupg-eeb599c9e261586a664430058b7cfad7025a503f.zip
gpg: Fix for new SOS changes when used with Libgcrypt < 1.8.6.
* g10/free-packet.c (is_mpi_copy_broken): New. (my_mpi_copy): Mix gcry_mpi_copy. -- Note that in this case it is better to do a runtime check. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'g10/free-packet.c')
-rw-r--r--g10/free-packet.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/g10/free-packet.c b/g10/free-packet.c
index e15ad3f04..6bc534656 100644
--- a/g10/free-packet.c
+++ b/g10/free-packet.c
@@ -30,6 +30,22 @@
#include "options.h"
+/* Run time check to see whether mpi_copy does not copy the flags
+ * properly. This was fixed in version 1.8.6. */
+static int
+is_mpi_copy_broken (void)
+{
+ static char result;
+
+ if (!result)
+ {
+ result = !gcry_check_version ("1.8.6");
+ result |= 0x80;
+ }
+ return (result & 1);
+}
+
+
/* This is mpi_copy with a fix for opaque MPIs which store a NULL
pointer. This will also be fixed in Libggcrypt 1.7.0. */
static gcry_mpi_t
@@ -40,6 +56,17 @@ my_mpi_copy (gcry_mpi_t a)
&& !gcry_mpi_get_opaque (a, NULL))
return NULL;
+ if (is_mpi_copy_broken ())
+ {
+ int flag_user2 = a? gcry_mpi_get_flag (a, GCRYMPI_FLAG_USER2) : 0;
+ gcry_mpi_t b;
+
+ b = gcry_mpi_copy (a);
+ if (b && flag_user2)
+ gcry_mpi_set_flag (b, GCRYMPI_FLAG_USER2);
+ return b;
+ }
+
return gcry_mpi_copy (a);
}