diff options
author | Dan Vrátil <dvratil@redhat.com> | 2012-07-18 20:24:48 +0800 |
---|---|---|
committer | Dan Vrátil <dvratil@redhat.com> | 2012-07-18 21:12:08 +0800 |
commit | 0e63a88ff141d2473e60df4e6b0a29def0a9e74b (patch) | |
tree | 8290dba8bf25761d6f3659852696df0ff2bb054a /mail/e-mail-display.c | |
parent | eb959436c3c7b2eb14e8e09d286f99819133eb2f (diff) | |
download | gsoc2013-evolution-0e63a88ff141d2473e60df4e6b0a29def0a9e74b.tar.gz gsoc2013-evolution-0e63a88ff141d2473e60df4e6b0a29def0a9e74b.tar.zst gsoc2013-evolution-0e63a88ff141d2473e60df4e6b0a29def0a9e74b.zip |
Bug #679843 - Double free when printing
Diffstat (limited to 'mail/e-mail-display.c')
-rw-r--r-- | mail/e-mail-display.c | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c index 8c2a3807b4..be99ea226c 100644 --- a/mail/e-mail-display.c +++ b/mail/e-mail-display.c @@ -1525,10 +1525,11 @@ e_mail_display_init (EMailDisplay *display) e_web_view_install_request_handler (E_WEB_VIEW (display), E_TYPE_FILE_REQUEST); e_web_view_install_request_handler (E_WEB_VIEW (display), E_TYPE_STOCK_REQUEST); - /* cache expiry - 2 hour access, 1 day max */ - user_cache_dir = e_get_user_cache_dir (); - emd_global_http_cache = camel_data_cache_new (user_cache_dir, NULL); - if (emd_global_http_cache) { + if (!emd_global_http_cache) { + user_cache_dir = e_get_user_cache_dir (); + emd_global_http_cache = camel_data_cache_new (user_cache_dir, NULL); + + /* cache expiry - 2 hour access, 1 day max */ camel_data_cache_set_expire_age (emd_global_http_cache, 24 * 60 * 60); camel_data_cache_set_expire_access (emd_global_http_cache, 2 * 60 * 60); } @@ -1716,15 +1717,13 @@ static gboolean do_reload_display (EMailDisplay *display) { EWebView *web_view; - const gchar *uri; - gchar *base; - GString *new_uri; + gchar *uri, *query; GHashTable *table; - GHashTableIter table_iter; - gpointer key, val; + SoupURI *soup_uri; + gchar *mode, *collapsable, *collapsed; web_view = E_WEB_VIEW (display); - uri = e_web_view_get_uri (web_view); + uri = (gchar *) e_web_view_get_uri (web_view); display->priv->scheduled_reload = 0; @@ -1736,30 +1735,33 @@ do_reload_display (EMailDisplay *display) return FALSE; } - base = g_strndup (uri, strstr (uri, "?") - uri + 1); - new_uri = g_string_new (base); - g_free (base); + soup_uri = soup_uri_new (uri); - table = soup_form_decode (strstr (uri, "?") + 1); - g_hash_table_replace (table, g_strdup ("mode"), g_strdup_printf ("%d", display->priv->mode)); - g_hash_table_replace (table, g_strdup ("headers_collapsable"), g_strdup_printf ("%d", display->priv->headers_collapsable)); - g_hash_table_replace (table, g_strdup ("headers_collapsed"), g_strdup_printf ("%d", display->priv->headers_collapsed)); + mode = g_strdup_printf ("%d", display->priv->mode); + collapsable = g_strdup_printf ("%d", display->priv->headers_collapsable); + collapsed = g_strdup_printf ("%d", display->priv->headers_collapsed); - g_hash_table_iter_init (&table_iter, table); - while (g_hash_table_iter_next (&table_iter, &key, &val)) { - g_string_append_printf (new_uri, "%s=%s&", - (gchar *) key, (gchar *) val); - - /* Free the value as Soup constructs the GHashTable without - * value_destroy_func */ - g_free (val); - } + table = soup_form_decode (soup_uri->query); + g_hash_table_replace (table, g_strdup ("mode"), mode); + g_hash_table_replace (table, g_strdup ("headers_collapsable"), collapsable); + g_hash_table_replace (table, g_strdup ("headers_collapsed"), collapsed); - e_web_view_load_uri (web_view, new_uri->str); + query = soup_form_encode_hash (table); - g_string_free (new_uri, TRUE); + /* The hash table does not free custom values upon destruction */ + g_free (mode); + g_free (collapsable); + g_free (collapsed); g_hash_table_destroy (table); + soup_uri_set_query (soup_uri, query); + g_free (query); + + uri = soup_uri_to_string (soup_uri, FALSE); + e_web_view_load_uri (web_view, uri); + g_free (uri); + soup_uri_free (soup_uri); + return FALSE; } |