+2007-02-22 [paul] 2.7.2cvs62
+
+ * src/plugins/pgpcore/sgpgme.c
+ * src/plugins/pgpcore/sgpgme.h
+ * src/plugins/pgpcore/passphrase.c
+ * src/plugins/pgpinline/pgpinline.c
+ * src/plugins/pgpmime/pgpmime.c
+ Fix a leak - gpgme_data_release_and_get_mem
+ leaks in recent gpgme. Workaround by using
+ our own function.
+
2007-02-22 [paul] 2.7.2cvs61
* src/gtk/quicksearch.c
( cvs diff -u -r 1.395.2.284 -r 1.395.2.285 src/summaryview.c; ) > 2.7.2cvs59.patchset
( cvs diff -u -r 1.115.2.137 -r 1.115.2.138 src/main.c; cvs diff -u -r 1.150.2.92 -r 1.150.2.93 src/procmsg.c; cvs diff -u -r 1.1.2.62 -r 1.1.2.63 src/gtk/quicksearch.c; cvs diff -u -r 1.1.2.23 -r 1.1.2.24 src/plugins/pgpcore/passphrase.c; ) > 2.7.2cvs60.patchset
( cvs diff -u -r 1.1.2.63 -r 1.1.2.64 src/gtk/quicksearch.c; ) > 2.7.2cvs61.patchset
+( cvs diff -u -r 1.1.2.24 -r 1.1.2.25 src/plugins/pgpcore/passphrase.c; cvs diff -u -r 1.1.2.41 -r 1.1.2.42 src/plugins/pgpcore/sgpgme.c; cvs diff -u -r 1.1.2.8 -r 1.1.2.9 src/plugins/pgpcore/sgpgme.h; cvs diff -u -r 1.1.2.29 -r 1.1.2.30 src/plugins/pgpinline/pgpinline.c; cvs diff -u -r 1.1.2.45 -r 1.1.2.46 src/plugins/pgpmime/pgpmime.c; ) > 2.7.2cvs62.patchset
MICRO_VERSION=2
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=61
+EXTRA_VERSION=62
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
gpgmegtk_passphrase_cb(void *opaque, const char *uid_hint,
const char *passphrase_hint, int prev_bad, int fd)
{
- const char *pass;
+ const char *pass = NULL;
if (prefs_gpg_get_config()->store_passphrase && last_pass && !prev_bad)
- pass = last_pass;
+ pass = g_strdup(last_pass);
else {
- gpgmegtk_set_passphrase_grab (prefs_gpg_get_config()->passphrase_grab);
- debug_print ("%% requesting passphrase for '%s'\n ", uid_hint);
- pass = passphrase_mbox (uid_hint, passphrase_hint, prev_bad, FALSE);
- gpgmegtk_free_passphrase();
- if (!pass) {
- debug_print ("%% cancel passphrase entry\n");
- write(fd, "\n", 1);
- return GPG_ERR_CANCELED;
- }
- else {
- if (prefs_gpg_get_config()->store_passphrase) {
- last_pass = g_strdup(pass);
+ gpgmegtk_set_passphrase_grab (prefs_gpg_get_config()->passphrase_grab);
+ debug_print ("%% requesting passphrase for '%s'\n ", uid_hint);
+ pass = passphrase_mbox (uid_hint, passphrase_hint, prev_bad, FALSE);
+ gpgmegtk_free_passphrase();
+ if (!pass) {
+ debug_print ("%% cancel passphrase entry\n");
+ write(fd, "\n", 1);
+ return GPG_ERR_CANCELED;
+ }
+ else {
+ if (prefs_gpg_get_config()->store_passphrase) {
+ last_pass = g_strdup(pass);
#ifndef G_PLATFORM_WIN32
- if (mlock(last_pass, strlen(last_pass)) == -1)
- debug_print("%% locking passphrase failed\n");
+ if (mlock(last_pass, strlen(last_pass)) == -1)
+ debug_print("%% locking passphrase failed\n");
#endif
- if (prefs_gpg_get_config()->store_passphrase_timeout > 0) {
- g_timeout_add(prefs_gpg_get_config()
- ->store_passphrase_timeout*60*1000,
- free_passphrase, NULL);
+ if (prefs_gpg_get_config()->store_passphrase_timeout > 0) {
+ g_timeout_add(prefs_gpg_get_config()
+ ->store_passphrase_timeout*60*1000,
+ free_passphrase, NULL);
+ }
}
- }
- debug_print ("%% sending passphrase\n");
- }
+ debug_print ("%% sending passphrase\n");
+ }
}
#ifdef G_OS_WIN32
#include <glib.h>
#include <glib/gi18n.h>
#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
prefs_gpg_save_config();
}
}
+
+void *sgpgme_data_release_and_get_mem(gpgme_data_t data, size_t *len)
+{
+ char buf[BUFSIZ];
+ void *result = NULL;
+ ssize_t r = 0;
+ size_t w = 0;
+
+ if (data == NULL)
+ return NULL;
+ if (len == NULL)
+ return NULL;
+
+ /* I know it's deprecated, but we don't compile with _LARGEFILE */
+ gpgme_data_rewind(data);
+ while ((r = gpgme_data_read(data, buf, BUFSIZ)) > 0) {
+ result = realloc(result, r + w);
+ memcpy(result+w, buf, r);
+ w += r;
+ }
+
+ *len = w;
+
+ gpgme_data_release(data);
+ if (r < 0) {
+ free(result);
+ *len = 0;
+ return NULL;
+ }
+ return result;
+}
#endif /* USE_GPGME */
void sgpgme_check_create_key(void);
gboolean sgpgme_has_secret_key(void);
void sgpgme_create_secret_key(PrefsAccount *account, gboolean ask_create);
+void *sgpgme_data_release_and_get_mem(gpgme_data_t data, size_t *len);
+
#endif /* SGPGME_H */
"\r\n",
src_codeset);
- chars = gpgme_data_release_and_get_mem(plain, &len);
+ chars = sgpgme_data_release_and_get_mem(plain, &len);
if (len > 0)
fwrite(chars, len, 1, dstfp);
}
- sigcontent = gpgme_data_release_and_get_mem(gpgsig, &len);
+ sigcontent = sgpgme_data_release_and_get_mem(gpgsig, &len);
if (sigcontent == NULL || len <= 0) {
- g_warning("gpgme_data_release_and_get_mem failed");
+ g_warning("sgpgme_data_release_and_get_mem failed");
privacy_set_error(_("Data signing failed, no contents."));
gpgme_data_release(gpgtext);
g_free(textstr);
err = gpgme_op_encrypt(ctx, kset, GPGME_ENCRYPT_ALWAYS_TRUST, gpgtext, gpgenc);
- enccontent = gpgme_data_release_and_get_mem(gpgenc, &len);
+ enccontent = sgpgme_data_release_and_get_mem(gpgenc, &len);
if (enccontent == NULL || len <= 0) {
- g_warning("gpgme_data_release_and_get_mem failed");
+ g_warning("sgpgme_data_release_and_get_mem failed");
privacy_set_error(_("Encryption failed, %s"), gpgme_strerror(err));
gpgme_data_release(gpgtext);
g_free(textstr);
fprintf(dstfp, "MIME-Version: 1.0\n");
- chars = gpgme_data_release_and_get_mem(plain, &len);
+ chars = sgpgme_data_release_and_get_mem(plain, &len);
if (len > 0)
fwrite(chars, len, 1, dstfp);
fclose(dstfp);
return FALSE;
}
- sigcontent = gpgme_data_release_and_get_mem(gpgsig, &len);
+ sigcontent = sgpgme_data_release_and_get_mem(gpgsig, &len);
gpgme_data_release(gpgtext);
g_free(textstr);
if (sigcontent == NULL || len <= 0) {
- g_warning("gpgme_data_release_and_get_mem failed");
+ g_warning("sgpgme_data_release_and_get_mem failed");
privacy_set_error(_("Data signing failed, no contents."));
return FALSE;
}
err = gpgme_op_encrypt(ctx, kset, GPGME_ENCRYPT_ALWAYS_TRUST, gpgtext, gpgenc);
- enccontent = gpgme_data_release_and_get_mem(gpgenc, &len);
+ enccontent = sgpgme_data_release_and_get_mem(gpgenc, &len);
gpgme_data_release(gpgtext);
g_free(textstr);
if (enccontent == NULL || len <= 0) {
- g_warning("gpgme_data_release_and_get_mem failed");
+ g_warning("sgpgme_data_release_and_get_mem failed");
privacy_set_error(_("Encryption failed, %s"), gpgme_strerror(err));
gpgme_release(ctx);
return FALSE;