diff options
author | Jeffrey Stedfast <fejj@novell.com> | 2006-04-18 18:11:08 +0000 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2006-04-18 18:11:08 +0000 |
commit | 793e031b8f227ba1bc17612e4380f6c6da03d708 (patch) | |
tree | e61b5f7a3e77ec92d68617388283160dbdf48b2d | |
parent | 4b4ae07bcd68632bf9816a7be9abab70c4b4cdf7 (diff) | |
download | evolution-data-server-793e031b8f227ba1bc17612e4380f6c6da03d708.tar.gz |
If the hostname isn't valid (contains invalid chars, etc), then fallback
2006-04-18 Jeffrey Stedfast <fejj@novell.com>
* camel-smtp-transport.c (smtp_helo): If the hostname isn't valid
(contains invalid chars, etc), then fallback to numeric host
address. Fixes bug #336035. Based on a patch by David Woodhouse.
-rw-r--r-- | camel/providers/smtp/ChangeLog | 6 | ||||
-rw-r--r-- | camel/providers/smtp/camel-smtp-transport.c | 58 |
2 files changed, 56 insertions, 8 deletions
diff --git a/camel/providers/smtp/ChangeLog b/camel/providers/smtp/ChangeLog index 2e673fd45..aaa4ef05e 100644 --- a/camel/providers/smtp/ChangeLog +++ b/camel/providers/smtp/ChangeLog @@ -1,3 +1,9 @@ +2006-04-18 Jeffrey Stedfast <fejj@novell.com> + + * camel-smtp-transport.c (smtp_helo): If the hostname isn't valid + (contains invalid chars, etc), then fallback to numeric host + address. Fixes bug #336035. Based on a patch by David Woodhouse. + 2005-08-12 Tor Lillqvist <tml@novell.com> * Makefile.am: Use NO_UNDEFINED. Link with libcamel-provider, diff --git a/camel/providers/smtp/camel-smtp-transport.c b/camel/providers/smtp/camel-smtp-transport.c index 0c3948431..42a038219 100644 --- a/camel/providers/smtp/camel-smtp-transport.c +++ b/camel/providers/smtp/camel-smtp-transport.c @@ -873,11 +873,50 @@ smtp_set_exception (CamelSmtpTransport *transport, gboolean disconnect, const ch } static gboolean +hostname_is_valid (const char *name) +{ + enum { ALNUM, DASH, DOT } state = DOT; + gboolean dotseen = FALSE; + + if (!name) + return FALSE; + + while (*name) { + switch (state) { + case ALNUM: + if (*name == '-') { + state = DASH; + break; + } else if (*name == '.') { + dotseen = TRUE; + state = DOT; + break; + } /* else ... */ + case DOT: + case DASH: + if (!isalnum (*name)) + return FALSE; + state = ALNUM; + break; + } + name++; + } + + /* If it didn't end with an alphanumeric character, or there were no + dots, it's invalid */ + if (state != ALNUM || !dotseen) + return FALSE; + else + return TRUE; +} + +static gboolean smtp_helo (CamelSmtpTransport *transport, CamelException *ex) { - /* say hello to the server */ char *name = NULL, *cmdbuf = NULL, *respbuf = NULL; const char *token, *numeric = NULL; + struct sockaddr *addr; + socklet_t addrlen; /* these are flags that we set, so unset them in case we are being called a second time (ie, after a STARTTLS) */ @@ -892,20 +931,23 @@ smtp_helo (CamelSmtpTransport *transport, CamelException *ex) } camel_operation_start_transient (NULL, _("SMTP Greeting")); - + + addr = transport->localaddr; + addrlen = transport->localaddrlen; + /* force name resolution first, fallback to numerical, we need to know when it falls back */ - if (camel_getnameinfo(transport->localaddr, transport->localaddrlen, &name, NULL, NI_NAMEREQD, NULL) != 0) { - if (camel_getnameinfo(transport->localaddr, transport->localaddrlen, &name, NULL, NI_NUMERICHOST, NULL) != 0) - name = g_strdup("localhost.localdomain"); - else { - if (transport->localaddr->sa_family == AF_INET6) + if (camel_getnameinfo (addr, addrlen, &name, NULL, NI_NAMEREQD, NULL) != 0 || !hostname_is_valid (name)) { + g_free (name); + if (camel_getnameinfo (addr, addrlen, &name, NULL, NI_NUMERICHOST, NULL) != 0) { + name = g_strdup ("localhost.localdomain"); + } else { + if (addr->sa_family == AF_INET6) numeric = "IPv6:"; else numeric = ""; } } - /* hiya server! how are you today? */ token = (transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP) ? "EHLO" : "HELO"; if (numeric) cmdbuf = g_strdup_printf("%s [%s%s]\r\n", token, numeric, name); |