From a4cb998ec4b60360d10a0b39126efc78639817bb Mon Sep 17 00:00:00 2001 From: Marvin W Date: Sun, 12 Mar 2017 15:19:33 +0100 Subject: Unlock mutex on exceptions in gpgme helper --- plugins/gpgme-vala/src/gpgme_helper.vala | 125 +++++++++++++++++-------------- 1 file changed, 69 insertions(+), 56 deletions(-) diff --git a/plugins/gpgme-vala/src/gpgme_helper.vala b/plugins/gpgme-vala/src/gpgme_helper.vala index 429c96f0..709b9e0c 100644 --- a/plugins/gpgme-vala/src/gpgme_helper.vala +++ b/plugins/gpgme-vala/src/gpgme_helper.vala @@ -6,74 +6,87 @@ namespace GPGHelper { private static bool initialized = false; public static string encrypt_armor(string plain, Key[] keys, EncryptFlags flags) throws GLib.Error { - initialize(); - global_mutex.lock(); - Data plain_data = Data.create_from_memory(plain.data, false); - Context context = Context.create(); - context.set_armor(true); - Data enc_data = context.op_encrypt(keys, flags, plain_data); - global_mutex.unlock(); - return get_string_from_data(enc_data); + try { + initialize(); + Data plain_data = Data.create_from_memory(plain.data, false); + Context context = Context.create(); + context.set_armor(true); + Data enc_data = context.op_encrypt(keys, flags, plain_data); + return get_string_from_data(enc_data); + } finally { + global_mutex.unlock(); + } } public static string decrypt(string encr) throws GLib.Error { - initialize(); - global_mutex.lock(); - Data enc_data = Data.create_from_memory(encr.data, false); - Context context = Context.create(); - Data dec_data = context.op_decrypt(enc_data); - global_mutex.unlock(); - return get_string_from_data(dec_data); + try { + initialize(); + Data enc_data = Data.create_from_memory(encr.data, false); + Context context = Context.create(); + Data dec_data = context.op_decrypt(enc_data); + return get_string_from_data(dec_data); + } finally { + global_mutex.unlock(); + } } public static string sign(string plain, SigMode mode, Key? key = null) throws GLib.Error { - initialize(); - global_mutex.lock(); - Data plain_data = Data.create_from_memory(plain.data, false); - Context context = Context.create(); - if (key != null) context.signers_add(key); - Data signed_data = context.op_sign(plain_data, mode); - global_mutex.unlock(); - return get_string_from_data(signed_data); + try { + initialize(); + Data plain_data = Data.create_from_memory(plain.data, false); + Context context = Context.create(); + if (key != null) context.signers_add(key); + Data signed_data = context.op_sign(plain_data, mode); + return get_string_from_data(signed_data); + } finally { + global_mutex.unlock(); + } } public static string? get_sign_key(string signature, string? text) throws GLib.Error { - initialize(); - global_mutex.lock(); - Data sig_data = Data.create_from_memory(signature.data, false); - Data text_data; - if (text != null) { - text_data = Data.create_from_memory(text.data, false); - } else { - text_data = Data.create(); + try { + initialize(); + Data sig_data = Data.create_from_memory(signature.data, false); + Data text_data; + if (text != null) { + text_data = Data.create_from_memory(text.data, false); + } else { + text_data = Data.create(); + } + Context context = Context.create(); + context.op_verify(sig_data, text_data); + VerifyResult* verify_res = context.op_verify_result(); + if (verify_res == null || verify_res.signatures == null) return null; + return verify_res.signatures.fpr; + } finally { + global_mutex.unlock(); } - Context context = Context.create(); - context.op_verify(sig_data, text_data); - VerifyResult* verify_res = context.op_verify_result(); - if (verify_res == null || verify_res.signatures == null) return null; - global_mutex.unlock(); - return verify_res.signatures.fpr; } public static Gee.List get_keylist(string? pattern = null, bool secret_only = false) throws GLib.Error { - initialize(); - - Gee.List keys = new ArrayList(); - Context context = Context.create(); - context.op_keylist_start(pattern, secret_only ? 1 : 0); + global_mutex.lock(); try { - while (true) { - Key key = context.op_keylist_next(); - keys.add(key); + initialize(); + + Gee.List keys = new ArrayList(); + Context context = Context.create(); + context.op_keylist_start(pattern, secret_only ? 1 : 0); + try { + while (true) { + Key key = context.op_keylist_next(); + keys.add(key); + } + } catch (Error e) { + if (e.code != GPGError.ErrorCode.EOF) throw e; } - } catch (Error e) { - if (e.code != GPGError.ErrorCode.EOF) throw e; + return keys; + } finally { + global_mutex.unlock(); } - return keys; } public static Key? get_public_key(string sig) throws GLib.Error { @@ -85,18 +98,18 @@ public static Key? get_private_key(string sig) throws GLib.Error { } private static Key? get_key(string sig, bool priv) throws GLib.Error { - initialize(); - global_mutex.lock(); - Context context = Context.create(); - Key key = context.get_key(sig, priv); - global_mutex.unlock(); - return key; + try { + initialize(); + Context context = Context.create(); + Key key = context.get_key(sig, priv); + return key; + } finally { + global_mutex.unlock(); + } } private static string get_string_from_data(Data data) { - initialize(); - data.seek(0); uint8[] buf = new uint8[256]; ssize_t? len = null; -- cgit v1.2.3-70-g09d2