[evolution-data-server] Camel: Use thread-safe accessors for string settings.



commit 3c3d776c4f8a346d1c5debc89da53eb366a06e73
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Jan 3 09:25:27 2012 -0500

    Camel: Use thread-safe accessors for string settings.

 camel/camel-network-service.c               |    6 +-
 camel/camel-sasl-cram-md5.c                 |    6 +-
 camel/camel-sasl-digest-md5.c               |   27 +++--
 camel/camel-sasl-gssapi.c                   |   34 ++++---
 camel/camel-sasl-login.c                    |   14 ++-
 camel/camel-sasl-ntlm.c                     |   31 ++++--
 camel/camel-sasl-plain.c                    |    6 +-
 camel/camel-service.c                       |   16 ++-
 camel/providers/imap/camel-imap-command.c   |   15 ++-
 camel/providers/imap/camel-imap-folder.c    |   58 ++++++----
 camel/providers/imap/camel-imap-store.c     |  157 ++++++++++++++++++---------
 camel/providers/imapx/camel-imapx-server.c  |   99 ++++++++++++------
 camel/providers/imapx/camel-imapx-store.c   |   24 +++--
 camel/providers/local/camel-local-store.c   |  110 ++++++++++++-------
 camel/providers/local/camel-maildir-store.c |  116 ++++++++++++--------
 camel/providers/local/camel-mbox-store.c    |   35 +++----
 camel/providers/local/camel-mh-store.c      |   87 +++++++++-------
 camel/providers/local/camel-spool-store.c   |   71 ++++++++-----
 camel/providers/nntp/camel-nntp-store.c     |   39 +++++---
 camel/providers/nntp/camel-nntp-summary.c   |   12 ++-
 camel/providers/pop3/camel-pop3-store.c     |  130 ++++++++++++++--------
 camel/providers/smtp/camel-smtp-transport.c |   89 ++++++++++------
 22 files changed, 739 insertions(+), 443 deletions(-)
---
diff --git a/camel/camel-network-service.c b/camel/camel-network-service.c
index 687a387..b600c3f 100644
--- a/camel/camel-network-service.c
+++ b/camel/camel-network-service.c
@@ -45,11 +45,11 @@ network_service_connect_sync (CamelNetworkService *service,
 	CamelSession *session;
 	CamelStream *stream;
 	const gchar *service_name;
-	const gchar *host;
 	guint16 default_port;
 	guint16 port;
 	gchar *socks_host;
 	gint socks_port;
+	gchar *host;
 	gint status;
 
 	session = camel_service_get_session (CAMEL_SERVICE (service));
@@ -58,7 +58,7 @@ network_service_connect_sync (CamelNetworkService *service,
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
 	method = camel_network_settings_get_security_method (network_settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 	port = camel_network_settings_get_port (network_settings);
 
 	service_name = camel_network_service_get_service_name (service, method);
@@ -114,6 +114,8 @@ network_service_connect_sync (CamelNetworkService *service,
 		stream = NULL;
 	}
 
+	g_free (host);
+
 	return stream;
 }
 
diff --git a/camel/camel-sasl-cram-md5.c b/camel/camel-sasl-cram-md5.c
index 0b171e1..505f83f 100644
--- a/camel/camel-sasl-cram-md5.c
+++ b/camel/camel-sasl-cram-md5.c
@@ -67,11 +67,11 @@ sasl_cram_md5_challenge_sync (CamelSasl *sasl,
 	guint8 *digest;
 	gsize length;
 	const gchar *hex;
-	const gchar *user;
 	const gchar *password;
 	GByteArray *ret = NULL;
 	guchar ipad[64];
 	guchar opad[64];
+	gchar *user;
 	gint i, pw_len;
 
 	/* Need to wait for the server */
@@ -84,7 +84,7 @@ sasl_cram_md5_challenge_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
@@ -137,6 +137,8 @@ sasl_cram_md5_challenge_sync (CamelSasl *sasl,
 
 	camel_sasl_set_authenticated (sasl, TRUE);
 
+	g_free (user);
+
 	return ret;
 }
 
diff --git a/camel/camel-sasl-digest-md5.c b/camel/camel-sasl-digest-md5.c
index 3f01046..f36306b 100644
--- a/camel/camel-sasl-digest-md5.c
+++ b/camel/camel-sasl-digest-md5.c
@@ -813,8 +813,8 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 	struct addrinfo *ai, hints;
 	const gchar *service_name;
 	const gchar *password;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
 
 	/* Need to wait for the server */
 	if (!token)
@@ -827,12 +827,12 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, NULL);
 
 	if (host == NULL)
-		host = "localhost";
+		host = g_strdup ("localhost");
 
 	password = camel_service_get_password (service);
 	g_return_val_if_fail (password != NULL, NULL);
@@ -844,7 +844,7 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Server challenge too long (>2048 octets)"));
-			return NULL;
+			goto exit;
 		}
 
 		tokens = g_strndup ((gchar *) token->data, token->len);
@@ -855,7 +855,7 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Server challenge invalid\n"));
-			return NULL;
+			goto exit;
 		}
 
 		if (priv->challenge->qop == QOP_INVALID) {
@@ -864,7 +864,7 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Server challenge contained invalid "
 				  "\"Quality of Protection\" token"));
-			return NULL;
+			goto exit;
 		}
 
 		memset (&hints, 0, sizeof (hints));
@@ -897,7 +897,7 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Server response did not contain "
 				  "authorization data"));
-			return NULL;
+			goto exit;
 		}
 
 		rspauth = g_new0 (struct _param, 1);
@@ -918,7 +918,7 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Server response contained incomplete "
 				  "authorization data"));
-			return NULL;
+			goto exit;
 		}
 
 		compute_response (priv->response, password, FALSE, out);
@@ -931,8 +931,7 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Server response does not match"));
 			camel_sasl_set_authenticated (sasl, TRUE);
-
-			return NULL;
+			goto exit;
 		}
 
 		g_free (rspauth->name);
@@ -948,6 +947,10 @@ sasl_digest_md5_challenge_sync (CamelSasl *sasl,
 
 	priv->state++;
 
+exit:
+	g_free (host);
+	g_free (user);
+
 	return ret;
 }
 
diff --git a/camel/camel-sasl-gssapi.c b/camel/camel-sasl-gssapi.c
index 72d6665..7f03b9c 100644
--- a/camel/camel-sasl-gssapi.c
+++ b/camel/camel-sasl-gssapi.c
@@ -280,8 +280,8 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 	gchar *str;
 	struct addrinfo *ai, hints;
 	const gchar *service_name;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
 
 	priv = CAMEL_SASL_GSSAPI (sasl)->priv;
 
@@ -292,12 +292,12 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, NULL);
 
 	if (host == NULL)
-		host = "localhost";
+		host = g_strdup ("localhost");
 
 	switch (priv->state) {
 	case GSSAPI_STATE_INIT:
@@ -306,7 +306,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 		ai = camel_getaddrinfo (
 			host, NULL, &hints, cancellable, error);
 		if (ai == NULL)
-			return NULL;
+			goto exit;
 
 		str = g_strdup_printf("%s %s", service_name, ai->ai_canonname);
 		camel_freeaddrinfo (ai);
@@ -318,7 +318,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 
 		if (major != GSS_S_COMPLETE) {
 			gssapi_set_exception (major, minor, error);
-			return NULL;
+			goto exit;
 		}
 
 		input_token = GSS_C_NO_BUFFER;
@@ -331,7 +331,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Bad authentication response from server."));
-			return NULL;
+			goto exit;
 		}
 
 		inbuf.value = token->data;
@@ -360,7 +360,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 					goto challenge;
 
 			gssapi_set_exception (major, minor, error);
-			return NULL;
+			goto exit;
 		}
 
 		challenge = g_byte_array_new ();
@@ -375,7 +375,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Bad authentication response from server."));
-			return NULL;
+			goto exit;
 		}
 
 		inbuf.value = token->data;
@@ -384,7 +384,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 		major = gss_unwrap (&minor, priv->ctx, &inbuf, &outbuf, &conf_state, &qop);
 		if (major != GSS_S_COMPLETE) {
 			gssapi_set_exception (major, minor, error);
-			return NULL;
+			goto exit;
 		}
 
 		if (outbuf.length < 4) {
@@ -395,7 +395,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 #ifndef HAVE_HEIMDAL_KRB5
 			gss_release_buffer (&minor, &outbuf);
 #endif
-			return NULL;
+			goto exit;
 		}
 
 		/* check that our desired security layer is supported */
@@ -407,7 +407,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 #ifndef HAVE_HEIMDAL_KRB5
 			gss_release_buffer (&minor, &outbuf);
 #endif
-			return NULL;
+			goto exit;
 		}
 
 		inbuf.length = 4 + strlen (user);
@@ -424,7 +424,7 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 		if (major != GSS_S_COMPLETE) {
 			gssapi_set_exception (major, minor, error);
 			g_free (str);
-			return NULL;
+			goto exit;
 		}
 
 		g_free (str);
@@ -440,9 +440,13 @@ sasl_gssapi_challenge_sync (CamelSasl *sasl,
 		camel_sasl_set_authenticated (sasl, TRUE);
 		break;
 	default:
-		return NULL;
+		break;
 	}
 
+exit:
+	g_free (host);
+	g_free (user);
+
 	return challenge;
 }
 
diff --git a/camel/camel-sasl-login.c b/camel/camel-sasl-login.c
index dc3889a..6d30340 100644
--- a/camel/camel-sasl-login.c
+++ b/camel/camel-sasl-login.c
@@ -65,7 +65,11 @@ sasl_login_challenge_sync (CamelSasl *sasl,
 	CamelService *service;
 	GByteArray *buf = NULL;
 	const gchar *password;
-	const gchar *user;
+	gchar *user;
+
+	/* Need to wait for the server */
+	if (token == NULL)
+		return NULL;
 
 	priv = CAMEL_SASL_LOGIN (sasl)->priv;
 
@@ -75,16 +79,12 @@ sasl_login_challenge_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
 	g_return_val_if_fail (password != NULL, NULL);
 
-	/* Need to wait for the server */
-	if (!token)
-		return NULL;
-
 	switch (priv->state) {
 	case LOGIN_USER:
 		buf = g_byte_array_new ();
@@ -105,6 +105,8 @@ sasl_login_challenge_sync (CamelSasl *sasl,
 
 	priv->state++;
 
+	g_free (user);
+
 	return buf;
 }
 
diff --git a/camel/camel-sasl-ntlm.c b/camel/camel-sasl-ntlm.c
index 092ebde..36b6784 100644
--- a/camel/camel-sasl-ntlm.c
+++ b/camel/camel-sasl-ntlm.c
@@ -693,8 +693,9 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 	guchar nonce[8], hash[21], lm_resp[24], nt_resp[24];
 	GString *domain = NULL;
 	const gchar *password;
-	const gchar *user;
+	const gchar *real_user;
 	const gchar *cp;
+	gchar *user = NULL;
 
 	service = camel_sasl_get_service (sasl);
 
@@ -702,7 +703,7 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
@@ -726,7 +727,7 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 				g_free (priv->type1_msg);
 				priv->type1_msg = NULL;
 			}
-			return ret;
+			goto exit;
 		} else {
 			gchar *type2;
 			gchar *string;
@@ -749,13 +750,15 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 			g_free (string);
 			g_free (type2);
 		}
+
 		/* On failure, we just return an empty string. Setting the
 		 * GError would cause the providers to abort the whole
 		 * connection, and we want them to ask the user for a password
 		 * and continue. */
 		g_object_unref (priv->helper_stream);
 		priv->helper_stream = NULL;
-		return ret;
+
+		goto exit;
 	}
 #endif
 
@@ -809,8 +812,9 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 	cp = strchr (user, '\\');
 	if (cp != NULL) {
 		domain = g_string_new_len (user, cp - user);
-		user = cp + 1;
-	}
+		real_user = cp + 1;
+	} else
+		real_user = user;
 
 	/* Otherwise, fall back to the domain of the server, if possible */
 	if (domain == NULL)
@@ -832,7 +836,7 @@ sasl_ntlm_challenge_sync (CamelSasl *sasl,
 	ntlm_set_string (ret, NTLM_RESPONSE_DOMAIN_OFFSET,
 			 domain->str, domain->len);
 	ntlm_set_string (ret, NTLM_RESPONSE_USER_OFFSET,
-			 user, strlen (user));
+			 real_user, strlen (real_user));
 	ntlm_set_string (ret, NTLM_RESPONSE_HOST_OFFSET,
 			 "UNKNOWN", sizeof ("UNKNOWN") - 1);
 	ntlm_set_string (ret, NTLM_RESPONSE_LM_RESP_OFFSET,
@@ -853,6 +857,8 @@ fail:
 			     sizeof (NTLM_REQUEST) - 1);
 
 exit:
+	g_free (user);
+
 	return ret;
 }
 
