aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog12
-rw-r--r--camel/providers/imap4/camel-imap4-summary.c37
2 files changed, 40 insertions, 9 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index e0ce439045..01c00dc096 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,5 +1,8 @@
2004-11-02 Jeffrey Stedfast <fejj@novell.com>
+ * providers/imap4/camel-imap4-summary.c (envelope_decode_address):
+ Do proper cleanup in case of error and also handle literals.
+
* providers/imap4/camel-imap4-store.c (imap4_get_folder_info):
Removed camel_service_connect() call which is no longer needed.
(imap4_connect): If engine is already connected, shortcut to
@@ -13,11 +16,14 @@
(connect_to_server_wrapper): Do the same SSL->TLS and TLS->CLEAR
fallbacks that the 2.0 (and older) code did.
- * providers/pop3/camel-pop3-store.c (connect_to_server_wrapper): Same.
+ * providers/pop3/camel-pop3-store.c (connect_to_server_wrapper):
+ Same.
- * providers/imap4/camel-imap4-store.c (connect_to_server_wrapper): Same.
+ * providers/imap4/camel-imap4-store.c (connect_to_server_wrapper):
+ Same.
- * providers/imap/camel-imap-store.c (connect_to_server_wrapper): Same.
+ * providers/imap/camel-imap-store.c (connect_to_server_wrapper):
+ Same.
2004-11-01 Jeffrey Stedfast <fejj@novell.com>
diff --git a/camel/providers/imap4/camel-imap4-summary.c b/camel/providers/imap4/camel-imap4-summary.c
index 2ed1e490da..d1d581d690 100644
--- a/camel/providers/imap4/camel-imap4-summary.c
+++ b/camel/providers/imap4/camel-imap4-summary.c
@@ -163,9 +163,11 @@ envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelExceptio
{
char *addr, *name = NULL, *user = NULL;
struct _camel_header_address *cia;
+ unsigned char *literal = NULL;
camel_imap4_token_t token;
const char *domain = NULL;
int part = 0;
+ size_t n;
if (camel_imap4_engine_next_token (engine, &token, ex) == -1)
return -1;
@@ -182,8 +184,9 @@ envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelExceptio
do {
if (camel_imap4_engine_next_token (engine, &token, ex) == -1)
- return -1;
+ goto exception;
+ literal = NULL;
switch (token.token) {
case CAMEL_IMAP4_TOKEN_NIL:
break;
@@ -201,17 +204,33 @@ envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelExceptio
break;
}
break;
+ case CAMEL_IMAP4_TOKEN_LITERAL:
+ if (camel_imap4_engine_literal (engine, &literal, &n, ex) == -1)
+ goto exception;
+
+ switch (part) {
+ case 0:
+ name = camel_header_decode_string (literal, NULL);
+ g_free (literal);
+ break;
+ case 2:
+ user = literal;
+ break;
+ case 3:
+ domain = literal;
+ break;
+ }
+ break;
default:
camel_imap4_utils_set_unexpected_token_error (ex, engine, &token);
- g_free (name);
- g_free (user);
- return -1;
+ goto exception;
}
part++;
} while (part < 4);
addr = g_strdup_printf ("%s@%s", user, domain);
+ g_free (literal);
g_free (user);
cia = camel_header_address_new_name (name, addr);
@@ -233,6 +252,13 @@ envelope_decode_address (CamelIMAP4Engine *engine, GString *addrs, CamelExceptio
}
return 0;
+
+ exception:
+
+ g_free (name);
+ g_free (user);
+
+ return -1;
}
static int
@@ -315,8 +341,7 @@ envelope_decode_date (CamelIMAP4Engine *engine, time_t *date, CamelException *ex
*date = camel_header_decode_date (nstring, NULL);
- if (literal)
- g_free (literal);
+ g_free (literal);
return 0;
}