From b7b0e7b5bfefd51c8092ea54f262b18aebf78128 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 16 Aug 2016 18:49:11 +0200 Subject: core: Simplify setting of dummy versions. * src/engine.c (_gpgme_engine_info_release): Do not assert but free FILE_NAME. (gpgme_get_engine_info): Provide default for VERSION and REQ_VERSION. Use calloc instead of malloc. (_gpgme_set_engine_info): Ditto. * src/engine-assuan.c (llass_get_version): Return NULL. (llass_get_req_version): Ditto. * src/engine-spawn.c (engspawn_get_version): Ditto. (engspawn_get_req_version): Ditto. * src/engine-uiserver.c (uiserver_get_version): Ditto. (uiserver_get_req_version): Ditto. Signed-off-by: Werner Koch --- src/engine.c | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) (limited to 'src/engine.c') diff --git a/src/engine.c b/src/engine.c index 4e59adad..a7c016f0 100644 --- a/src/engine.c +++ b/src/engine.c @@ -93,7 +93,8 @@ engine_get_home_dir (gpgme_protocol_t proto) /* Get a malloced string containing the version number of the engine - for PROTOCOL. */ + * for PROTOCOL. If this function returns NULL for a valid protocol, + * it should be assumed that the engine is a pseudo engine. */ static char * engine_get_version (gpgme_protocol_t proto, const char *file_name) { @@ -107,7 +108,8 @@ engine_get_version (gpgme_protocol_t proto, const char *file_name) } -/* Get the required version number of the engine for PROTOCOL. */ +/* Get the required version number of the engine for PROTOCOL. This + * may be NULL. */ static const char * engine_get_req_version (gpgme_protocol_t proto) { @@ -164,8 +166,8 @@ _gpgme_engine_info_release (gpgme_engine_info_t info) { gpgme_engine_info_t next_info = info->next; - assert (info->file_name); - free (info->file_name); + if (info->file_name) + free (info->file_name); if (info->home_dir) free (info->home_dir); if (info->version) @@ -203,6 +205,7 @@ gpgme_get_engine_info (gpgme_engine_info_t *info) { const char *ofile_name = engine_get_file_name (proto_list[proto]); const char *ohome_dir = engine_get_home_dir (proto_list[proto]); + char *version = engine_get_version (proto_list[proto], NULL); char *file_name; char *home_dir; @@ -222,10 +225,18 @@ gpgme_get_engine_info (gpgme_engine_info_t *info) else home_dir = NULL; - *lastp = malloc (sizeof (*engine_info)); + *lastp = calloc (1, sizeof (*engine_info)); if (!*lastp && !err) err = gpg_error_from_syserror (); + /* Now set the dummy version for pseudo engines. */ + if (!err && !version) + { + version = strdup ("1.0.0"); + if (!version) + err = gpg_error_from_syserror (); + } + if (err) { _gpgme_engine_info_release (engine_info); @@ -235,6 +246,8 @@ gpgme_get_engine_info (gpgme_engine_info_t *info) free (file_name); if (home_dir) free (home_dir); + if (version) + free (version); UNLOCK (engine_info_lock); return err; @@ -243,8 +256,10 @@ gpgme_get_engine_info (gpgme_engine_info_t *info) (*lastp)->protocol = proto_list[proto]; (*lastp)->file_name = file_name; (*lastp)->home_dir = home_dir; - (*lastp)->version = engine_get_version (proto_list[proto], NULL); + (*lastp)->version = version; (*lastp)->req_version = engine_get_req_version (proto_list[proto]); + if (!(*lastp)->req_version) + (*lastp)->req_version = "1.0.0"; /* Dummy for pseudo engines. */ (*lastp)->next = NULL; lastp = &(*lastp)->next; } @@ -353,6 +368,7 @@ _gpgme_set_engine_info (gpgme_engine_info_t info, gpgme_protocol_t proto, { char *new_file_name; char *new_home_dir; + char *new_version; /* FIXME: Use some PROTO_MAX definition. */ if (proto > DIM (engine_ops)) @@ -401,6 +417,17 @@ _gpgme_set_engine_info (gpgme_engine_info_t info, gpgme_protocol_t proto, new_home_dir = NULL; } + new_version = engine_get_version (proto, new_file_name); + if (!new_version) + { + new_version = strdup ("1.0.0"); /* Fake one for dummy entries. */ + if (!new_version) + { + free (new_file_name); + free (new_home_dir); + } + } + /* Remove the old members. */ assert (info->file_name); free (info->file_name); @@ -412,7 +439,7 @@ _gpgme_set_engine_info (gpgme_engine_info_t info, gpgme_protocol_t proto, /* Install the new members. */ info->file_name = new_file_name; info->home_dir = new_home_dir; - info->version = engine_get_version (proto, new_file_name); + info->version = new_version; return 0; } -- cgit v1.2.3 From 8c09dd9989bcd434a8cb5997770cb8414b96bd5c Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 16 Aug 2016 18:53:42 +0200 Subject: core: New global flag "require-gnupg". * src/gpgme.c (gpgme_set_global_flag): Add flag. * src/engine.c (engine_minimal_version): New variable. (_gpgme_set_engine_minimal_version): New function. (gpgme_get_engine_info): Check that flag. * tests/run-keylist.c (main): New option --require-gnupg. Signed-off-by: Werner Koch --- src/engine.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src/engine.c') diff --git a/src/engine.c b/src/engine.c index a7c016f0..f428034d 100644 --- a/src/engine.c +++ b/src/engine.c @@ -63,6 +63,10 @@ static struct engine_ops *engine_ops[] = static gpgme_engine_info_t engine_info; DEFINE_STATIC_LOCK (engine_info_lock); +/* If non-NULL, the minimal version required for all engines. */ +static char *engine_minimal_version; + + /* Get the file name of the engine for PROTOCOL. */ static const char * @@ -178,6 +182,26 @@ _gpgme_engine_info_release (gpgme_engine_info_t info) } +/* This is an internal function to set a mimimal required version. + * This function must only be called by gpgme_set_global_flag. + * Returns 0 on success. */ +int +_gpgme_set_engine_minimal_version (const char *value) +{ + free (engine_minimal_version); + if (value) + { + engine_minimal_version = strdup (value); + return !engine_minimal_version; + } + else + { + engine_minimal_version = NULL; + return 0; + } +} + + /* Get the information about the configured and installed engines. A pointer to the first engine in the statically allocated linked list is returned in *INFO. If an error occurs, it is returned. The @@ -229,6 +253,17 @@ gpgme_get_engine_info (gpgme_engine_info_t *info) if (!*lastp && !err) err = gpg_error_from_syserror (); + /* Check against the optional minimal engine version. */ + if (!err && version && engine_minimal_version + && !_gpgme_compare_versions (version, engine_minimal_version)) + { +#if GPG_ERROR_VERSION_NUMBER < 0x011900 /* 1.25 */ + err = gpg_error (GPG_ERR_NO_ENGINE); +#else + err = gpg_error (GPG_ERR_ENGINE_TOO_OLD); +#endif + } + /* Now set the dummy version for pseudo engines. */ if (!err && !version) { -- cgit v1.2.3