@@ -868,8 +874,8 @@ sasl_ntlm_try_empty_password_sync (CamelSasl *sasl,
 	CamelService *service;
 	CamelSaslNTLM *ntlm = CAMEL_SASL_NTLM (sasl);
 	CamelSaslNTLMPrivate *priv = ntlm->priv;
-	const gchar *user;
 	const gchar *cp;
+	gchar *user;
 	gchar buf[1024];
 	gsize s;
 	gchar *command;
@@ -884,7 +890,7 @@ sasl_ntlm_try_empty_password_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), FALSE);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, FALSE);
 
 	cp = strchr (user, '\\');
@@ -900,22 +906,29 @@ sasl_ntlm_try_empty_password_sync (CamelSasl *sasl,
 			"--use-cached-creds --username '%s'",
 			NTLM_AUTH_HELPER, user);
 	}
+
 	ret = camel_stream_process_connect (
 		CAMEL_STREAM_PROCESS (stream), command, NULL, error);
+
 	g_free (command);
+	g_free (user);
+
 	if (ret) {
 		g_object_unref (stream);
 		return FALSE;
 	}
+
 	if (camel_stream_write_string (stream, "YR\n", cancellable, error) < 0) {
 		g_object_unref (stream);
 		return FALSE;
 	}
+
 	s = camel_stream_read (stream, buf, sizeof (buf), cancellable, NULL);
 	if (s < 4) {
 		g_object_unref (stream);
 		return FALSE;
 	}
