diff options
author | JinWang An <jinwang.an@samsung.com> | 2021-12-01 16:54:39 +0900 |
---|---|---|
committer | JinWang An <jinwang.an@samsung.com> | 2021-12-01 16:54:39 +0900 |
commit | d19c360948ede5ffe5974de8abc9da44be617ca1 (patch) | |
tree | f77dd8640a12e7e960c3d408f90e08e069ece9f1 /src | |
parent | fc59d1efdca7b2886739948b88a1aa8cd4243146 (diff) | |
download | gpgme-d19c360948ede5ffe5974de8abc9da44be617ca1.tar.gz gpgme-d19c360948ede5ffe5974de8abc9da44be617ca1.tar.bz2 gpgme-d19c360948ede5ffe5974de8abc9da44be617ca1.zip |
Imported Upstream version 1.16.0upstream/1.16.0
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/Makefile.in | 6 | ||||
-rw-r--r-- | src/cJSON.c | 20 | ||||
-rw-r--r-- | src/context.h | 3 | ||||
-rw-r--r-- | src/conversion.c | 11 | ||||
-rw-r--r-- | src/data-identify.c | 4 | ||||
-rw-r--r-- | src/data.c | 118 | ||||
-rw-r--r-- | src/data.h | 49 | ||||
-rw-r--r-- | src/engine-gpg.c | 39 | ||||
-rw-r--r-- | src/export.c | 1 | ||||
-rw-r--r-- | src/gpgme.c | 12 | ||||
-rw-r--r-- | src/gpgme.h.in | 18 | ||||
-rw-r--r-- | src/key.c | 1 | ||||
-rw-r--r-- | src/keylist.c | 30 | ||||
-rw-r--r-- | src/util.h | 3 |
15 files changed, 261 insertions, 56 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 35add9c..39c341f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -101,7 +101,7 @@ endif # We use a global CFLAGS setting for all libraries # versions, because then every object file is only compiled once. -AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@ +AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GPG_ERROR_CFLAGS@ @GLIB_CFLAGS@ gpgme_tool_SOURCES = gpgme-tool.c argparse.c argparse.h gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@ diff --git a/src/Makefile.in b/src/Makefile.in index 8b323ed..65d40af 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.16.1 from Makefile.am. +# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2018 Free Software Foundation, Inc. +# Copyright (C) 1994-2020 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -617,7 +617,7 @@ libgpgme_la_SOURCES = $(main_sources) $(system_components_not_extra) # We use a global CFLAGS setting for all libraries # versions, because then every object file is only compiled once. -AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@ +AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GPG_ERROR_CFLAGS@ @GLIB_CFLAGS@ gpgme_tool_SOURCES = gpgme-tool.c argparse.c argparse.h gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@ gpgme_json_SOURCES = gpgme-json.c cJSON.c cJSON.h diff --git a/src/cJSON.c b/src/cJSON.c index 7769b0e..1925a04 100644 --- a/src/cJSON.c +++ b/src/cJSON.c @@ -50,21 +50,13 @@ #include "cJSON.h" + /* Only use calloc. */ #define CALLOC_ONLY 1 /* Maximum recursion depth */ #define MAX_DEPTH 512 -/* To avoid that a compiler optimizes certain memset calls away, these - macros may be used instead. */ -#define wipememory2(_ptr,_set,_len) do { \ - volatile char *_vptr=(volatile char *)(_ptr); \ - size_t _vlen=(_len); \ - while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \ - } while(0) -#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len) - /* We use malloc function wrappers from gpgrt (aka libgpg-error). */ #include <gpgrt.h> #define xtrycalloc(a,b) gpgrt_calloc ((a), (b)) @@ -77,6 +69,16 @@ #endif +static void +wipememory (void *ptr, size_t len) +{ + /* Prevent compiler from optimizing away the call to memset by accessing + * memset through volatile pointer. */ + static void *(*volatile memset_ptr)(void *, int, size_t) = (void *)memset; + memset_ptr (ptr, 0, len); +} + + static int cJSON_strcasecmp (const char *s1, const char *s2) { diff --git a/src/context.h b/src/context.h index 3ed3818..2792a16 100644 --- a/src/context.h +++ b/src/context.h @@ -174,6 +174,9 @@ struct gpgme_context /* The optional trust-model override. */ char *trust_model; + /* The optional expiration date of a certification. */ + char *cert_expire; + /* The operation data hooked into the context. */ ctx_op_data_t op_data; diff --git a/src/conversion.c b/src/conversion.c index 1d28096..17dce7f 100644 --- a/src/conversion.c +++ b/src/conversion.c @@ -43,6 +43,17 @@ +void +_gpgme_wipememory (void *ptr, size_t len) +{ + /* Prevent compiler from optimizing away the call to memset by accessing + * memset through volatile pointer. */ + static void *(*volatile memset_ptr)(void *, int, size_t) = (void *)memset; + memset_ptr (ptr, 0, len); +} + + + static char * do_strconcat (const char *s1, va_list arg_ptr) { diff --git a/src/data-identify.c b/src/data-identify.c index eb65786..8e0295e 100644 --- a/src/data-identify.c +++ b/src/data-identify.c @@ -416,8 +416,8 @@ basic_detection (char *data, size_t datalen) } else if (ti.length == 11) { - if (!memcmp (s, "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x01\x02", 11)) - return GPGME_DATA_TYPE_CMS_OTHER; /* Auth Data. */ + if (!memcmp (s, "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x01\x17", 11)) + return GPGME_DATA_TYPE_CMS_ENCRYPTED; /* AuthEnveloped Data. */ } } @@ -52,7 +52,7 @@ */ struct property_s { - gpgme_data_t dh; /* The data objcet or NULL if the slot is not used. */ + gpgme_data_t dh; /* The data object or NULL if the slot is not used. */ uint64_t dserial; /* The serial number of the data object. */ struct { unsigned int blankout : 1; /* Void the held data. */ @@ -339,6 +339,21 @@ _gpgme_data_release (gpgme_data_t dh) remove_from_property_table (dh, dh->propidx); if (dh->file_name) free (dh->file_name); + if (dh->inbound_buffer) + { + if (dh->sensitive) + _gpgme_wipememory (dh->inbound_buffer, dh->io_buffer_size); + free (dh->inbound_buffer); + } + if (dh->outbound_buffer) + { + if (dh->sensitive) + _gpgme_wipememory (dh->outbound_buffer, dh->io_buffer_size); + free (dh->outbound_buffer); + } + if (dh->sensitive) + _gpgme_wipememory (dh->outboundspace, BUFFER_SIZE); + free (dh); } @@ -431,11 +446,11 @@ gpgme_data_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) /* For relative movement, we must take into account the actual position of the read counter. */ if (whence == SEEK_CUR) - offset -= dh->pending_len; + offset -= dh->outbound_pending; offset = (*dh->cbs->seek) (dh, offset, whence); if (offset >= 0) - dh->pending_len = 0; + dh->outbound_pending = 0; return TRACE_SYSRES ((int)offset); } @@ -555,6 +570,28 @@ gpgme_data_set_flag (gpgme_data_t dh, const char *name, const char *value) { dh->size_hint= value? _gpgme_string_to_off (value) : 0; } + else if (!strcmp (name, "io-buffer-size")) + { + gpgme_off_t val; + + /* We may set this only once. */ + if (dh->io_buffer_size) + return gpg_error (GPG_ERR_CONFLICT); + + val = value? _gpgme_string_to_off (value) : 0; + if (val > 1024*1024) + val = 1024*1024; /* Cap at 1MiB */ + else if (val < BUFFER_SIZE) + val = 0; /* We can use the default buffer. */ + + /* Actual allocation happens as needed but we round it to a + * multiple of 1k. */ + dh->io_buffer_size = ((val + 1023)/1024)*1024; + } + else if (!strcmp (name, "sensitive")) + { + dh->sensitive = (value && *value)? !!atoi (value) : 0; + } else return gpg_error (GPG_ERR_UNKNOWN_NAME); @@ -569,14 +606,35 @@ gpgme_error_t _gpgme_data_inbound_handler (void *opaque, int fd) { struct io_cb_data *data = (struct io_cb_data *) opaque; + gpg_error_t err; gpgme_data_t dh = (gpgme_data_t) data->handler_value; - char buffer[BUFFER_SIZE]; - char *bufp = buffer; + char bufferspace[BUFFER_SIZE]; + char *buffer; + size_t buffer_size; + char *bufp; gpgme_ssize_t buflen; TRACE_BEG (DEBUG_CTX, "_gpgme_data_inbound_handler", dh, "fd=%d", fd); - buflen = _gpgme_io_read (fd, buffer, BUFFER_SIZE); + if (dh->io_buffer_size) + { + if (!dh->inbound_buffer) + { + dh->inbound_buffer = malloc (dh->io_buffer_size); + if (!dh->inbound_buffer) + return TRACE_ERR (gpg_error_from_syserror ()); + } + buffer_size = dh->io_buffer_size; + buffer = dh->inbound_buffer; + } + else + { + buffer_size = BUFFER_SIZE; + buffer = bufferspace; + } + bufp = buffer; + + buflen = _gpgme_io_read (fd, buffer, buffer_size); if (buflen < 0) return gpg_error_from_syserror (); if (buflen == 0) @@ -589,12 +647,21 @@ _gpgme_data_inbound_handler (void *opaque, int fd) { gpgme_ssize_t amt = gpgme_data_write (dh, bufp, buflen); if (amt == 0 || (amt < 0 && errno != EINTR)) - return TRACE_ERR (gpg_error_from_syserror ()); + { + err = gpg_error_from_syserror (); + goto leave; + } bufp += amt; buflen -= amt; } while (buflen > 0); - return TRACE_ERR (0); + err = 0; + + leave: + if (dh->sensitive && buffer == bufferspace) + _gpgme_wipememory (bufferspace, BUFFER_SIZE); + + return TRACE_ERR (err); } @@ -603,13 +670,34 @@ _gpgme_data_outbound_handler (void *opaque, int fd) { struct io_cb_data *data = (struct io_cb_data *) opaque; gpgme_data_t dh = (gpgme_data_t) data->handler_value; + char *buffer; + size_t buffer_size; gpgme_ssize_t nwritten; TRACE_BEG (DEBUG_CTX, "_gpgme_data_outbound_handler", dh, "fd=%d", fd); - if (!dh->pending_len) + if (dh->io_buffer_size) + { + if (!dh->outbound_buffer) + { + dh->outbound_buffer = malloc (dh->io_buffer_size); + if (!dh->outbound_buffer) + return TRACE_ERR (gpg_error_from_syserror ()); + dh->outbound_pending = 0; + } + buffer_size = dh->io_buffer_size; + buffer = dh->outbound_buffer; + } + else + { + buffer_size = BUFFER_SIZE; + buffer = dh->outboundspace; + } + + + if (!dh->outbound_pending) { - gpgme_ssize_t amt = gpgme_data_read (dh, dh->pending, BUFFER_SIZE); + gpgme_ssize_t amt = gpgme_data_read (dh, buffer, buffer_size); if (amt < 0) return TRACE_ERR (gpg_error_from_syserror ()); if (amt == 0) @@ -617,10 +705,10 @@ _gpgme_data_outbound_handler (void *opaque, int fd) _gpgme_io_close (fd); return TRACE_ERR (0); } - dh->pending_len = amt; + dh->outbound_pending = amt; } - nwritten = _gpgme_io_write (fd, dh->pending, dh->pending_len); + nwritten = _gpgme_io_write (fd, buffer, dh->outbound_pending); if (nwritten == -1 && errno == EAGAIN) return TRACE_ERR (0); @@ -637,9 +725,9 @@ _gpgme_data_outbound_handler (void *opaque, int fd) if (nwritten <= 0) return TRACE_ERR (gpg_error_from_syserror ()); - if (nwritten < dh->pending_len) - memmove (dh->pending, dh->pending + nwritten, dh->pending_len - nwritten); - dh->pending_len -= nwritten; + if (nwritten < dh->outbound_pending) + memmove (buffer, buffer + nwritten, dh->outbound_pending - nwritten); + dh->outbound_pending -= nwritten; return TRACE_ERR (0); } @@ -33,6 +33,22 @@ #include "gpgme.h" +/* Figure out the standard size for internal data buffers. */ +#ifdef PIPE_BUF +# define BUFFER_SIZE PIPE_BUF +#else +# ifdef _POSIX_PIPE_BUF +# define BUFFER_SIZE _POSIX_PIPE_BUF +# else +# ifdef HAVE_W32_SYSTEM +# define BUFFER_SIZE 4096 +# else +# define BUFFER_SIZE 512 +# endif +# endif +#endif + + /* Read up to SIZE bytes into buffer BUFFER from the data object with the handle DH. Return the number of characters read, 0 on EOF and @@ -76,24 +92,33 @@ struct gpgme_data gpgme_data_encoding_t encoding; unsigned int propidx; /* Index into the property table. */ -#ifdef PIPE_BUF -#define BUFFER_SIZE PIPE_BUF -#else -#ifdef _POSIX_PIPE_BUF -#define BUFFER_SIZE _POSIX_PIPE_BUF -#else -#define BUFFER_SIZE 512 -#endif -#endif - char pending[BUFFER_SIZE]; - int pending_len; - /* File name of the data object. */ char *file_name; /* Hint on the to be expected total size of the data. */ gpgme_off_t size_hint; + /* If no 0 the size of an allocated inbound or outpund buffers. The + * value is at least BUFFER_SIZE and capped at 1MiB. */ + unsigned int io_buffer_size; + + /* If not NULL a malloced buffer used for inbound data used instead + * of the handler's static buffer. Its size is io_buffer_size. */ + char *inbound_buffer; + + /* A default memory space for the outbound handler and the number of + * actual pending bytes. If outbound_buffer is not NULL, this is a + * malloced buffer used instead of the outboundspace. Its malloced + * size is io_buffer_size. */ + char outboundspace[BUFFER_SIZE]; + unsigned int outbound_pending; + char *outbound_buffer; + + /* If set sensitive data is conveyed via the internal buffer. This + * flags overwrites the memory of the buffers with zero before they + * are released. */ + unsigned int sensitive:1; + union { /* For gpgme_data_new_from_fd. */ diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 9a9a26e..b51ea17 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -1961,6 +1961,27 @@ append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */, static gpgme_error_t +append_args_from_cert_expire (engine_gpg_t gpg, gpgme_ctx_t ctx) +{ + gpgme_error_t err; + + if (ctx->cert_expire) + { + /* Override ask-cert-expire set in the configuration, so that the specified + * default is actually used. */ + err = add_arg (gpg, "--no-ask-cert-expire"); + if (!err) + err = add_arg (gpg, "--default-cert-expire"); + if (!err) + err = add_arg (gpg, ctx->cert_expire); + } + else + err = 0; + return err; +} + + +static gpgme_error_t gpg_edit (void *engine, int type, gpgme_key_t key, gpgme_data_t out, gpgme_ctx_t ctx /* FIXME */) { @@ -1976,6 +1997,8 @@ gpg_edit (void *engine, int type, gpgme_key_t key, gpgme_data_t out, if (!err) err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_CERT); if (!err) + err = append_args_from_cert_expire (gpg, ctx); + if (!err) err = add_arg (gpg, type == 0 ? "--edit-key" : "--card-edit"); if (!err) err = add_data (gpg, out, 1, 1); @@ -2336,13 +2359,8 @@ export_common (engine_gpg_t gpg, gpgme_export_mode_t mode, if ((mode & GPGME_EXPORT_MODE_MINIMAL)) { - if ((mode & GPGME_EXPORT_MODE_NOUID)) - err = add_arg (gpg, "--export-options=export-minimal,export-drop-uids"); - else - err = add_arg (gpg, "--export-options=export-minimal"); + err = add_arg (gpg, "--export-options=export-minimal"); } - else if ((mode & GPGME_EXPORT_MODE_NOUID)) - err = add_arg (gpg, "--export-options=export-drop-uids"); if (err) ; @@ -2358,8 +2376,6 @@ export_common (engine_gpg_t gpg, gpgme_export_mode_t mode, else if ((mode & GPGME_EXPORT_MODE_EXTERN)) { err = add_arg (gpg, "--send-keys"); - if (!err && (mode & GPGME_EXPORT_MODE_NOUID)) - err = add_arg (gpg, "--keyserver-options=export-drop-uids"); } else { @@ -3171,6 +3187,13 @@ gpg_keysign (void *engine, gpgme_key_t key, const char *userid, else err = add_arg (gpg, "--quick-sign-key"); + /* The force flag as only an effect with recent gpg versions; if the + * gpg version is too old, the signature will simply not be created. + * I think this is better than bailing out. */ + if (!err && (flags & GPGME_KEYSIGN_FORCE) + && have_gpg_version (gpg, "2.2.28")) + err = add_arg (gpg, "--force-sign-key"); + if (!err) err = append_args_from_signers (gpg, ctx); diff --git a/src/export.c b/src/export.c index 879a54f..4cee0ef 100644 --- a/src/export.c +++ b/src/export.c @@ -129,7 +129,6 @@ export_start (gpgme_ctx_t ctx, int synchronous, const char *pattern, |GPGME_EXPORT_MODE_SECRET |GPGME_EXPORT_MODE_SSH |GPGME_EXPORT_MODE_RAW - |GPGME_EXPORT_MODE_NOUID |GPGME_EXPORT_MODE_PKCS12))) return gpg_error (GPG_ERR_INV_VALUE); /* Invalid flags in MODE. */ diff --git a/src/gpgme.c b/src/gpgme.c index 8bc11d5..255d116 100644 --- a/src/gpgme.c +++ b/src/gpgme.c @@ -253,6 +253,7 @@ gpgme_release (gpgme_ctx_t ctx) free (ctx->request_origin); free (ctx->auto_key_locate); free (ctx->trust_model); + free (ctx->cert_expire); _gpgme_engine_info_release (ctx->engine_info); ctx->engine_info = NULL; DESTROY_LOCK (ctx->lock); @@ -578,6 +579,13 @@ gpgme_set_ctx_flag (gpgme_ctx_t ctx, const char *name, const char *value) { ctx->extended_edit = abool; } + else if (!strcmp (name, "cert-expire")) + { + free (ctx->cert_expire); + ctx->cert_expire = strdup (value); + if (!ctx->cert_expire) + err = gpg_error_from_syserror (); + } else err = gpg_error (GPG_ERR_UNKNOWN_NAME); @@ -647,6 +655,10 @@ gpgme_get_ctx_flag (gpgme_ctx_t ctx, const char *name) { return ctx->extended_edit ? "1":""; } + else if (!strcmp (name, "cert-expire")) + { + return ctx->cert_expire? ctx->cert_expire : ""; + } else return NULL; } diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 1defa4d..5c74afd 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -406,7 +406,6 @@ gpgme_pinentry_mode_t; #define GPGME_EXPORT_MODE_SECRET 16 #define GPGME_EXPORT_MODE_RAW 32 #define GPGME_EXPORT_MODE_PKCS12 64 -#define GPGME_EXPORT_MODE_NOUID 128 /* Experimental(!)*/ #define GPGME_EXPORT_MODE_SSH 256 typedef unsigned int gpgme_export_mode_t; @@ -628,7 +627,13 @@ struct _gpgme_key_sig unsigned int exportable : 1; /* Internal to GPGME, do not use. */ - unsigned int _unused : 28; + unsigned int _unused : 12; + + /* The depth of a trust signature, 0 if no trust signature. */ + unsigned int trust_depth : 8; + + /* The trust value of a trust signature, 0 if no trust signature. */ + unsigned int trust_value : 8; /* The public key algorithm used to create the signature. */ gpgme_pubkey_algo_t pubkey_algo; @@ -675,6 +680,9 @@ struct _gpgme_key_sig /* Internal to GPGME, do not use. */ gpgme_sig_notation_t _last_notation; + + /* The scope of a trust signature. Might be NULL. */ + char *trust_scope; }; typedef struct _gpgme_key_sig *gpgme_key_sig_t; @@ -1906,6 +1914,7 @@ gpgme_error_t gpgme_op_delete_ext (gpgme_ctx_t ctx, const gpgme_key_t key, #define GPGME_KEYSIGN_LOCAL (1 << 7) /* Create a local signature. */ #define GPGME_KEYSIGN_LFSEP (1 << 8) /* Indicate LF separated user ids. */ #define GPGME_KEYSIGN_NOEXPIRE (1 << 9) /* Force no expiration. */ +#define GPGME_KEYSIGN_FORCE (1 << 10) /* Force creation. */ /* Sign the USERID of KEY using the current set of signers. */ @@ -2463,6 +2472,11 @@ char *gpgme_addrspec_from_uid (const char *uid); * Deprecated types, constants and functions. */ +/* This is a former experimental only features. The constant is + * provided to not break existing code in the compiler phase. */ +#define GPGME_EXPORT_MODE_NOUID 128 /* Do not use! */ + + /* The possible stati for gpgme_op_edit. The use of that function and * these status codes are deprecated in favor of gpgme_op_interact. */ typedef enum @@ -369,6 +369,7 @@ gpgme_key_unref (gpgme_key_t key) notation = next_notation; } + free (keysig->trust_scope); free (keysig); keysig = next_keysig; } diff --git a/src/keylist.c b/src/keylist.c index a4de3ad..f2c90d2 100644 --- a/src/keylist.c +++ b/src/keylist.c @@ -734,7 +734,7 @@ keylist_colon_handler (void *priv, char *line) } /* Field 18 has the compliance flags. */ - if (fields >= 17 && *field[17]) + if (fields >= 18 && *field[17]) PARSE_COMPLIANCE_FLAGS (field[17], subkey); if (fields >= 20) @@ -817,7 +817,7 @@ keylist_colon_handler (void *priv, char *line) } /* Field 18 has the compliance flags. */ - if (fields >= 17 && *field[17]) + if (fields >= 18 && *field[17]) PARSE_COMPLIANCE_FLAGS (field[17], subkey); break; @@ -967,6 +967,30 @@ keylist_colon_handler (void *priv, char *line) if (fields >= 7) keysig->expires = _gpgme_parse_timestamp (field[6], NULL); + /* Field 8 has the trust depth and the trust value. */ + if (fields >= 8 && *field[7]) + { + const char *trust_depth = field[7]; + char *trust_value = strchr (field[7] + 1, ' '); + if (trust_value) + *(trust_value++) = '\0'; + if (trust_value) + { + int depth = atoi (trust_depth); + int value = atoi (trust_value); + + if (depth >= 1 && depth < 256) + keysig->trust_depth = depth; + if (value >= 1 && value < 256) + keysig->trust_value = value; + } + } + + /* Field 9 has the trust signature scope (a regular expression). */ + if (fields >= 9) + if (_gpgme_decode_c_string (field[8], &keysig->trust_scope, 0)) + return gpg_error (GPG_ERR_ENOMEM); /* FIXME */ + /* Field 11 has the signature class (eg, 0x30 means revoked). */ if (fields >= 11) if (field[10][0] && field[10][1]) @@ -991,7 +1015,7 @@ keylist_colon_handler (void *priv, char *line) return 0; assert (opd->tmp_keysig == key->_last_uid->_last_keysig); - if (fields >= 4) + if (fields >= 5) { /* Field 2 has the subpacket type. */ int type = atoi (field[1]); @@ -96,6 +96,9 @@ int _gpgme_ttyname_r (int fd, char *buf, size_t buflen); /*-- conversion.c --*/ +/* Make sure to to erase the memory (PTR,LEN). */ +void _gpgme_wipememory (void *ptr, size_t len); + /* Concatenate the string S1 with all the following strings up to a NULL. Returns a malloced buffer with the new string or NULL on a malloc error or if too many arguments are given. */ |