summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@novell.com>2006-04-18 18:11:08 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2006-04-18 18:11:08 +0000
commit793e031b8f227ba1bc17612e4380f6c6da03d708 (patch)
treee61b5f7a3e77ec92d68617388283160dbdf48b2d
parent4b4ae07bcd68632bf9816a7be9abab70c4b4cdf7 (diff)
downloadevolution-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/ChangeLog6
-rw-r--r--camel/providers/smtp/camel-smtp-transport.c58
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);