aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2006-02-22 11:44:16 +0000
committerMarcus Brinkmann <[email protected]>2006-02-22 11:44:16 +0000
commitfb6692fc75da65b616a9a5ed66789c52e8227f97 (patch)
tree015310594a5e1c300a76d8372c31c75b3a3d66f4
parent2006-02-22 Marcus Brinkmann <[email protected]> (diff)
downloadgpgme-fb6692fc75da65b616a9a5ed66789c52e8227f97.tar.gz
gpgme-fb6692fc75da65b616a9a5ed66789c52e8227f97.zip
2006-02-22 Marcus Brinkmann <[email protected]>
* engine.c (gpgme_engine_check_version): Reimplemented to allow checking the version correctly even after changing the engine information. Bug reported by Stéphane Corthésy.
Diffstat (limited to '')
-rw-r--r--gpgme/ChangeLog4
-rw-r--r--gpgme/engine.c29
2 files changed, 28 insertions, 5 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog
index 29113948..cf149c2d 100644
--- a/gpgme/ChangeLog
+++ b/gpgme/ChangeLog
@@ -1,5 +1,9 @@
2006-02-22 Marcus Brinkmann <[email protected]>
+ * engine.c (gpgme_engine_check_version): Reimplemented to allow
+ checking the version correctly even after changing the engine
+ information. Bug reported by St�phane Corth�sy.
+
* rungpg.c (read_colon_line): Invoke colon preprocess handler if
it is set.
(colon_preprocessor_t): New type.
diff --git a/gpgme/engine.c b/gpgme/engine.c
index a07fcdc4..d9753568 100644
--- a/gpgme/engine.c
+++ b/gpgme/engine.c
@@ -106,14 +106,33 @@ engine_get_req_version (gpgme_protocol_t proto)
gpgme_error_t
gpgme_engine_check_version (gpgme_protocol_t proto)
{
+ gpgme_error_t err;
+ gpgme_engine_info_t info;
int result;
- char *engine_version = engine_get_version (proto, NULL);
- result = _gpgme_compare_versions (engine_version,
- engine_get_req_version (proto));
- if (engine_version)
- free (engine_version);
+ LOCK (engine_info_lock);
+ info = engine_info;
+ if (!info)
+ {
+ /* Make sure it is initialized. */
+ UNLOCK (engine_info_lock);
+ err = gpgme_get_engine_info (&info);
+ if (err)
+ return err;
+ LOCK (engine_info_lock);
+ }
+
+ while (info && info->protocol != proto)
+ info = info->next;
+
+ if (!info)
+ result = 0;
+ else
+ result = _gpgme_compare_versions (info->version,
+ info->req_version);
+
+ UNLOCK (engine_info_lock);
return result ? 0 : gpg_error (GPG_ERR_INV_ENGINE);
}