+
 	if (buf[0] != 'Y' || buf[1] != 'R' || buf[2] != ' ' || buf[s - 1] != '\n') {
 		g_object_unref (stream);
 		return FALSE;
diff --git a/camel/camel-sasl-plain.c b/camel/camel-sasl-plain.c
index d80682c..740629b 100644
--- a/camel/camel-sasl-plain.c
+++ b/camel/camel-sasl-plain.c
@@ -59,7 +59,7 @@ sasl_plain_challenge_sync (CamelSasl *sasl,
 	CamelService *service;
 	GByteArray *buf = NULL;
 	const gchar *password;
-	const gchar *user;
+	gchar *user;
 
 	service = camel_sasl_get_service (sasl);
 
@@ -67,7 +67,7 @@ sasl_plain_challenge_sync (CamelSasl *sasl,
 	g_return_val_if_fail (CAMEL_IS_NETWORK_SETTINGS (settings), NULL);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 	g_return_val_if_fail (user != NULL, NULL);
 
 	password = camel_service_get_password (service);
@@ -82,6 +82,8 @@ sasl_plain_challenge_sync (CamelSasl *sasl,
 
 	camel_sasl_set_authenticated (sasl, TRUE);
 
+	g_free (user);
+
 	return buf;
 }
 
diff --git a/camel/camel-service.c b/camel/camel-service.c
index 61d9929..b5e7090 100644
--- a/camel/camel-service.c
+++ b/camel/camel-service.c
@@ -746,9 +746,9 @@ camel_service_new_camel_url (CamelService *service)
 	CamelURL *url;
 	CamelProvider *provider;
 	CamelSettings *settings;
-	const gchar *host = NULL;
-	const gchar *user = NULL;
-	const gchar *path = NULL;
+	gchar *host = NULL;
+	gchar *user = NULL;
+	gchar *path = NULL;
 	guint16 port = 0;
 
 	g_return_val_if_fail (CAMEL_IS_SERVICE (service), NULL);
@@ -765,16 +765,16 @@ camel_service_new_camel_url (CamelService *service)
 		CamelNetworkSettings *network_settings;
 
 		network_settings = CAMEL_NETWORK_SETTINGS (settings);
-		host = camel_network_settings_get_host (network_settings);
+		host = camel_network_settings_dup_host (network_settings);
 		port = camel_network_settings_get_port (network_settings);
-		user = camel_network_settings_get_user (network_settings);
+		user = camel_network_settings_dup_user (network_settings);
 	}
 
 	if (CAMEL_IS_LOCAL_SETTINGS (settings)) {
 		CamelLocalSettings *local_settings;
 
 		local_settings = CAMEL_LOCAL_SETTINGS (settings);
-		path = camel_local_settings_get_path (local_settings);
+		path = camel_local_settings_dup_path (local_settings);
 	}
 
 	camel_url_set_protocol (url, provider->protocol);
@@ -783,6 +783,10 @@ camel_service_new_camel_url (CamelService *service)
 	camel_url_set_user (url, user);
 	camel_url_set_path (url, path);
 
+	g_free (host);
+	g_free (user);
+	g_free (path);
+
 	return url;
 }
 
diff --git a/camel/providers/imap/camel-imap-command.c b/camel/providers/imap/camel-imap-command.c
index f57547a..eb5f7d6 100644
--- a/camel/providers/imap/camel-imap-command.c
+++ b/camel/providers/imap/camel-imap-command.c
@@ -346,21 +346,22 @@ camel_imap_command_response (CamelImapStore *store,
 	CamelService *service;
 	CamelSession *session;
 	CamelImapResponseType type;
-	const gchar *host;
-	const gchar *user;
 	gchar *respbuf;
+	gchar *host;
+	gchar *user;
 
 	service = CAMEL_SERVICE (store);
 	session = camel_service_get_session (service);
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (camel_imap_store_readline (store, &respbuf, cancellable, error) < 0) {
 		g_static_rec_mutex_unlock (&store->command_and_response_lock);
-		return CAMEL_IMAP_RESPONSE_ERROR;
+		type = CAMEL_IMAP_RESPONSE_ERROR;
+		goto exit;
 	}
 
 	switch (*respbuf) {
@@ -439,6 +440,10 @@ camel_imap_command_response (CamelImapStore *store,
 	    type == CAMEL_IMAP_RESPONSE_TAGGED)
 		g_static_rec_mutex_unlock (&store->command_and_response_lock);
 
+exit:
+	g_free (host);
+	g_free (user);
+
 	return type;
 }
 
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c
index 05fa87c..6464872 100644
--- a/camel/providers/imap/camel-imap-folder.c
+++ b/camel/providers/imap/camel-imap-folder.c
@@ -448,29 +448,29 @@ camel_imap_folder_new (CamelStore *parent,
 	} else {
 		CamelService *service;
 		CamelSettings *settings;
-		const gchar *junk_path;
-		const gchar *trash_path;
 		gboolean filter_junk;
 		gboolean filter_junk_inbox;
 		gboolean folder_is_junk;
 		gboolean folder_is_trash;
+		gchar *junk_path;
+		gchar *trash_path;
 
 		service = CAMEL_SERVICE (parent);
 		settings = camel_service_get_settings (service);
 
-		junk_path = camel_imap_settings_get_real_junk_path (
+		junk_path = camel_imap_settings_dup_real_junk_path (
 			CAMEL_IMAP_SETTINGS (settings));
 
 		/* So we can safely compare strings. */
 		if (junk_path == NULL)
-			junk_path = "";
+			junk_path = g_strdup ("");
 
-		trash_path = camel_imap_settings_get_real_trash_path (
+		trash_path = camel_imap_settings_dup_real_trash_path (
 			CAMEL_IMAP_SETTINGS (settings));
 
 		/* So we can safely compare strings. */
 		if (trash_path == NULL)
-			trash_path = "";
+			trash_path = g_strdup ("");
 
 		filter_junk = camel_imap_settings_get_filter_junk (
 			CAMEL_IMAP_SETTINGS (settings));
@@ -493,6 +493,9 @@ camel_imap_folder_new (CamelStore *parent,
 
 		if (folder_is_junk)
 			folder->folder_flags |= CAMEL_FOLDER_IS_JUNK;
+
+		g_free (junk_path);
+		g_free (trash_path);
 	}
 
 	imap_folder->search = camel_imap_search_new (folder_dir);
@@ -1502,7 +1505,8 @@ is_google_account (CamelStore *store)
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *host;
+	gboolean is_google;
+	gchar *host;
 
 	g_return_val_if_fail (store != NULL, FALSE);
 	g_return_val_if_fail (CAMEL_IS_STORE (store), FALSE);
@@ -1511,11 +1515,16 @@ is_google_account (CamelStore *store)
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
-	return host != NULL && (
+	is_google =
+		(host != NULL) && (
 		host_ends_with (host, "gmail.com") ||
 		host_ends_with (host, "googlemail.com"));
+
+	g_free (host);
+
+	return is_google;
 }
 
 static void
@@ -1558,7 +1567,7 @@ imap_synchronize_sync (CamelFolder *folder,
 	gboolean success, is_gmail;
 	CamelFolder *real_junk = NULL;
 	CamelFolder *real_trash = NULL;
-	const gchar *folder_path;
+	gchar *folder_path;
 	GError *local_error = NULL;
 
 	GPtrArray *matches, *summary, *deleted_uids = NULL, *junked_uids = NULL;
@@ -1594,7 +1603,7 @@ imap_synchronize_sync (CamelFolder *folder,
 	max = summary->len;
 
 	/* deleted_uids is NULL when not using real trash */
-	folder_path = camel_imap_settings_get_real_trash_path (
+	folder_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
 	if (folder_path != NULL) {
 		if ((folder->folder_flags & CAMEL_FOLDER_IS_TRASH) != 0) {
@@ -1611,12 +1620,13 @@ imap_synchronize_sync (CamelFolder *folder,
 			}
 		}
 	}
+	g_free (folder_path);
 
 	if (real_trash)
 		deleted_uids = g_ptr_array_new ();
 
 	/* junked_uids is NULL when not using real junk */
-	folder_path = camel_imap_settings_get_real_junk_path (
+	folder_path = camel_imap_settings_dup_real_junk_path (
 		CAMEL_IMAP_SETTINGS (settings));
 	if (folder_path != NULL) {
 		if ((folder->folder_flags & CAMEL_FOLDER_IS_JUNK) != 0) {
@@ -1634,6 +1644,7 @@ imap_synchronize_sync (CamelFolder *folder,
 			}
 		}
 	}
+	g_free (folder_path);
 
 	if (real_junk)
 		junked_uids = g_ptr_array_new ();
@@ -2776,12 +2787,13 @@ do_copy (CamelFolder *source,
 	CamelStore *parent_store;
 	CamelImapStore *store;
 	CamelImapResponse *response;
-	const gchar *trash_path;
 	const gchar *full_name;
+	gchar *trash_path;
 	gchar *uidset;
 	gint uid = 0, last = 0, i;
 	GError *local_error = NULL;
 	gboolean mark_moved;
+	gboolean success = TRUE;
 
 	parent_store = camel_folder_get_parent_store (source);
 	store = CAMEL_IMAP_STORE (parent_store);
@@ -2789,7 +2801,7 @@ do_copy (CamelFolder *source,
 	service = CAMEL_SERVICE (parent_store);
 	settings = camel_service_get_settings (service);
 
-	trash_path = camel_imap_settings_get_real_trash_path (
+	trash_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
 
 	mark_moved = is_google_account (parent_store) && trash_path != NULL;
@@ -2841,18 +2853,18 @@ do_copy (CamelFolder *source,
 
 	if (local_error != NULL) {
 		g_propagate_error (error, local_error);
-		return FALSE;
-	}
+		success = FALSE;
 
 	/* There is a real trash folder set, which is not on a google account
 	 * and copied messages should be deleted, thus do not move them into
 	 * a trash folder, but just expunge them, because the copy part of
-	 * the operation was successful.
-	*/
-	if (trash_path && !mark_moved && delete_originals)
+	 * the operation was successful. */
+	} else if (trash_path && !mark_moved && delete_originals)
 		camel_imap_expunge_uids_only (source, uids, cancellable, NULL);
 
-	return TRUE;
+	g_free (trash_path);
+
+	return success;
 }
 
 static gboolean
@@ -3900,7 +3912,7 @@ imap_update_summary (CamelFolder *folder,
 	CamelImapFolder *imap_folder = CAMEL_IMAP_FOLDER (folder);
 	GPtrArray *fetch_data = NULL, *messages = NULL, *needheaders;
 	CamelFetchHeadersType fetch_headers;
-	const gchar * const *extra_headers;
+	gchar **extra_headers;
 	guint32 flags, uidval;
 	gint i, seq, first, size, got;
 	CamelImapResponseType type;
@@ -3919,7 +3931,7 @@ imap_update_summary (CamelFolder *folder,
 	fetch_headers = camel_imap_settings_get_fetch_headers (
 		CAMEL_IMAP_SETTINGS (settings));
 
-	extra_headers = camel_imap_settings_get_fetch_headers_extra (
+	extra_headers = camel_imap_settings_dup_fetch_headers_extra (
 		CAMEL_IMAP_SETTINGS (settings));
 
 	if (store->server_level >= IMAP_LEVEL_IMAP4REV1) {
@@ -3951,6 +3963,8 @@ imap_update_summary (CamelFolder *folder,
 	} else
 		header_spec = g_string_new ("0");
 
+	g_strfreev (extra_headers);
+
 	d(printf("Header is : %s", header_spec->str));
 
 	/* Figure out if any of the new messages are already cached (which
diff --git a/camel/providers/imap/camel-imap-store.c b/camel/providers/imap/camel-imap-store.c
index 3e9b456..3320243 100644
--- a/camel/providers/imap/camel-imap-store.c
+++ b/camel/providers/imap/camel-imap-store.c
@@ -140,8 +140,8 @@ imap_store_update_store_flags (CamelStore *store)
 	CamelService *service;
 	CamelSettings *settings;
 	CamelImapSettings *imap_settings;
-	const gchar *real_path;
 	gboolean use_real_path;
+	gchar *real_path;
 
 	/* XXX This only responds to the service's entire settings object
 	 *     being replaced, not when individual settings change.  When
@@ -152,7 +152,7 @@ imap_store_update_store_flags (CamelStore *store)
 	settings = camel_service_get_settings (service);
 	imap_settings = CAMEL_IMAP_SETTINGS (settings);
 
-	real_path = camel_imap_settings_get_real_junk_path (imap_settings);
+	real_path = camel_imap_settings_dup_real_junk_path (imap_settings);
 	use_real_path = camel_imap_settings_get_use_real_junk_path (imap_settings);
 
 	if (use_real_path && real_path != NULL) {
@@ -163,13 +163,17 @@ imap_store_update_store_flags (CamelStore *store)
 		store->flags |= CAMEL_STORE_VJUNK;
 	}
 
-	real_path = camel_imap_settings_get_real_trash_path (imap_settings);
+	g_free (real_path);
+
+	real_path = camel_imap_settings_dup_real_trash_path (imap_settings);
 	use_real_path = camel_imap_settings_get_use_real_trash_path (imap_settings);
 
 	if (use_real_path && real_path != NULL)
 		store->flags &= ~CAMEL_STORE_VTRASH;
 	else
 		store->flags |= CAMEL_STORE_VTRASH;
+
+	g_free (real_path);
 }
 
 static void
@@ -286,7 +290,8 @@ connect_to_server (CamelService *service,
 	CamelNetworkSecurityMethod method;
 	gboolean force_imap4 = FALSE;
 	gboolean clean_quit = TRUE;
-	const gchar *host;
+	gboolean success = TRUE;
+	gchar *host;
 	gchar *buf;
 
 	tcp_stream = camel_network_service_connect_sync (
@@ -298,7 +303,7 @@ connect_to_server (CamelService *service,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 	method = camel_network_settings_get_security_method (network_settings);
 
 	store->ostream = tcp_stream;
@@ -331,8 +336,9 @@ connect_to_server (CamelService *service,
 		}
 
 		store->connected = FALSE;
+		success = FALSE;
 
-		return FALSE;
+		goto exit;
 	}
 
 	if (!strncmp(buf, "* PREAUTH", 9))
@@ -381,7 +387,9 @@ connect_to_server (CamelService *service,
 		}
 
 		store->connected = FALSE;
-		return FALSE;
+		success = FALSE;
+
+		goto exit;
 	}
 
 	if (force_imap4) {
@@ -390,7 +398,7 @@ connect_to_server (CamelService *service,
 	}
 
 	if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT)
-		return TRUE;  /* we're done */
+		goto exit;  /* we're done */
 
 	/* as soon as we send a STARTTLS command, all hope is lost of a clean QUIT if problems arise */
 	clean_quit = FALSE;
@@ -407,9 +415,14 @@ connect_to_server (CamelService *service,
 	response = camel_imap_command (store, NULL, cancellable, error, "STARTTLS");
 	if (!response) {
 		g_object_unref (store->istream);
+		store->istream = NULL;
+
 		g_object_unref (store->ostream);
-		store->istream = store->ostream = NULL;
-		return FALSE;
+		store->ostream = NULL;
+
+		success = FALSE;
+
+		goto exit;
 	}
 
 	camel_imap_response_free_without_processing (store, response);
@@ -438,8 +451,9 @@ connect_to_server (CamelService *service,
 		}
 
 		store->connected = FALSE;
+		success = FALSE;
 
-		return FALSE;
+		goto exit;
 	}
 
 	if (store->capabilities & IMAP_CAPABILITY_LOGINDISABLED ) {
@@ -451,7 +465,7 @@ connect_to_server (CamelService *service,
 		goto exception;
 	}
 
-	return TRUE;
+	goto exit;
 
 exception:
 
@@ -474,7 +488,12 @@ exception:
 
 	store->connected = FALSE;
 
-	return FALSE;
+	success = FALSE;
+
+exit:
+	g_free (host);
+
+	return success;
 }
 
 #ifndef G_OS_WIN32
@@ -499,8 +518,8 @@ connect_to_server_process (CamelService *service,
 	gchar *full_cmd;
 	gchar *child_env[7];
 	const gchar *password;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
 	guint16 port;
 
 	memset (&url, 0, sizeof (CamelURL));
@@ -510,9 +529,9 @@ connect_to_server_process (CamelService *service,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 	port = camel_network_settings_get_port (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	camel_url_set_protocol (&url, provider->protocol);
 	camel_url_set_host (&url, host);
@@ -580,6 +599,9 @@ connect_to_server_process (CamelService *service,
 
 	g_free (cmd_copy);
 
+	g_free (host);
+	g_free (user);
+
 	cmd_stream = camel_stream_process_new ();
 
 	ret = camel_stream_process_connect (
@@ -651,23 +673,30 @@ connect_to_server_wrapper (CamelService *service,
                            GCancellable *cancellable,
                            GError **error)
 {
-#ifndef G_OS_WIN32
 	CamelSettings *settings;
-	const gchar *shell_command;
+	gchar *shell_command;
 	gboolean use_shell_command;
+	gboolean success;
 
 	settings = camel_service_get_settings (service);
-	shell_command = camel_imap_settings_get_shell_command (
+	shell_command = camel_imap_settings_dup_shell_command (
 		CAMEL_IMAP_SETTINGS (settings));
 	use_shell_command = camel_imap_settings_get_use_shell_command (
 		CAMEL_IMAP_SETTINGS (settings));
 
+#ifndef G_OS_WIN32
 	if (use_shell_command && shell_command != NULL)
-		return connect_to_server_process (
+		success = connect_to_server_process (
 			service, shell_command, cancellable, error);
+	else
+		success = connect_to_server (service, cancellable, error);
+#else
+	success = connect_to_server (service, cancellable, error);
 #endif
 
-	return connect_to_server (service, cancellable, error);
+	g_free (shell_command);
+
+	return success;
 }
 
 static gboolean
@@ -679,21 +708,22 @@ imap_auth_loop (CamelService *service,
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
 	CamelSession *session;
-	const gchar *mechanism;
-	const gchar *host;
+	gchar *mechanism;
+	gchar *host;
+	gboolean success = TRUE;
 
 	session = camel_service_get_session (service);
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	mechanism = camel_network_settings_get_auth_mechanism (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	mechanism = camel_network_settings_dup_auth_mechanism (network_settings);
 
 	if (store->preauthed) {
 		if (camel_verbose_debug)
 			fprintf(stderr, "Server %s has preauthenticated us.\n",
 				host);
-		return TRUE;
+		goto exit;
 	}
 
 	if (mechanism != NULL) {
@@ -703,12 +733,19 @@ imap_auth_loop (CamelService *service,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("IMAP server %s does not support %s "
 				  "authentication"), host, mechanism);
-			return FALSE;
+			success = FALSE;
+			goto exit;
 		}
 	}
 
-	return camel_session_authenticate_sync (
+	success = camel_session_authenticate_sync (
 		session, service, mechanism, cancellable, error);
+
+exit:
+	g_free (host);
+	g_free (mechanism);
+
+	return success;
 }
 
 static gboolean
@@ -757,21 +794,27 @@ imap_store_get_name (CamelService *service,
 {
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
+	gchar *name;
 
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (brief)
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("IMAP server %s"), host);
 	else
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("IMAP service for %s on %s"), user, host);
+
+	g_free (host);
+	g_free (user);
+
+	return name;
 }
 
 static gboolean
@@ -1053,13 +1096,13 @@ imap_store_authenticate_sync (CamelService *service,
 		CamelNetworkSettings *network_settings;
 		CamelSettings *settings;
 		const gchar *password;
-		const gchar *user;
+		gchar *user;
 
 		password = camel_service_get_password (service);
 		settings = camel_service_get_settings (service);
 
 		network_settings = CAMEL_NETWORK_SETTINGS (settings);
-		user = camel_network_settings_get_user (network_settings);
+		user = camel_network_settings_dup_user (network_settings);
 
 		if (user == NULL) {
 			g_set_error_literal (
@@ -1074,6 +1117,7 @@ imap_store_authenticate_sync (CamelService *service,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Authentication password not available"));
+			g_free (user);
 			return CAMEL_AUTHENTICATION_ERROR;
 		}
 
@@ -1084,6 +1128,8 @@ imap_store_authenticate_sync (CamelService *service,
 		if (response != NULL)
 			camel_imap_response_free (store, response);
 
+		g_free (user);
+
 		goto exit;
 	}
 
@@ -1732,14 +1778,14 @@ imap_store_get_trash_folder_sync (CamelStore *store,
 	CamelService *service;
 	CamelSettings *settings;
 	CamelFolder *folder = NULL;
-	const gchar *trash_path;
 	const gchar *user_cache_dir;
+	gchar *trash_path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
-	trash_path = camel_imap_settings_get_real_trash_path (
+	trash_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
 	if (trash_path != NULL) {
 		folder = camel_store_get_folder_sync (
@@ -1748,6 +1794,7 @@ imap_store_get_trash_folder_sync (CamelStore *store,
 			camel_imap_settings_set_real_trash_path (
 				CAMEL_IMAP_SETTINGS (settings), NULL);
 	}
+	g_free (trash_path);
 
 	if (folder)
 		return folder;
@@ -1779,14 +1826,14 @@ imap_store_get_junk_folder_sync (CamelStore *store,
 	CamelService *service;
 	CamelSettings *settings;
 	CamelFolder *folder = NULL;
-	const gchar *junk_path;
 	const gchar *user_cache_dir;
+	gchar *junk_path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
-	junk_path = camel_imap_settings_get_real_junk_path (
+	junk_path = camel_imap_settings_dup_real_junk_path (
 		CAMEL_IMAP_SETTINGS (settings));
 	if (junk_path != NULL) {
 		folder = camel_store_get_folder_sync (
@@ -1795,6 +1842,7 @@ imap_store_get_junk_folder_sync (CamelStore *store,
 			camel_imap_settings_set_real_junk_path (
 				CAMEL_IMAP_SETTINGS (settings), NULL);
 	}
+	g_free (junk_path);
 
 	if (folder)
 		return folder;
@@ -2915,16 +2963,15 @@ refresh_refresh (CamelSession *session,
 {
 	CamelService *service;
 	CamelSettings *settings;
-	const gchar *namespace;
+	gchar *namespace;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
-	namespace = camel_imap_settings_get_namespace (
+	namespace = camel_imap_settings_dup_namespace (
 		CAMEL_IMAP_SETTINGS (settings));
 
-	camel_service_lock (
-		CAMEL_SERVICE (store), CAMEL_SERVICE_REC_CONNECT_LOCK);
+	camel_service_lock (service, CAMEL_SERVICE_REC_CONNECT_LOCK);
 
 	if (!camel_imap_store_connected (store, error))
 		goto done;
@@ -2943,8 +2990,9 @@ refresh_refresh (CamelSession *session,
 	camel_store_summary_save (CAMEL_STORE_SUMMARY (store->summary));
 
 done:
-	camel_service_unlock (
-		CAMEL_SERVICE (store), CAMEL_SERVICE_REC_CONNECT_LOCK);
+	camel_service_unlock (service, CAMEL_SERVICE_REC_CONNECT_LOCK);
+
+	g_free (namespace);
 }
 
 static CamelFolderInfo *
@@ -3065,8 +3113,8 @@ get_folder_info_offline (CamelStore *store,
 	gint i;
 	CamelImapStoreNamespace *main_ns, *ns;
 	gboolean use_subscriptions;
-	const gchar *junk_path;
-	const gchar *trash_path;
+	gchar *junk_path;
+	gchar *trash_path;
 
 	if (camel_debug("imap:folder_info"))
 		printf("get folder info offline\n");
@@ -3077,19 +3125,19 @@ get_folder_info_offline (CamelStore *store,
 	use_subscriptions = camel_imap_settings_get_use_subscriptions (
 		CAMEL_IMAP_SETTINGS (settings));
 
-	junk_path = camel_imap_settings_get_real_junk_path (
+	junk_path = camel_imap_settings_dup_real_junk_path (
 		CAMEL_IMAP_SETTINGS (settings));
 
 	/* So we can safely compare strings. */
 	if (junk_path == NULL)
-		junk_path = "";
+		junk_path = g_strdup ("");
 
-	trash_path = camel_imap_settings_get_real_trash_path (
+	trash_path = camel_imap_settings_dup_real_trash_path (
 		CAMEL_IMAP_SETTINGS (settings));
 
 	/* So we can safely compare strings. */
 	if (trash_path == NULL)
-		trash_path = "";
+		trash_path = g_strdup ("");
 
 	/* FIXME: obey other flags */
 
@@ -3189,6 +3237,9 @@ get_folder_info_offline (CamelStore *store,
 	g_ptr_array_free (folders, TRUE);
 	g_free (name);
 
+	g_free (junk_path);
+	g_free (trash_path);
+
 	return fi;
 }
 
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index 9561729..0781b64 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -3004,8 +3004,8 @@ connect_to_server_process (CamelIMAPXServer *is,
 	gchar *full_cmd;
 	gchar *child_env[7];
 	const gchar *password;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
 	guint16 port;
 
 	memset (&url, 0, sizeof (CamelURL));
@@ -3017,9 +3017,9 @@ connect_to_server_process (CamelIMAPXServer *is,
 	g_return_val_if_fail (password != NULL, FALSE);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 	port = camel_network_settings_get_port (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	/* Put full details in the environment, in case the connection
 	 * program needs them */
@@ -3086,6 +3086,9 @@ connect_to_server_process (CamelIMAPXServer *is,
 
 	g_free (cmd_copy);
 
+	g_free (host);
+	g_free (user);
+
 	cmd_stream = camel_stream_process_new ();
 
 	ret = camel_stream_process_connect (
@@ -3126,19 +3129,20 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 	guchar *token;
 	gint tok;
 	CamelIMAPXCommand *ic;
-	const gchar *host;
+	gboolean success = TRUE;
+	gchar *host;
 	GError *local_error = NULL;
 
 #ifndef G_OS_WIN32
 	gboolean use_shell_command;
-	const gchar *command = NULL;
+	gchar *shell_command = NULL;
 #endif
 
 	service = CAMEL_SERVICE (is->store);
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 	method = camel_network_settings_get_security_method (network_settings);
 
 #ifndef G_OS_WIN32
@@ -3146,22 +3150,31 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 		CAMEL_IMAPX_SETTINGS (settings));
 
 	if (use_shell_command)
-		command = camel_imapx_settings_get_shell_command (
+		shell_command = camel_imapx_settings_dup_shell_command (
 			CAMEL_IMAPX_SETTINGS (settings));
 
-	if (command != NULL) {
-		if (!connect_to_server_process (is, command, &local_error))
-			goto exit;
-		else
+	if (shell_command != NULL) {
+		gboolean success;
+
+		success = connect_to_server_process (
+			is, shell_command, &local_error);
+
+		g_free (shell_command);
+
+		if (success)
 			goto connected;
+		else
+			goto exit;
 	}
 #endif
 
 	tcp_stream = camel_network_service_connect_sync (
 		CAMEL_NETWORK_SERVICE (is->store), cancellable, error);
 
-	if (tcp_stream == NULL)
-		return FALSE;
+	if (tcp_stream == NULL) {
+		success = FALSE;
+		goto exit;
+	}
 
 	is->stream = (CamelIMAPXStream *) camel_imapx_stream_new (tcp_stream);
 	g_object_unref (tcp_stream);
@@ -3185,20 +3198,25 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 				error, G_IO_ERROR,
 				G_IO_ERROR_CANCELLED,
 				"Connection to server cancelled\n");
-			return FALSE;
+			success = FALSE;
+			goto exit;
 		}
 
 		tok = camel_imapx_stream_token (is->stream, &token, &len, cancellable, error);
-		if (tok < 0)
-			return FALSE;
+		if (tok < 0) {
+			success = FALSE;
+			goto exit;
+		}
 
 		if (tok == '*') {
 			imapx_untagged (is, cancellable, error);
 			break;
 		}
 		camel_imapx_stream_ungettoken (is->stream, tok, token, len);
-		if (camel_imapx_stream_text (is->stream, &token, cancellable, error))
-			return FALSE;
+		if (camel_imapx_stream_text (is->stream, &token, cancellable, error)) {
+			success = FALSE;
+			goto exit;
+		}
 		e(is->tagprefix, "Got unexpected line before greeting:  '%s'\n", token);
 		g_free (token);
 	}
@@ -3221,7 +3239,9 @@ imapx_connect_to_server (CamelIMAPXServer *is,
 			}
 
 			imapx_command_unref (ic);
-			return FALSE;
+			success = FALSE;
+
+			goto exit;
 		}
 		imapx_command_unref (ic);
 	}
@@ -3307,10 +3327,12 @@ exit:
 			is->cinfo = NULL;
 		}
 
-		return FALSE;
+		success = FALSE;
 	}
 
-	return TRUE;
+	g_free (host);
+
+	return success;
 }
 
 CamelAuthenticationResult
@@ -3325,8 +3347,8 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 	CamelIMAPXCommand *ic;
 	CamelService *service;
 	CamelSasl *sasl = NULL;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
 
 	g_return_val_if_fail (
 		CAMEL_IS_IMAPX_SERVER (is),
@@ -3336,8 +3358,8 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (mechanism != NULL) {
 		if (!g_hash_table_lookup (is->cinfo->auth_types, mechanism)) {
@@ -3346,7 +3368,8 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("IMAP server %s does not support %s "
 				  "authentication"), host, mechanism);
-			return CAMEL_AUTHENTICATION_ERROR;
+			result = CAMEL_AUTHENTICATION_ERROR;
+			goto exit;
 		}
 
 		sasl = camel_sasl_new ("imap", mechanism, service);
@@ -3356,7 +3379,8 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("No support for %s authentication"),
 				mechanism);
-			return CAMEL_AUTHENTICATION_ERROR;
+			result = CAMEL_AUTHENTICATION_ERROR;
+			goto exit;
 		}
 	}
 
@@ -3374,7 +3398,8 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Cannot authenticate without a username"));
-			return CAMEL_AUTHENTICATION_ERROR;
+			result = CAMEL_AUTHENTICATION_ERROR;
+			goto exit;
 		}
 
 		if (password == NULL) {
@@ -3382,7 +3407,8 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Authentication password not available"));
-			return CAMEL_AUTHENTICATION_ERROR;
+			result = CAMEL_AUTHENTICATION_ERROR;
+			goto exit;
 		}
 
 		ic = imapx_command_new (
@@ -3422,6 +3448,10 @@ camel_imapx_server_authenticate (CamelIMAPXServer *is,
 	if (sasl != NULL)
 		g_object_unref (sasl);
 
+exit:
+	g_free (host);
+	g_free (user);
+
 	return result;
 }
 
@@ -3434,7 +3464,7 @@ imapx_reconnect (CamelIMAPXServer *is,
 	CamelService *service;
 	CamelSession *session;
 	CamelSettings *settings;
-	const gchar *mechanism;
+	gchar *mechanism;
 	gboolean use_idle;
 	gboolean use_qresync;
 
@@ -3442,7 +3472,7 @@ imapx_reconnect (CamelIMAPXServer *is,
 	session = camel_service_get_session (service);
 	settings = camel_service_get_settings (service);
 
-	mechanism = camel_network_settings_get_auth_mechanism (
+	mechanism = camel_network_settings_dup_auth_mechanism (
 		CAMEL_NETWORK_SETTINGS (settings));
 
 	use_idle = camel_imapx_settings_get_use_idle (
@@ -3535,6 +3565,9 @@ imapx_reconnect (CamelIMAPXServer *is,
 	}
 
 	is->state = IMAPX_INITIALISED;
+
+	g_free (mechanism);
+
 	return TRUE;
 
 exception:
@@ -3546,6 +3579,8 @@ exception:
 		is->cinfo = NULL;
 	}
 
+	g_free (mechanism);
+
 	return FALSE;
 }
 
diff --git a/camel/providers/imapx/camel-imapx-store.c b/camel/providers/imapx/camel-imapx-store.c
index c8cb019..1cc4b1f 100644
--- a/camel/providers/imapx/camel-imapx-store.c
+++ b/camel/providers/imapx/camel-imapx-store.c
@@ -140,21 +140,27 @@ imapx_get_name (CamelService *service,
 {
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
+	gchar *name;
 
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (brief)
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("IMAP server %s"), host);
 	else
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("IMAP service for %s on %s"), user, host);
+
+	g_free (host);
+	g_free (user);
+
+	return name;
 }
 
 CamelIMAPXServer *
@@ -692,10 +698,10 @@ get_folder_info_offline (CamelStore *store,
 
 	/* get starting point */
 	if (top[0] == 0) {
-		const gchar *namespace = NULL;
+		gchar *namespace = NULL;
 
 		if (use_namespace)
-			namespace = camel_imapx_settings_get_namespace (
+			namespace = camel_imapx_settings_dup_namespace (
 				CAMEL_IMAPX_SETTINGS (settings));
 
 		if (namespace != NULL) {
@@ -703,6 +709,8 @@ get_folder_info_offline (CamelStore *store,
 			top = imapx_store->summary->namespaces->personal->path;
 		} else
 			name = g_strdup("");
+
+		g_free (namespace);
 	} else {
 		name = camel_imapx_store_summary_full_from_path (imapx_store->summary, top);
 		if (name == NULL)
diff --git a/camel/providers/local/camel-local-store.c b/camel/providers/local/camel-local-store.c
index 5abea16..f12560c 100644
--- a/camel/providers/local/camel-local-store.c
+++ b/camel/providers/local/camel-local-store.c
@@ -164,17 +164,22 @@ local_store_get_name (CamelService *service,
 {
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
-	const gchar *path;
+	gchar *path;
+	gchar *name;
 
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	if (brief)
-		return g_strdup (path);
+		name = g_strdup (path);
 	else
-		return g_strdup_printf (_("Local mail file %s"), path);
+		name = g_strdup_printf (_("Local mail file %s"), path);
+
+	g_free (path);
+
+	return name;
 }
 
 static gboolean
@@ -196,21 +201,22 @@ local_store_get_folder_sync (CamelStore *store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
+	CamelFolder *folder = NULL;
 	struct stat st;
+	gchar *path;
 
 	service = CAMEL_SERVICE (store);
 	settings= camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	if (!g_path_is_absolute (path)) {
 		g_set_error (
 			error, CAMEL_STORE_ERROR,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Store root %s is not an absolute path"), path);
-		return NULL;
+		goto exit;
 	}
 
 	if (g_stat (path, &st) == 0) {
@@ -221,7 +227,8 @@ local_store_get_folder_sync (CamelStore *store,
 				_("Store root %s is not a regular directory"), path);
 			return NULL;
 		}
-		return (CamelFolder *) 0xdeadbeef;
+		folder = (CamelFolder *) 0xdeadbeef;
+		goto exit;
 	}
 
 	if (errno != ENOENT
@@ -231,7 +238,7 @@ local_store_get_folder_sync (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Cannot get folder: %s: %s"),
 			path, g_strerror (errno));
-		return NULL;
+		goto exit;
 	}
 
 	/* need to create the dir heirarchy */
@@ -241,10 +248,15 @@ local_store_get_folder_sync (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Cannot get folder: %s: %s"),
 			path, g_strerror (errno));
-		return NULL;
+		goto exit;
 	}
 
-	return (CamelFolder *) 0xdeadbeef;
+	folder = (CamelFolder *) 0xdeadbeef;
+
+exit:
+	g_free (path);
+
+	return folder;
 }
 
 static CamelFolderInfo *
@@ -344,15 +356,15 @@ local_store_create_folder_sync (CamelStore *store,
 	CamelService *service;
 	CamelFolder *folder;
 	CamelFolderInfo *info = NULL;
-	const gchar *path;
-	gchar *name;
+	gchar *name = NULL;
+	gchar *path;
 	struct stat st;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	/* This is a pretty hacky version of create folder, but should basically work */
 
@@ -361,7 +373,7 @@ local_store_create_folder_sync (CamelStore *store,
 			error, CAMEL_STORE_ERROR,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Store root %s is not an absolute path"), path);
-		return NULL;
+		goto exit;
 	}
 
 	if (parent_name)
@@ -375,8 +387,7 @@ local_store_create_folder_sync (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Cannot get folder: %s: %s"),
 			name, g_strerror (errno));
-		g_free (name);
-		return NULL;
+		goto exit;
 	}
 
 	g_free (name);
@@ -394,7 +405,9 @@ local_store_create_folder_sync (CamelStore *store,
 			store, name, 0, cancellable, error);
 	}
 
+exit:
 	g_free (name);
+	g_free (path);
 
 	return info;
 }
@@ -411,32 +424,33 @@ local_store_delete_folder_sync (CamelStore *store,
 	CamelService *service;
 	CamelFolderInfo *fi;
 	CamelFolder *lf;
-	const gchar *path;
+	gchar *str = NULL;
 	gchar *name;
-	gchar *str;
+	gchar *path;
+	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	/* remove metadata only */
 	name = g_build_filename (path, folder_name, NULL);
-	str = g_strdup_printf("%s.ibex", name);
+	str = g_strdup_printf ("%s.ibex", name);
 	if (camel_text_index_remove (str) == -1 && errno != ENOENT && errno != ENOTDIR) {
 		g_set_error (
 			error, G_IO_ERROR,
 			g_io_error_from_errno (errno),
 			_("Could not delete folder index file '%s': %s"),
 			str, g_strerror (errno));
-		g_free (str);
-		g_free (name);
-		return FALSE;
+		success = FALSE;
+		goto exit;
 	}
-	g_free (str);
 
+	g_free (str);
 	str = NULL;
+
 	if ((lf = camel_store_get_folder_sync (store, folder_name, 0, cancellable, NULL))) {
 		CamelObject *object = CAMEL_OBJECT (lf);
 		const gchar *state_filename;
@@ -458,14 +472,10 @@ local_store_delete_folder_sync (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Could not delete folder meta file '%s': %s"),
 			str, g_strerror (errno));
-		g_free (name);
-		g_free (str);
-		return FALSE;
+		success = FALSE;
+		goto exit;
 	}
 
-	g_free (str);
-	g_free (name);
-
 	fi = camel_folder_info_new ();
 	fi->full_name = g_strdup (folder_name);
 	fi->display_name = g_path_get_basename (folder_name);
@@ -474,7 +484,12 @@ local_store_delete_folder_sync (CamelStore *store,
 	camel_store_folder_deleted (store, fi);
 	camel_folder_info_free (fi);
 
-	return TRUE;
+exit:
+	g_free (name);
+	g_free (path);
+	g_free (str);
+
+	return success;
 }
 
 /* default implementation, rename all */
@@ -489,17 +504,18 @@ local_store_rename_folder_sync (CamelStore *store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *old_basename;
 	gchar *new_basename;
 	gchar *newibex;
 	gchar *oldibex;
+	gchar *path;
+	gboolean success = TRUE;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	old_basename = g_strdup_printf ("%s.ibex", old);
 	new_basename = g_strdup_printf ("%s.ibex", new);
@@ -542,7 +558,7 @@ local_store_rename_folder_sync (CamelStore *store,
 	if (folder)
 		g_object_unref (folder);
 
-	return TRUE;
+	goto exit;
 
 	/* The (f)utility of this recovery effort is quesitonable */
 
@@ -571,7 +587,12 @@ ibex_failed:
 	if (folder)
 		g_object_unref (folder);
 
-	return FALSE;
+	success = FALSE;
+
+exit:
+	g_free (path);
+
+	return success;
 }
 
 static gchar *
@@ -581,15 +602,20 @@ local_store_get_full_path (CamelLocalStore *ls,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
+	gchar *filename;
+	gchar *path;
 
 	service = CAMEL_SERVICE (ls);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
+
+	filename = g_build_filename (path, full_name, NULL);
 
-	return g_build_filename (path, full_name, NULL);
+	g_free (path);
+
+	return filename;
 }
 
 static gchar *
@@ -600,20 +626,22 @@ local_store_get_meta_path (CamelLocalStore *ls,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *basename;
 	gchar *filename;
+	gchar *path;
 
 	service = CAMEL_SERVICE (ls);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	basename = g_strconcat (full_name, ext, NULL);
 	filename = g_build_filename (path, basename, NULL);
 	g_free (basename);
 
+	g_free (path);
+
 	return filename;
 }
 
diff --git a/camel/providers/local/camel-maildir-store.c b/camel/providers/local/camel-maildir-store.c
index 03b0925..097a185 100644
--- a/camel/providers/local/camel-maildir-store.c
+++ b/camel/providers/local/camel-maildir-store.c
@@ -82,8 +82,8 @@ maildir_store_create_folder_sync (CamelStore *store,
 	CamelService *service;
 	CamelFolder *folder;
 	CamelFolderInfo *info = NULL;
-	const gchar *path;
-	gchar *name;
+	gchar *name = NULL;
+	gchar *path;
 	struct stat st;
 
 	/* This is a pretty hacky version of create folder, but should basically work */
@@ -92,23 +92,24 @@ maildir_store_create_folder_sync (CamelStore *store,
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	if (!g_path_is_absolute (path)) {
 		g_set_error (
 			error, CAMEL_STORE_ERROR,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Store root %s is not an absolute path"), path);
-		return NULL;
+		goto exit;
 	}
 
 	if (g_strstr_len (folder_name, -1, ".")) {
 		g_set_error (
 			error, CAMEL_STORE_ERROR,
 			CAMEL_STORE_ERROR_NO_FOLDER,
-			_("Cannot create folder: %s : Folder name cannot contain a dot"), folder_name);
-		return NULL;
-
+			_("Cannot create folder: %s: "
+			  "Folder name cannot contain a dot"),
+			folder_name);
+		goto exit;
 	}
 
 	if (!g_ascii_strcasecmp (folder_name, "Inbox")) {
@@ -116,7 +117,7 @@ maildir_store_create_folder_sync (CamelStore *store,
 			error, CAMEL_STORE_ERROR,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Folder %s already exists"), folder_name);
-		return NULL;
+		goto exit;
 	}
 
 	if (parent_name && *parent_name) {
@@ -132,25 +133,28 @@ maildir_store_create_folder_sync (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Cannot get folder: %s: %s"),
 			name, g_strerror (errno));
-		g_free (name);
-		return NULL;
+		goto exit;
 	}
 
 	g_free (name);
+	name = NULL;
 
 	if (parent_name && *parent_name)
 		name = g_strdup_printf("%s/%s", parent_name, folder_name);
 	else
 		name = g_strdup_printf("%s", folder_name);
 
-	folder = maildir_store_get_folder_sync (store, name, CAMEL_STORE_FOLDER_CREATE, cancellable, error);
+	folder = maildir_store_get_folder_sync (
+		store, name, CAMEL_STORE_FOLDER_CREATE, cancellable, error);
 	if (folder) {
 		g_object_unref (folder);
 		info = CAMEL_STORE_GET_CLASS (store)->get_folder_info_sync (
 			store, name, 0, cancellable, error);
 	}
 
+exit:
 	g_free (name);
+	g_free (path);
 
 	return info;
 }
@@ -166,8 +170,8 @@ maildir_store_get_folder_sync (CamelStore *store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *name, *tmp, *cur, *new, *dir_name;
+	gchar *path;
 	struct stat st;
 	CamelFolder *folder = NULL;
 
@@ -175,25 +179,27 @@ maildir_store_get_folder_sync (CamelStore *store,
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	folder_name = md_canon_name (folder_name);
 	dir_name = maildir_full_name_to_dir_name (folder_name);
 
+	/* maildir++ directory names start with a '.' */
+	name = g_build_filename (path, dir_name, NULL);
+
+	g_free (dir_name);
+	g_free (path);
+
 	/* Chain up to parent's get_folder() method. */
 	store_class = CAMEL_STORE_CLASS (camel_maildir_store_parent_class);
 	if (!store_class->get_folder_sync (store, dir_name, flags, cancellable, error)) {
-		g_free (dir_name);
+		g_free (name);
 		return NULL;
 	}
 
-	/* maildir++ directory names start with a '.' */
-	name = g_build_filename (path, dir_name, NULL);
-	g_free (dir_name);
-
-	tmp = g_strdup_printf("%s/tmp", name);
-	cur = g_strdup_printf("%s/cur", name);
-	new = g_strdup_printf("%s/new", name);
+	tmp = g_strdup_printf ("%s/tmp", name);
+	cur = g_strdup_printf ("%s/cur", name);
+	new = g_strdup_printf ("%s/new", name);
 
 	if (!g_ascii_strcasecmp (folder_name, "Inbox")) {
 		/* special case "." (aka inbox), may need to be created */
@@ -282,17 +288,11 @@ maildir_store_delete_folder_sync (CamelStore *store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *name, *tmp, *cur, *new, *dir_name;
+	gchar *path;
 	struct stat st;
 	gboolean success = TRUE;
 
-	service = CAMEL_SERVICE (store);
-	settings = camel_service_get_settings (service);
-
-	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
-
 	if (g_ascii_strcasecmp (folder_name, "Inbox") == 0) {
 		g_set_error (
 			error, CAMEL_STORE_ERROR,
@@ -302,14 +302,22 @@ maildir_store_delete_folder_sync (CamelStore *store,
 		return FALSE;
 	}
 
+	service = CAMEL_SERVICE (store);
+	settings = camel_service_get_settings (service);
+
+	local_settings = CAMEL_LOCAL_SETTINGS (settings);
+	path = camel_local_settings_dup_path (local_settings);
+
 	/* maildir++ directory names start with a '.' */
 	dir_name = maildir_full_name_to_dir_name (folder_name);
 	name = g_build_filename (path, dir_name, NULL);
 	g_free (dir_name);
 
-	tmp = g_strdup_printf("%s/tmp", name);
-	cur = g_strdup_printf("%s/cur", name);
-	new = g_strdup_printf("%s/new", name);
+	g_free (path);
+
+	tmp = g_strdup_printf ("%s/tmp", name);
+	cur = g_strdup_printf ("%s/cur", name);
+	new = g_strdup_printf ("%s/new", name);
 
 	if (g_stat (name, &st) == -1 || !S_ISDIR (st.st_mode)
 	    || g_stat (tmp, &st) == -1 || !S_ISDIR (st.st_mode)
@@ -399,13 +407,13 @@ fill_fi (CamelStore *store,
 		CamelService *service;
 		gchar *folderpath, *dir_name;
 		CamelFolderSummary *s;
-		const gchar *root;
+		gchar *root;
 
 		service = CAMEL_SERVICE (store);
 		settings = camel_service_get_settings (service);
 
 		local_settings = CAMEL_LOCAL_SETTINGS (settings);
-		root = camel_local_settings_get_path (local_settings);
+		root = camel_local_settings_dup_path (local_settings);
 
 		/* This should be fast enough not to have to test for INFO_FAST */
 		dir_name = maildir_full_name_to_dir_name (fi->full_name);
@@ -415,6 +423,8 @@ fill_fi (CamelStore *store,
 		else
 			folderpath = g_build_filename (root, dir_name, NULL);
 
+		g_free (root);
+
 		s = (CamelFolderSummary *) camel_maildir_summary_new (NULL, folderpath, NULL);
 		if (camel_folder_summary_header_load_from_db (s, store, fi->full_name, NULL)) {
 			fi->unread = camel_folder_summary_get_unread_count (s);
@@ -443,14 +453,14 @@ scan_fi (CamelStore *store,
 	CamelService *service;
 	CamelFolderInfo *fi;
 	gchar *tmp, *cur, *new, *dir_name;
-	const gchar *path;
+	gchar *path;
 	struct stat st;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 	g_return_val_if_fail (path != NULL, NULL);
 
 	fi = camel_folder_info_new ();
@@ -483,6 +493,8 @@ scan_fi (CamelStore *store,
 
 	fill_fi (store, fi, flags, cancellable);
 
+	g_free (path);
+
 	return fi;
 }
 
@@ -531,18 +543,18 @@ scan_dirs (CamelStore *store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	GPtrArray *folders;
 	gint res = -1;
 	DIR *dir;
 	struct dirent *d;
 	gchar *meta_path = NULL;
+	gchar *path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 	g_return_val_if_fail (path != NULL, -1);
 
 	folders = g_ptr_array_new ();
@@ -556,7 +568,7 @@ scan_dirs (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Could not scan folder '%s': %s"),
 			path, g_strerror (errno));
-		goto fail;
+		goto exit;
 	}
 
 	meta_path = maildir_get_meta_path ((CamelLocalStore *) store, ".", "maildir++");
@@ -628,9 +640,11 @@ scan_dirs (CamelStore *store,
 	} else
 		res = -1;
 
-fail:
+exit:
 	g_ptr_array_free (folders, TRUE);
 
+	g_free (path);
+
 	return res;
 }
 
@@ -826,20 +840,22 @@ maildir_get_full_path (CamelLocalStore *ls,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *filename;
 	gchar *dir_name;
+	gchar *path;
 
 	service = CAMEL_SERVICE (ls);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	dir_name = maildir_full_name_to_dir_name (full_name);
 	filename = g_build_filename (path, dir_name, NULL);
 	g_free (dir_name);
 
+	g_free (path);
+
 	return filename;
 }
 
@@ -851,16 +867,16 @@ maildir_get_meta_path (CamelLocalStore *ls,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *filename;
 	gchar *dir_name;
+	gchar *path;
 	gchar *tmp;
 
 	service = CAMEL_SERVICE (ls);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	dir_name = maildir_full_name_to_dir_name (full_name);
 	tmp = g_build_filename (path, dir_name, NULL);
@@ -868,6 +884,8 @@ maildir_get_meta_path (CamelLocalStore *ls,
 	g_free (tmp);
 	g_free (dir_name);
 
+	g_free (path);
+
 	return filename;
 }
 
@@ -912,7 +930,7 @@ scan_old_dir_info (CamelStore *store,
 	CamelService *service;
 	CamelDList queue = CAMEL_DLIST_INITIALISER (queue);
 	struct _scan_node *sn;
-	const gchar *path;
+	gchar *path;
 	gchar *tmp;
 	GHashTable *visited;
 	struct stat st;
@@ -922,7 +940,7 @@ scan_old_dir_info (CamelStore *store,
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	visited = g_hash_table_new (scan_hash, scan_equal);
 
@@ -954,8 +972,7 @@ scan_old_dir_info (CamelStore *store,
 				g_io_error_from_errno (errno),
 				_("Could not scan folder '%s': %s"),
 				path, g_strerror (errno));
-
-			goto fail;
+			goto exit;
 		}
 
 		while ((d = readdir (dir))) {
@@ -1008,10 +1025,13 @@ scan_old_dir_info (CamelStore *store,
 	}
 
 	res = 0;
-fail:
+
+exit:
 	g_hash_table_foreach (visited, scan_free, NULL);
 	g_hash_table_destroy (visited);
 
+	g_free (path);
+
 	return res;
 }
 
diff --git a/camel/providers/local/camel-mbox-store.c b/camel/providers/local/camel-mbox-store.c
index 7d5c2d3..1004cc8 100644
--- a/camel/providers/local/camel-mbox-store.c
+++ b/camel/providers/local/camel-mbox-store.c
@@ -527,8 +527,10 @@ mbox_store_create_folder_sync (CamelStore *store,
 	CamelFolderInfo *info = NULL;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *root_path;
-	gchar *path, *name, *dir;
+	gchar *root_path = NULL;
+	gchar *name = NULL;
+	gchar *path = NULL;
+	gchar *dir;
 	CamelFolder *folder;
 	struct stat st;
 
@@ -536,7 +538,7 @@ mbox_store_create_folder_sync (CamelStore *store,
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	root_path = camel_local_settings_get_path (local_settings);
+	root_path = camel_local_settings_dup_path (local_settings);
 
 	local_store = CAMEL_LOCAL_STORE (store);
 
@@ -546,14 +548,14 @@ mbox_store_create_folder_sync (CamelStore *store,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Store root %s is not an absolute path"),
 			root_path);
-		return NULL;
+		goto exit;
 	}
 
 	if (folder_name[0] == '.' || ignore_file (folder_name, TRUE)) {
 		g_set_error (
 			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 			_("Cannot create a folder by this name."));
-		return NULL;
+		goto exit;
 	}
 
 	if (parent_name && *parent_name)
@@ -570,12 +572,8 @@ mbox_store_create_folder_sync (CamelStore *store,
 			g_io_error_from_errno (errno),
 			_("Cannot create directory '%s': %s."),
 			dir, g_strerror (errno));
-
-		g_free (path);
-		g_free (name);
 		g_free (dir);
-
-		return NULL;
+		goto exit;
 	}
 
 	g_free (dir);
@@ -587,15 +585,9 @@ mbox_store_create_folder_sync (CamelStore *store,
 			_("Cannot create folder: %s: %s"),
 			path, errno ? g_strerror (errno) :
 			_("Folder already exists"));
-
-		g_free (path);
-		g_free (name);
-
-		return NULL;
+		goto exit;
 	}
 
-	g_free (path);
-
 	folder = CAMEL_STORE_GET_CLASS (store)->get_folder_sync (
 		store, name, CAMEL_STORE_FOLDER_CREATE, cancellable, error);
 	if (folder) {
@@ -604,7 +596,10 @@ mbox_store_create_folder_sync (CamelStore *store,
 			store, name, 0, cancellable, error);
 	}
 
+exit:
+	g_free (root_path);
 	g_free (name);
+	g_free (path);
 
 	return info;
 }
@@ -904,15 +899,15 @@ mbox_store_get_full_path (CamelLocalStore *ls,
 	CamelSettings *settings;
 	CamelService *service;
 	const gchar *inptr = full_name;
-	const gchar *root_path;
 	gint subdirs = 0;
+	gchar *root_path;
 	gchar *path, *p;
 
 	service = CAMEL_SERVICE (ls);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	root_path = camel_local_settings_get_path (local_settings);
+	root_path = camel_local_settings_dup_path (local_settings);
 	g_return_val_if_fail (root_path != NULL, NULL);
 
 	while (*inptr != '\0') {
@@ -924,6 +919,8 @@ mbox_store_get_full_path (CamelLocalStore *ls,
 	path = g_malloc (strlen (root_path) + (inptr - full_name) + (4 * subdirs) + 1);
 	p = g_stpcpy (path, root_path);
 
+	g_free (root_path);
+
 	inptr = full_name;
 	while (*inptr != '\0') {
 		while (!G_IS_DIR_SEPARATOR (*inptr) && *inptr != '\0')
diff --git a/camel/providers/local/camel-mh-store.c b/camel/providers/local/camel-mh-store.c
index a6d773d..acdb963 100644
--- a/camel/providers/local/camel-mh-store.c
+++ b/camel/providers/local/camel-mh-store.c
@@ -204,21 +204,22 @@ fill_fi (CamelStore *store,
 		CamelLocalSettings *local_settings;
 		CamelSettings *settings;
 		CamelService *service;
-		gchar *folderpath;
 		CamelFolderSummary *s;
-		const gchar *path;
+		gchar *folderpath;
+		gchar *path;
 
 		service = CAMEL_SERVICE (store);
 		settings = camel_service_get_settings (service);
 
 		local_settings = CAMEL_LOCAL_SETTINGS (settings);
-		path = camel_local_settings_get_path (local_settings);
+		path = camel_local_settings_dup_path (local_settings);
 
 		/* This should be fast enough not to have to test for INFO_FAST */
 
-		/* We could: if we have no folder, and FAST isn't specified, perform a full
-		 * scan of all messages for their status flags.  But its probably not worth
-		 * it as we need to read the top of every file, i.e. very very slow */
+		/* We could: if we have no folder, and FAST isn't specified,
+		 * perform a full scan of all messages for their status flags.
+		 * But its probably not worth it as we need to read the top of
+		 * every file, i.e. very very slow */
 
 		folderpath = g_strdup_printf ("%s/%s", path, fi->full_name);
 		s = (CamelFolderSummary *) camel_mh_summary_new (
@@ -230,6 +231,8 @@ fill_fi (CamelStore *store,
 		}
 		g_object_unref (s);
 		g_free (folderpath);
+
+		g_free (path);
 	}
 
 	if (camel_local_store_is_main_store (local_store) && fi->full_name
@@ -482,26 +485,27 @@ mh_store_get_folder_sync (CamelStore *store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
+	CamelFolder *folder = NULL;
 	gboolean use_dot_folders;
-	const gchar *path;
-	gchar *name;
 	struct stat st;
+	gchar *name;
+	gchar *path;
+
+	/* Chain up to parent's get_folder() method. */
+	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
+	if (store_class->get_folder_sync (
+		store, folder_name, flags, cancellable, error) == NULL)
+		return NULL;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
 
-	/* Chain up to parent's get_folder() method. */
-	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
-	if (store_class->get_folder_sync (
-		store, folder_name, flags, cancellable, error) == NULL)
-		return NULL;
-
 	name = g_build_filename (path, folder_name, NULL);
 
 	if (g_stat (name, &st) == -1) {
@@ -511,9 +515,9 @@ mh_store_get_folder_sync (CamelStore *store,
 				g_io_error_from_errno (errno),
 				_("Cannot get folder '%s': %s"),
 				folder_name, g_strerror (errno));
-			g_free (name);
-			return NULL;
+			goto exit;
 		}
+
 		if ((flags & CAMEL_STORE_FOLDER_CREATE) == 0) {
 			g_set_error (
 				error, CAMEL_STORE_ERROR,
@@ -521,8 +525,7 @@ mh_store_get_folder_sync (CamelStore *store,
 				_("Cannot get folder '%s': "
 				  "folder does not exist."),
 				folder_name);
-			g_free (name);
-			return NULL;
+			goto exit;
 		}
 
 		if (g_mkdir (name, 0777) != 0) {
@@ -531,8 +534,7 @@ mh_store_get_folder_sync (CamelStore *store,
 				g_io_error_from_errno (errno),
 				_("Could not create folder '%s': %s"),
 				folder_name, g_strerror (errno));
-			g_free (name);
-			return NULL;
+			goto exit;
 		}
 
 		/* add to .folders if we are supposed to */
@@ -548,22 +550,24 @@ mh_store_get_folder_sync (CamelStore *store,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Cannot get folder '%s': not a directory."),
 			folder_name);
-		g_free (name);
-		return NULL;
+		goto exit;
 
 	} else if (flags & CAMEL_STORE_FOLDER_EXCL) {
 		g_set_error (
 			error, CAMEL_ERROR, CAMEL_ERROR_GENERIC,
 			_("Cannot create folder '%s': folder exists."),
 			folder_name);
-		g_free (name);
-		return NULL;
+		goto exit;
 	}
 
+	folder = camel_mh_folder_new (
+		store, folder_name, flags, cancellable, error);
+
+exit:
 	g_free (name);
+	g_free (path);
 
-	return camel_mh_folder_new (
-		store, folder_name, flags, cancellable, error);
+	return folder;
 }
 
 static CamelFolderInfo *
@@ -578,13 +582,13 @@ mh_store_get_folder_info_sync (CamelStore *store,
 	CamelSettings *settings;
 	CamelFolderInfo *fi = NULL;
 	gboolean use_dot_folders;
-	const gchar *path;
+	gchar *path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
@@ -620,6 +624,8 @@ mh_store_get_folder_info_sync (CamelStore *store,
 		g_hash_table_destroy (visited);
 	}
 
+	g_free (path);
+
 	return fi;
 }
 
@@ -643,14 +649,14 @@ mh_store_delete_folder_sync (CamelStore *store,
 	CamelSettings *settings;
 	CamelService *service;
 	gboolean use_dot_folders;
-	const gchar *path;
 	gchar *name;
+	gchar *path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
@@ -664,6 +670,7 @@ mh_store_delete_folder_sync (CamelStore *store,
 			_("Could not delete folder '%s': %s"),
 			folder_name, g_strerror (errno));
 		g_free (name);
+		g_free (path);
 		return FALSE;
 	}
 	g_free (name);
@@ -674,6 +681,8 @@ mh_store_delete_folder_sync (CamelStore *store,
 			path, UPDATE_REMOVE, folder_name,
 			NULL, cancellable);
 
+	g_free (path);
+
 	/* Chain up to parent's delete_folder() method. */
 	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
 	return store_class->delete_folder_sync (
@@ -692,30 +701,32 @@ mh_store_rename_folder_sync (CamelStore *store,
 	CamelSettings *settings;
 	CamelService *service;
 	gboolean use_dot_folders;
-	const gchar *path;
+	gboolean success;
+	gchar *path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	use_dot_folders = camel_mh_settings_get_use_dot_folders (
 		CAMEL_MH_SETTINGS (settings));
 
 	/* Chain up to parent's rename_folder() method. */
 	store_class = CAMEL_STORE_CLASS (camel_mh_store_parent_class);
-	if (!store_class->rename_folder_sync (
-		store, old, new, cancellable, error))
-		return FALSE;
+	success = store_class->rename_folder_sync (
+		store, old, new, cancellable, error);
 
-	if (use_dot_folders) {
+	if (success && use_dot_folders) {
 		/* yeah this is messy, but so is mh! */
 		folders_update (
 			path, UPDATE_RENAME, old, new, cancellable);
 	}
 
-	return TRUE;
+	g_free (path);
+
+	return success;
 }
 
 static void
diff --git a/camel/providers/local/camel-spool-store.c b/camel/providers/local/camel-spool-store.c
index d016059..38fcf3e 100644
--- a/camel/providers/local/camel-spool-store.c
+++ b/camel/providers/local/camel-spool-store.c
@@ -67,14 +67,15 @@ spool_store_get_type (CamelSpoolStore *spool_store,
 	CamelLocalSettings *local_settings;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
+	camel_spool_store_t type;
 	struct stat st;
+	gchar *path;
 
 	service = CAMEL_SERVICE (spool_store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	/* Check the path for validity while we have the opportunity. */
 
@@ -84,30 +85,34 @@ spool_store_get_type (CamelSpoolStore *spool_store,
 			CAMEL_STORE_ERROR_NO_FOLDER,
 			_("Store root %s is not an absolute path"),
 			(path != NULL) ? path : "(null)");
-		return CAMEL_SPOOL_STORE_INVALID;
-	}
+		type = CAMEL_SPOOL_STORE_INVALID;
 
-	if (g_stat (path, &st) == -1) {
+	} else if (g_stat (path, &st) == -1) {
 		g_set_error (
 			error, G_IO_ERROR,
 			g_io_error_from_errno (errno),
 			_("Spool '%s' cannot be opened: %s"),
 			path, g_strerror (errno));
-		return CAMEL_SPOOL_STORE_INVALID;
-	}
+		type = CAMEL_SPOOL_STORE_INVALID;
 
-	if (S_ISREG (st.st_mode))
-		return CAMEL_SPOOL_STORE_MBOX;
+	} else if (S_ISREG (st.st_mode)) {
+		type = CAMEL_SPOOL_STORE_MBOX;
 
-	if (S_ISDIR (st.st_mode))
-		return CAMEL_SPOOL_STORE_ELM;
+	} else if (S_ISDIR (st.st_mode)) {
+		type = CAMEL_SPOOL_STORE_ELM;
 
-	g_set_error (
-		error, CAMEL_STORE_ERROR,
-		CAMEL_STORE_ERROR_NO_FOLDER,
-		_("Spool '%s' is not a regular file or directory"), path);
+	} else {
+		g_set_error (
+			error, CAMEL_STORE_ERROR,
+			CAMEL_STORE_ERROR_NO_FOLDER,
+			_("Spool '%s' is not a regular file or directory"),
+			path);
+		type = CAMEL_SPOOL_STORE_INVALID;
+	}
 
-	return CAMEL_SPOOL_STORE_INVALID;
+	g_free (path);
+
+	return type;
 }
 
 /* partially copied from mbox */
@@ -338,17 +343,19 @@ get_folder_info_elm (CamelStore *store,
 	CamelService *service;
 	CamelFolderInfo *fi = NULL;
 	GHashTable *visited;
-	const gchar *path;
-
-	visited = g_hash_table_new (inode_hash, inode_equal);
+	gchar *path;
 
 	service = CAMEL_SERVICE (store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
+
+	visited = g_hash_table_new (inode_hash, inode_equal);
 
-	if (scan_dir (store, visited, path, top, flags, NULL, &fi, cancellable, error) == -1 && fi != NULL) {
+	if (scan_dir (
+		store, visited, path, top, flags,
+		NULL, &fi, cancellable, error) == -1 && fi != NULL) {
 		camel_store_free_folder_info_full (store, fi);
 		fi = NULL;
 	}
@@ -356,6 +363,8 @@ get_folder_info_elm (CamelStore *store,
 	g_hash_table_foreach (visited, inode_free, NULL);
 	g_hash_table_destroy (visited);
 
+	g_free (path);
+
 	return fi;
 }
 
@@ -389,17 +398,17 @@ spool_store_get_name (CamelService *service,
 	CamelLocalSettings *local_settings;
 	CamelSpoolStore *spool_store;
 	CamelSettings *settings;
-	const gchar *path;
 	gchar *name;
+	gchar *path;
 
 	spool_store = CAMEL_SPOOL_STORE (service);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	if (brief)
-		return g_strdup (path);
+		return path;
 
 	switch (spool_store_get_type (spool_store, NULL)) {
 		case CAMEL_SPOOL_STORE_MBOX:
@@ -415,6 +424,8 @@ spool_store_get_name (CamelService *service,
 			break;
 	}
 
+	g_free (path);
+
 	return name;
 }
 
@@ -443,8 +454,8 @@ spool_store_get_folder_sync (CamelStore *store,
 	CamelFolder *folder = NULL;
 	camel_spool_store_t type;
 	struct stat st;
-	const gchar *path;
 	gchar *name;
+	gchar *path;
 
 	d(printf("opening folder %s on path %s\n", folder_name, path));
 
@@ -458,7 +469,7 @@ spool_store_get_folder_sync (CamelStore *store,
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	/* we only support an 'INBOX' in mbox mode */
 	if (type == CAMEL_SPOOL_STORE_MBOX) {
@@ -512,6 +523,8 @@ spool_store_get_folder_sync (CamelStore *store,
 		g_free (name);
 	}
 
+	g_free (path);
+
 	return folder;
 }
 
@@ -613,14 +626,14 @@ spool_store_get_full_path (CamelLocalStore *local_store,
 	CamelSpoolStore *spool_store;
 	CamelSettings *settings;
 	CamelService *service;
-	const gchar *path;
 	gchar *full_path;
+	gchar *path;
 
 	service = CAMEL_SERVICE (local_store);
 	settings = camel_service_get_settings (service);
 
 	local_settings = CAMEL_LOCAL_SETTINGS (settings);
-	path = camel_local_settings_get_path (local_settings);
+	path = camel_local_settings_dup_path (local_settings);
 
 	spool_store = CAMEL_SPOOL_STORE (local_store);
 
@@ -638,6 +651,8 @@ spool_store_get_full_path (CamelLocalStore *local_store,
 			break;
 	}
 
+	g_free (path);
+
 	return full_path;
 }
 
diff --git a/camel/providers/nntp/camel-nntp-store.c b/camel/providers/nntp/camel-nntp-store.c
index 1bd0280..77773a8 100644
--- a/camel/providers/nntp/camel-nntp-store.c
+++ b/camel/providers/nntp/camel-nntp-store.c
@@ -253,20 +253,20 @@ connect_to_server (CamelService *service,
 	CamelSession *session;
 	CamelStream *tcp_stream;
 	const gchar *user_cache_dir;
-	const gchar *host;
-	const gchar *user;
 	gboolean retval = FALSE;
 	guchar *buf;
 	guint len;
+	gchar *host;
 	gchar *path;
+	gchar *user;
 
 	session = camel_service_get_session (service);
 	settings = camel_service_get_settings (service);
 	user_cache_dir = camel_service_get_user_cache_dir (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	camel_service_lock (service, CAMEL_SERVICE_REC_CONNECT_LOCK);
 
@@ -331,8 +331,12 @@ connect_to_server (CamelService *service,
 	g_free (store->current_folder);
 	store->current_folder = NULL;
 
- fail:
+fail:
 	camel_service_unlock (service, CAMEL_SERVICE_REC_CONNECT_LOCK);
+
+	g_free (host);
+	g_free (user);
+
 	return retval;
 }
 
@@ -451,18 +455,22 @@ nntp_store_get_name (CamelService *service,
 {
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
-	const gchar *host;
+	gchar *host;
+	gchar *name;
 
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	if (brief)
-		return g_strdup_printf ("%s", host);
+		name = g_strdup_printf ("%s", host);
 	else
-		return g_strdup_printf (_("USENET News via %s"), host);
+		name = g_strdup_printf (_("USENET News via %s"), host);
 
+	g_free (host);
+
+	return name;
 }
 
 extern CamelServiceAuthType camel_nntp_password_authtype;
@@ -478,8 +486,8 @@ nntp_store_authenticate_sync (CamelService *service,
 	CamelNNTPStore *store;
 	CamelAuthenticationResult result;
 	const gchar *password;
-	const gchar *user;
 	gchar *line = NULL;
+	gchar *user;
 	gint status;
 
 	store = CAMEL_NNTP_STORE (service);
@@ -488,14 +496,15 @@ nntp_store_authenticate_sync (CamelService *service,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	user = camel_network_settings_get_user (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (user == NULL) {
 		g_set_error_literal (
 			error, CAMEL_SERVICE_ERROR,
 			CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 			_("Cannot authenticate without a username"));
-		return CAMEL_AUTHENTICATION_ERROR;
+		result = CAMEL_AUTHENTICATION_ERROR;
+		goto exit;
 	}
 
 	if (password == NULL) {
@@ -503,7 +512,8 @@ nntp_store_authenticate_sync (CamelService *service,
 			error, CAMEL_SERVICE_ERROR,
 			CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 			_("Authentication password not available"));
-		return CAMEL_AUTHENTICATION_ERROR;
+		result = CAMEL_AUTHENTICATION_ERROR;
+		goto exit;
 	}
 
 	/* XXX Currently only authinfo user/pass is supported. */
@@ -529,6 +539,9 @@ nntp_store_authenticate_sync (CamelService *service,
 			break;
 	}
 
+exit:
+	g_free (user);
+
 	return result;
 }
 
diff --git a/camel/providers/nntp/camel-nntp-summary.c b/camel/providers/nntp/camel-nntp-summary.c
index 4d0754b..f2997d8 100644
--- a/camel/providers/nntp/camel-nntp-summary.c
+++ b/camel/providers/nntp/camel-nntp-summary.c
@@ -173,8 +173,8 @@ add_range_xover (CamelNNTPSummary *cns,
 	CamelFolderSummary *s;
 	CamelMessageInfoBase *mi;
 	struct _camel_header_raw *headers = NULL;
-	const gchar *host;
 	gchar *line, *tab;
+	gchar *host;
 	guint len;
 	gint ret;
 	guint n, count, total, size;
@@ -186,11 +186,13 @@ add_range_xover (CamelNNTPSummary *cns,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	camel_operation_push_message (
 		cancellable, _("%s: Scanning new messages"), host);
 
+	g_free (host);
+
 	if ((store->capabilities & NNTP_CAPABILITY_OVER) != 0)
 		ret = camel_nntp_raw_command_auth (store, cancellable, error, &line, "over %r", low, high);
 	else
@@ -296,7 +298,7 @@ add_range_head (CamelNNTPSummary *cns,
 	guint i, n, count, total;
 	CamelMessageInfo *mi;
 	CamelMimeParser *mp;
-	const gchar *host;
+	gchar *host;
 
 	s = (CamelFolderSummary *) cns;
 
@@ -306,11 +308,13 @@ add_range_head (CamelNNTPSummary *cns,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	camel_operation_push_message (
 		cancellable, _("%s: Scanning new messages"), host);
 
+	g_free (host);
+
 	count = 0;
 	total = high - low + 1;
 	for (i = low; i < high + 1; i++) {
diff --git a/camel/providers/pop3/camel-pop3-store.c b/camel/providers/pop3/camel-pop3-store.c
index 8618b11..9ae93fd 100644
--- a/camel/providers/pop3/camel-pop3-store.c
+++ b/camel/providers/pop3/camel-pop3-store.c
@@ -98,7 +98,8 @@ connect_to_server (CamelService *service,
 	CamelStream *tcp_stream;
 	CamelPOP3Command *pc;
 	gboolean disable_extensions;
-	const gchar *host;
+	gboolean success = TRUE;
+	gchar *host;
 	guint32 flags = 0;
 	gint clean_quit = TRUE;
 	gint ret;
@@ -106,19 +107,22 @@ connect_to_server (CamelService *service,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	tcp_stream = camel_network_service_connect_sync (
 		CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
-	if (tcp_stream == NULL)
-		return FALSE;
+	if (tcp_stream == NULL) {
+		success = FALSE;
+		goto exit;
+	}
 
 	/* parent class connect initialization */
 	if (CAMEL_SERVICE_CLASS (camel_pop3_store_parent_class)->
 		connect_sync (service, cancellable, error) == FALSE) {
 		g_object_unref (tcp_stream);
-		return FALSE;
+		success = FALSE;
+		goto exit;
 	}
 
 	disable_extensions = camel_pop3_settings_get_disable_extensions (
@@ -133,14 +137,15 @@ connect_to_server (CamelService *service,
 			_("Failed to read a valid greeting from POP server %s"),
 			host);
 		g_object_unref (tcp_stream);
-		return FALSE;
+		success = FALSE;
+		goto exit;
 	}
 
 	g_object_get (settings, "security-method", &method, NULL);
 
 	if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT) {
 		g_object_unref (tcp_stream);
-		return TRUE;
+		goto exit;
 	}
 
 	/* as soon as we send a STLS command, all hope is lost of a clean QUIT if problems arise */
@@ -192,9 +197,9 @@ connect_to_server (CamelService *service,
 	 * command, the client MUST discard prior CAPA responses */
 	camel_pop3_engine_reget_capabilities (store->engine, cancellable);
 
-	return TRUE;
+	goto exit;
 
- stls_exception:
+stls_exception:
 	if (clean_quit) {
 		/* try to disconnect cleanly */
 		pc = camel_pop3_engine_command_new (store->engine, 0, NULL, NULL, cancellable, NULL, "QUIT\r\n");
@@ -207,7 +212,12 @@ connect_to_server (CamelService *service,
 	g_object_unref (tcp_stream);
 	store->engine = NULL;
 
-	return FALSE;
+	success = FALSE;
+
+exit:
+	g_free (host);
+
+	return success;
 }
 
 static CamelAuthenticationResult
@@ -222,9 +232,9 @@ try_sasl (CamelPOP3Store *store,
 	CamelSettings *settings;
 	CamelService *service;
 	guchar *line, *resp;
-	const gchar *host;
-	CamelSasl *sasl;
+	CamelSasl *sasl = NULL;
 	gchar *string;
+	gchar *host;
 	guint len;
 	gint ret;
 
@@ -232,7 +242,7 @@ try_sasl (CamelPOP3Store *store,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	sasl = camel_sasl_new ("pop", mechanism, service);
 	if (sasl == NULL) {
@@ -240,7 +250,8 @@ try_sasl (CamelPOP3Store *store,
 			error, CAMEL_SERVICE_ERROR,
 			CAMEL_SERVICE_ERROR_URL_INVALID,
 			_("No support for %s authentication"), mechanism);
-		return CAMEL_AUTHENTICATION_ERROR;
+		result = CAMEL_AUTHENTICATION_ERROR;
+		goto exit;
 	}
 
 	string = g_strdup_printf ("AUTH %s\r\n", mechanism);
@@ -280,7 +291,7 @@ try_sasl (CamelPOP3Store *store,
 				_("Cannot login to POP server %s: "
 				  "SASL Protocol error"), host);
 			result = CAMEL_AUTHENTICATION_ERROR;
-			goto done;
+			goto exit;
 		}
 
 		string = g_strdup_printf ("%s\r\n", resp);
@@ -295,15 +306,18 @@ try_sasl (CamelPOP3Store *store,
 
 	}
 
-	goto done;
+	goto exit;
 
 ioerror:
 	g_prefix_error (
 		error, _("Failed to authenticate on POP server %s: "), host);
 	result = CAMEL_AUTHENTICATION_ERROR;
 
-done:
-	g_object_unref (sasl);
+exit:
+	if (sasl != NULL)
+		g_object_unref (sasl);
+
+	g_free (host);
 
 	return result;
 }
@@ -333,21 +347,27 @@ pop3_store_get_name (CamelService *service,
 {
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
+	gchar *name;
 
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (brief)
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("POP3 server %s"), host);
 	else
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("POP3 server for %s on %s"), user, host);
+
+	g_free (host);
+	g_free (user);
+
+	return name;
 }
 
 static gboolean
@@ -358,25 +378,26 @@ pop3_store_connect_sync (CamelService *service,
 	CamelPOP3Store *store = (CamelPOP3Store *) service;
 	CamelSettings *settings;
 	CamelSession *session;
-	const gchar *mechanism;
 	const gchar *user_data_dir;
-	gboolean success;
+	gboolean success = TRUE;
+	gchar *mechanism;
 
 	session = camel_service_get_session (service);
 	settings = camel_service_get_settings (service);
 	user_data_dir = camel_service_get_user_data_dir (service);
 
+	mechanism = camel_network_settings_dup_auth_mechanism (
+		CAMEL_NETWORK_SETTINGS (settings));
+
 	if (!camel_session_get_online (session)) {
 		g_set_error (
 			error, CAMEL_SERVICE_ERROR,
 			CAMEL_SERVICE_ERROR_UNAVAILABLE,
 			_("You must be working online to complete this operation"));
-		return FALSE;
+		success = FALSE;
+		goto exit;
 	}
 
-	mechanism = camel_network_settings_get_auth_mechanism (
-		CAMEL_NETWORK_SETTINGS (settings));
-
 	if (store->cache == NULL) {
 		store->cache = camel_data_cache_new (user_data_dir, error);
 		if (store->cache) {
@@ -387,15 +408,17 @@ pop3_store_connect_sync (CamelService *service,
 		}
 	}
 
-	if (!connect_to_server (service, cancellable, error))
-		return FALSE;
+	success = connect_to_server (service, cancellable, error);
+
+	if (!success)
+		goto exit;
 
 	success = camel_session_authenticate_sync (
 		session, service, mechanism, cancellable, error);
 
 	if (!success) {
 		camel_service_disconnect_sync (service, TRUE, NULL);
-		return FALSE;
+		goto exit;
 	}
 
 	/* Now that we are in the TRANSACTION state,
@@ -403,7 +426,10 @@ pop3_store_connect_sync (CamelService *service,
 	store->engine->state = CAMEL_POP3_ENGINE_TRANSACTION;
 	camel_pop3_engine_reget_capabilities (store->engine, cancellable);
 
-	return TRUE;
+exit:
+	g_free (mechanism);
+
+	return success;
 }
 
 static gboolean
@@ -449,16 +475,16 @@ pop3_store_authenticate_sync (CamelService *service,
 	CamelPOP3Command *pcu = NULL;
 	CamelPOP3Command *pcp = NULL;
 	const gchar *password;
-	const gchar *host;
-	const gchar *user;
+	gchar *host;
+	gchar *user;
 	gint status;
 
 	password = camel_service_get_password (service);
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	user = camel_network_settings_get_user (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	user = camel_network_settings_dup_user (network_settings);
 
 	if (mechanism == NULL) {
 		if (password == NULL) {
@@ -466,7 +492,8 @@ pop3_store_authenticate_sync (CamelService *service,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Authentication password not available"));
-			return CAMEL_AUTHENTICATION_ERROR;
+			result = CAMEL_AUTHENTICATION_ERROR;
+			goto exit;
 		}
 
 		/* pop engine will take care of pipelining ability */
@@ -485,7 +512,8 @@ pop3_store_authenticate_sync (CamelService *service,
 				error, CAMEL_SERVICE_ERROR,
 				CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 				_("Authentication password not available"));
-			return CAMEL_AUTHENTICATION_ERROR;
+			result = CAMEL_AUTHENTICATION_ERROR;
+			goto exit;
 		}
 
 		d = store->engine->apop;
@@ -502,7 +530,8 @@ pop3_store_authenticate_sync (CamelService *service,
 					  "attack suspected. Please contact your admin."),
 					host);
 
-				return CAMEL_AUTHENTICATION_ERROR;
+				result = CAMEL_AUTHENTICATION_ERROR;
+				goto exit;
 			}
 			d++;
 		}
@@ -525,10 +554,12 @@ pop3_store_authenticate_sync (CamelService *service,
 		while (link != NULL) {
 			CamelServiceAuthType *auth = link->data;
 
-			if (g_strcmp0 (auth->authproto, mechanism) == 0)
-				return try_sasl (
+			if (g_strcmp0 (auth->authproto, mechanism) == 0) {
+				result = try_sasl (
 					store, mechanism,
 					cancellable, error);
+				goto exit;
+			}
 			link = g_list_next (link);
 		}
 
@@ -536,7 +567,8 @@ pop3_store_authenticate_sync (CamelService *service,
 			error, CAMEL_SERVICE_ERROR,
 			CAMEL_SERVICE_ERROR_CANT_AUTHENTICATE,
 			_("No support for %s authentication"), mechanism);
-		return CAMEL_AUTHENTICATION_ERROR;
+		result = CAMEL_AUTHENTICATION_ERROR;
+		goto exit;
 	}
 
 	while ((status = camel_pop3_engine_iterate (store->engine, pcp, cancellable, error)) > 0)
@@ -576,6 +608,10 @@ pop3_store_authenticate_sync (CamelService *service,
 	if (pcu != NULL)
 		camel_pop3_engine_command_free (store->engine, pcu);
 
+exit:
+	g_free (host);
+	g_free (user);
+
 	return result;
 }
 
@@ -589,7 +625,7 @@ pop3_store_query_auth_types_sync (CamelService *service,
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
 	GList *types = NULL;
-	const gchar *host;
+	gchar *host;
 	GError *local_error = NULL;
 
 	/* Chain up to parent's query_auth_types() method. */
@@ -605,7 +641,7 @@ pop3_store_query_auth_types_sync (CamelService *service,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	if (connect_to_server (service, cancellable, NULL)) {
 		types = g_list_concat (types, g_list_copy (store->engine->auth));
@@ -617,6 +653,8 @@ pop3_store_query_auth_types_sync (CamelService *service,
 			_("Could not connect to POP server %s"), host);
 	}
 
+	g_free (host);
+
 	return types;
 }
 
diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c
index a838d46..d4a00b5 100644
--- a/camel/providers/smtp/camel-smtp-transport.c
+++ b/camel/providers/smtp/camel-smtp-transport.c
@@ -105,8 +105,9 @@ connect_to_server (CamelService *service,
 	CamelNetworkSecurityMethod method;
 	CamelSettings *settings;
 	CamelStream *tcp_stream;
-	const gchar *host;
 	gchar *respbuf = NULL;
+	gboolean success = TRUE;
+	gchar *host;
 
 	if (!CAMEL_SERVICE_CLASS (camel_smtp_transport_parent_class)->
 		connect_sync (service, cancellable, error))
@@ -119,14 +120,16 @@ connect_to_server (CamelService *service,
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 	method = camel_network_settings_get_security_method (network_settings);
 
 	tcp_stream = camel_network_service_connect_sync (
 		CAMEL_NETWORK_SERVICE (service), cancellable, error);
 
-	if (tcp_stream == NULL)
-		return FALSE;
+	if (tcp_stream == NULL) {
+		success = FALSE;
+		goto exit;
+	}
 
 	transport->connected = TRUE;
 
@@ -146,14 +149,16 @@ connect_to_server (CamelService *service,
 		if (respbuf == NULL) {
 			g_prefix_error (error, _("Welcome response error: "));
 			transport->connected = FALSE;
-			return FALSE;
+			success = FALSE;
+			goto exit;
 		}
 		if (strncmp (respbuf, "220", 3)) {
 			smtp_set_error (
 				transport, respbuf, cancellable, error);
 			g_prefix_error (error, _("Welcome response error: "));
 			g_free (respbuf);
-			return FALSE;
+			success = FALSE;
+			goto exit;
 		}
 	} while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */
 	g_free (respbuf);
@@ -161,8 +166,10 @@ connect_to_server (CamelService *service,
 	/* Try sending EHLO */
 	transport->flags |= CAMEL_SMTP_TRANSPORT_IS_ESMTP;
 	if (!smtp_helo (transport, cancellable, error)) {
-		if (!transport->connected)
-			return FALSE;
+		if (!transport->connected) {
+			success = FALSE;
+			goto exit;
+		}
 
 		/* Fall back to HELO */
 		g_clear_error (error);
@@ -171,8 +178,8 @@ connect_to_server (CamelService *service,
 		if (!smtp_helo (transport, cancellable, error)) {
 			camel_service_disconnect_sync (
 				(CamelService *) transport, TRUE, NULL);
-
-			return FALSE;
+			success = FALSE;
+			goto exit;
 		}
 	}
 
@@ -180,7 +187,7 @@ connect_to_server (CamelService *service,
 	g_clear_error (error);
 
 	if (method != CAMEL_NETWORK_SECURITY_METHOD_STARTTLS_ON_STANDARD_PORT)
-		return TRUE;  /* we're done */
+		goto exit;  /* we're done */
 
 	if (!(transport->flags & CAMEL_SMTP_TRANSPORT_STARTTLS)) {
 		g_set_error (
@@ -235,22 +242,27 @@ connect_to_server (CamelService *service,
 	if (!smtp_helo (transport, cancellable, error)) {
 		camel_service_disconnect_sync (
 			(CamelService *) transport, TRUE, NULL);
-
-		return FALSE;
+		success = FALSE;
 	}
 
-	return TRUE;
+	goto exit;
 
- exception_cleanup:
+exception_cleanup:
 
 	g_object_unref (transport->istream);
 	transport->istream = NULL;
+
 	g_object_unref (transport->ostream);
 	transport->ostream = NULL;
 
 	transport->connected = FALSE;
 
-	return FALSE;
+	success = FALSE;
+
+exit:
+	g_free (host);
+
+	return success;
 }
 
 static void
@@ -267,19 +279,24 @@ smtp_transport_get_name (CamelService *service,
 {
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
-	const gchar *host;
+	gchar *host;
+	gchar *name;
 
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
 
 	if (brief)
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("SMTP server %s"), host);
 	else
-		return g_strdup_printf (
+		name = g_strdup_printf (
 			_("SMTP mail delivery via %s"), host);
+
+	g_free (host);
+
+	return name;
 }
 
 static gboolean
@@ -290,37 +307,41 @@ smtp_transport_connect_sync (CamelService *service,
 	CamelSmtpTransport *transport = CAMEL_SMTP_TRANSPORT (service);
 	CamelNetworkSettings *network_settings;
 	CamelSettings *settings;
-	const gchar *host;
-	const gchar *mechanism;
+	gchar *host;
+	gchar *mechanism;
 	gboolean auth_required;
 	gboolean success = TRUE;
 
 	settings = camel_service_get_settings (service);
 
 	network_settings = CAMEL_NETWORK_SETTINGS (settings);
-	host = camel_network_settings_get_host (network_settings);
-	mechanism = camel_network_settings_get_auth_mechanism (network_settings);
+	host = camel_network_settings_dup_host (network_settings);
+	mechanism = camel_network_settings_dup_auth_mechanism (network_settings);
 
 	/* We (probably) need to check popb4smtp before we connect ... */
 	if (g_strcmp0 (mechanism, "POPB4SMTP") == 0) {
-		gint truth;
 		GByteArray *chal;
 		CamelSasl *sasl;
 
 		sasl = camel_sasl_new ("smtp", "POPB4SMTP", service);
 		chal = camel_sasl_challenge_sync (sasl, NULL, cancellable, error);
-		truth = camel_sasl_get_authenticated (sasl);
-		if (chal)
+		if (chal != NULL)
 			g_byte_array_free (chal, TRUE);
-		g_object_unref (sasl);
 
-		if (!truth)
-			return FALSE;
+		if (camel_sasl_get_authenticated (sasl))
+			success = connect_to_server (
+				service, cancellable, error);
+		else
+			success = FALSE;
+
+		g_object_unref (sasl);
 
-		return connect_to_server (service, cancellable, error);
+		goto exit;
 	}
 
-	if (!connect_to_server (service, cancellable, error))
+	success = connect_to_server (service, cancellable, error);
+
+	if (!success)
 		return FALSE;
 
 	/* check to see if AUTH is required, if so...then AUTH ourselves */
@@ -352,6 +373,10 @@ smtp_transport_connect_sync (CamelService *service,
 			camel_service_disconnect_sync (service, TRUE, NULL);
 	}
 
+exit:
+	g_free (host);
+	g_free (mechanism);
+
 	return success;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]