diff options
Diffstat (limited to 'usr.sbin/smtpd')
-rw-r--r-- | usr.sbin/smtpd/enqueue.c | 4 | ||||
-rw-r--r-- | usr.sbin/smtpd/parse.y | 4 | ||||
-rw-r--r-- | usr.sbin/smtpd/util.c | 87 |
3 files changed, 49 insertions, 46 deletions
diff --git a/usr.sbin/smtpd/enqueue.c b/usr.sbin/smtpd/enqueue.c index cf595c1f71f..9bb0d423eed 100644 --- a/usr.sbin/smtpd/enqueue.c +++ b/usr.sbin/smtpd/enqueue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: enqueue.c,v 1.110 2015/12/29 17:57:03 millert Exp $ */ +/* $OpenBSD: enqueue.c,v 1.111 2016/01/12 17:29:43 sunil Exp $ */ /* * Copyright (c) 2005 Henning Brauer <henning@bulabula.org> @@ -238,7 +238,7 @@ enqueue(int argc, char *argv[], FILE *ofp) argv += optind; if (getmailname(host, sizeof(host)) == -1) - err(EX_NOHOST, "getmailname"); + errx(EX_NOHOST, "getmailname"); if (no_getlogin) { if ((pw = getpwuid(getuid())) == NULL) user = "anonymous"; diff --git a/usr.sbin/smtpd/parse.y b/usr.sbin/smtpd/parse.y index 777673e4853..216ffff585f 100644 --- a/usr.sbin/smtpd/parse.y +++ b/usr.sbin/smtpd/parse.y @@ -1,4 +1,4 @@ -/* $OpenBSD: parse.y,v 1.179 2016/01/04 13:30:20 jung Exp $ */ +/* $OpenBSD: parse.y,v 1.180 2016/01/12 17:29:43 sunil Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@poolp.org> @@ -1836,7 +1836,7 @@ parse_config(struct smtpd *x_conf, const char *filename, int opts) char hostname[HOST_NAME_MAX+1]; char hostname_copy[HOST_NAME_MAX+1]; - if (!getmailname(hostname, sizeof hostname)) + if (getmailname(hostname, sizeof hostname) == -1) return (-1); conf = x_conf; diff --git a/usr.sbin/smtpd/util.c b/usr.sbin/smtpd/util.c index b6b7cd5abdb..8e62e941660 100644 --- a/usr.sbin/smtpd/util.c +++ b/usr.sbin/smtpd/util.c @@ -1,4 +1,4 @@ -/* $OpenBSD: util.c,v 1.124 2015/12/28 22:08:30 jung Exp $ */ +/* $OpenBSD: util.c,v 1.125 2016/01/12 17:29:43 sunil Exp $ */ /* * Copyright (c) 2000,2001 Markus Friedl. All rights reserved. @@ -53,6 +53,7 @@ const char *log_in6addr(const struct in6_addr *); const char *log_sockaddr(struct sockaddr *); +static int parse_mailname_file(char *, size_t); void * xmalloc(size_t size, const char *where) @@ -737,67 +738,69 @@ parse_smtp_response(char *line, size_t len, char **msg, int *cont) return NULL; } -int -getmailname(char *hostname, size_t len) +static int +parse_mailname_file(char *hostname, size_t len) { - struct addrinfo hints, *res = NULL; FILE *fp; char *buf = NULL; size_t bufsz = 0; ssize_t buflen; - int error, ret = 0; - /* First, check if we have MAILNAME_FILE */ if ((fp = fopen(MAILNAME_FILE, "r")) == NULL) - goto nomailname; + return 1; if ((buflen = getline(&buf, &bufsz, fp)) == -1) - goto end; + goto error; if (buf[buflen - 1] == '\n') buf[buflen - 1] = '\0'; - if (strlcpy(hostname, buf, len) >= len) + if (strlcpy(hostname, buf, len) >= len) { fprintf(stderr, MAILNAME_FILE " entry too long"); - else { - ret = 1; - goto end; + goto error; } -nomailname: - if (gethostname(hostname, len) == -1) { - fprintf(stderr, "invalid hostname: gethostname() failed\n"); - goto end; - } - - if (strchr(hostname, '.') == NULL) { - memset(&hints, 0, sizeof hints); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = AI_CANONNAME; - error = getaddrinfo(hostname, NULL, &hints, &res); - if (error) { - fprintf(stderr, "invalid hostname: getaddrinfo() failed: %s\n", - gai_strerror(error)); - goto end; - } + return 0; +error: + fclose(fp); + free(buf); + return 1; +} - if (strlcpy(hostname, res->ai_canonname, len) >= len) { - fprintf(stderr, "hostname too long"); - goto end; - } +int +getmailname(char *hostname, size_t len) +{ + struct addrinfo hints, *res = NULL; + int error; + + /* Try MAILNAME_FILE first */ + if (parse_mailname_file(hostname, len) == 0) + return 0; + + /* Next, gethostname(3) */ + if (gethostname(hostname, len) == -1) { + fprintf(stderr, "getmailname: gethostname() failed\n"); + return -1; } - ret = 1; + if (strchr(hostname, '.') != NULL) + return 0; -end: - free(buf); - if (res) - freeaddrinfo(res); - if (fp) - fclose(fp); - return ret; + /* Canonicalize if domain part is missing */ + memset(&hints, 0, sizeof hints); + hints.ai_family = PF_UNSPEC; + hints.ai_flags = AI_CANONNAME; + error = getaddrinfo(hostname, NULL, &hints, &res); + if (error) + return 0; /* Continue with non-canon hostname */ + + if (strlcpy(hostname, res->ai_canonname, len) >= len) { + fprintf(stderr, "hostname too long"); + return -1; + } + + freeaddrinfo(res); + return 0; } int |