2005-05-26 * src/rfc2015.c: pgp_sign(): fixed missing brackets. Check if result->signatures is not NULL (fix crashes on specific condition). * src/sigstatus.c: gpgmegtk_sig_status_to_string(): check if signature is not NULL. Index: src/rfc2015.c =================================================================== RCS file: /cvsroot/sylpheed/sylpheed/src/rfc2015.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -p -r1.24 -r1.25 --- src/rfc2015.c 28 Jan 2005 10:15:14 -0000 1.24 +++ src/rfc2015.c 26 May 2005 06:06:20 -0000 1.25 @@ -124,10 +124,10 @@ rfc2015_secure_remove (const char *fname static void sig_status_for_key(GString *str, gpgme_ctx_t ctx, gpgme_signature_t sig) { - gpgme_key_t key; - gpgme_user_id_t user; + gpgme_key_t key; + gpgme_user_id_t user; - gpgme_get_key(ctx, sig->fpr, &key, 0); + gpgme_get_key(ctx, sig->fpr, &key, 0); if (key == NULL || key->uids->uid == NULL) { g_string_sprintfa (str, "%s\n", gpgmegtk_sig_status_to_string (sig, FALSE)); @@ -136,13 +136,15 @@ sig_status_for_key(GString *str, gpgme_c g_string_append (str, _("Cannot find user ID for this key.")); return; } - user = key->uids; - g_string_sprintfa (str, gpgmegtk_sig_status_to_string (sig, TRUE), user->uid); + user = key->uids; + g_string_sprintfa + (str, gpgmegtk_sig_status_to_string (sig, TRUE), user->uid); g_string_append (str, "\n"); - user = user->next; + user = user->next; while (user) { - g_string_sprintfa (str, _(" aka \"%s\"\n"), user->uid); + g_string_sprintfa + (str, _(" aka \"%s\"\n"), user->uid); user = user->next; } } @@ -151,7 +153,7 @@ static gchar * sig_status_full (gpgme_ctx_t ctx, gpgme_verify_result_t result) { GString *str; - gpgme_signature_t sig; + gpgme_signature_t sig; time_t created; struct tm *ctime_val; char ctime_str[80]; @@ -162,7 +164,7 @@ sig_status_full (gpgme_ctx_t ctx, gpgme_ sig = result->signatures; while (sig != NULL) { if (sig->timestamp != 0) { - created = sig->timestamp; + created = sig->timestamp; ctime_val = localtime (&created); strftime (ctime_str, sizeof (ctime_str), "%c", ctime_val); @@ -170,11 +172,10 @@ sig_status_full (gpgme_ctx_t ctx, gpgme_ _("Signature made at %s\n"), ctime_str); } - sig_status_for_key(str, ctx, sig); - - g_string_append (str, "\n\n"); - - sig = sig->next; + sig_status_for_key(str, ctx, sig); + if (sig->next) + g_string_append (str, "\n\n"); + sig = sig->next; } retval = str->str; @@ -654,8 +655,8 @@ pgp_encrypt ( gpgme_data_t plain, gpgme_ err = gpgme_data_new (&cipher); if (!err) { gpgme_set_armor (ctx, 1); - err = (gpgme_data_seek(plain, 0, SEEK_SET) == -1) ? - gpgme_error_from_errno(errno) : 0; + err = (gpgme_data_seek(plain, 0, SEEK_SET) == -1) ? + gpgme_error_from_errno(errno) : 0; if (!err) { /* * Note -- it is currently the responsibility of select-keys.c:: @@ -668,7 +669,8 @@ pgp_encrypt ( gpgme_data_t plain, gpgme_ } if (err) { - debug_print ("encryption failed: %s\n", gpgme_strerror (err)); + g_warning ("pgp_encrypt(): encryption failed: %s\n", + gpgme_strerror (err)); gpgme_data_release (cipher); cipher = NULL; } @@ -992,7 +994,7 @@ pgp_sign (gpgme_data_t plain, GSList *ke gpgme_set_armor (ctx, 1); gpgme_signers_clear (ctx); for (p = key_list; p != NULL; p = p->next) { - err = gpgme_signers_add (ctx, (gpgme_key_t) p->data); + err = gpgme_signers_add (ctx, (gpgme_key_t) p->data); if (err) goto leave; } @@ -1003,12 +1005,12 @@ pgp_sign (gpgme_data_t plain, GSList *ke err = (gpgme_data_seek(plain, 0, SEEK_SET) == -1) ? gpgme_error_from_errno(errno) : 0; if (!err) { - err = gpgme_op_sign (ctx, plain, sig, - clearsign ? GPGME_SIG_MODE_CLEAR : GPGME_SIG_MODE_DETACH); + err = gpgme_op_sign (ctx, plain, sig, + clearsign ? GPGME_SIG_MODE_CLEAR : GPGME_SIG_MODE_DETACH); } - if (!err) + if (!err) { result = gpgme_op_sign_result(ctx); - if (result) { + if (result && result->signatures) { if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_OpenPGP) { *micalg = g_strdup_printf("PGP-%s", gpgme_hash_algo_name( result->signatures->hash_algo)); @@ -1016,16 +1018,19 @@ pgp_sign (gpgme_data_t plain, GSList *ke *micalg = g_strdup(gpgme_hash_algo_name( result->signatures->hash_algo)); } + } else { + /* can't get result (maybe no signing key?) */ + err = GPG_ERR_USER_1; } + } leave: if (err) { gpgmegtk_free_passphrase(); - debug_print ("signing failed: %s\n", gpgme_strerror (err)); + g_warning ("pgp_sign(): signing failed: %s\n", gpgme_strerror (err)); gpgme_data_release (sig); sig = NULL; - } - else { + } else { debug_print ("signing succeeded\n"); } @@ -1260,7 +1265,7 @@ rfc2015_clearsign (const gchar *file, GS gpgme_data_t text = NULL; gpgme_data_t sigdata = NULL; ssize_t bytesRW = 0; - gchar *micalg; + gchar *micalg = NULL; if ((fp = fopen(file, "rb")) == NULL) { FILE_OP_ERROR(file, "fopen"); Index: src/sigstatus.c =================================================================== RCS file: /cvsroot/sylpheed/sylpheed/src/sigstatus.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -p -r1.7 -r1.8 --- src/sigstatus.c 28 Jan 2005 10:15:14 -0000 1.7 +++ src/sigstatus.c 26 May 2005 06:06:20 -0000 1.8 @@ -211,46 +211,49 @@ const gchar *gpgmegtk_sig_status_to_stri gboolean use_name) { const gchar *result = "?"; - switch (gpg_err_code(signature->status)) { - case GPG_ERR_NO_DATA: + + g_return_val_if_fail(signature != NULL, result); + + switch (gpg_err_code(signature->status)) { + case GPG_ERR_NO_DATA: result = _("No signature found"); break; - case GPG_ERR_NO_ERROR: - switch (signature->validity) { - case GPGME_VALIDITY_ULTIMATE: - case GPGME_VALIDITY_FULL: - case GPGME_VALIDITY_MARGINAL: - result = use_name ? _("Good signature from \"%s\"") : - _("Good signature"); - break; - default: - result = use_name ? - _("Valid signature but the key for \"%s\" is not trusted") : - _("Valid signature (untrusted key)"); - break; - } - break; - case GPG_ERR_SIG_EXPIRED: - result = use_name ? _("Signature valid but expired for \"%s\"") : - _("Signature valid but expired"); - break; - case GPG_ERR_KEY_EXPIRED: - result = use_name ? _("Signature valid but the signing key for \"%s\" has expired") : - _("Signature valid but the signing key has expired"); - break; - case GPG_ERR_CERT_REVOKED: - result = use_name ? _("Signature valid but the signing key for \"%s\" has been revoked") : - _("Signature valid but the signing key has been revoked"); - break; - case GPG_ERR_BAD_SIGNATURE: + case GPG_ERR_NO_ERROR: + switch (signature->validity) { + case GPGME_VALIDITY_ULTIMATE: + case GPGME_VALIDITY_FULL: + case GPGME_VALIDITY_MARGINAL: + result = use_name ? _("Good signature from \"%s\"") : + _("Good signature"); + break; + default: + result = use_name ? + _("Valid signature but the key for \"%s\" is not trusted") : + _("Valid signature (untrusted key)"); + break; + } + break; + case GPG_ERR_SIG_EXPIRED: + result = use_name ? _("Signature valid but expired for \"%s\"") : + _("Signature valid but expired"); + break; + case GPG_ERR_KEY_EXPIRED: + result = use_name ? _("Signature valid but the signing key for \"%s\" has expired") : + _("Signature valid but the signing key has expired"); + break; + case GPG_ERR_CERT_REVOKED: + result = use_name ? _("Signature valid but the signing key for \"%s\" has been revoked") : + _("Signature valid but the signing key has been revoked"); + break; + case GPG_ERR_BAD_SIGNATURE: result = use_name ? _("BAD signature from \"%s\"") : - _("BAD signature"); + _("BAD signature"); break; - case GPG_ERR_NO_PUBKEY: + case GPG_ERR_NO_PUBKEY: result = _("No public key to verify the signature"); break; default: - result = _("Error verifying the signature"); + result = _("Error verifying the signature"); break; }