From: Florian Obser Subject: Re: smtpd: spell HOST_NAME_MAX differently (for -portable) To: Omar Polo Cc: tech@openbsd.org, gilles@poolp.org Date: Tue, 20 Aug 2024 14:49:06 +0200 On 2024-08-20 12:40 +02, Omar Polo wrote: > in -portable land there's an issue on glibc-based systems because > HOST_NAME_MAX is set at 64. We end up truncating longer names and this > makes checks like fcrdns fails. > > In the spirit of reducing the number of portable only changes to carry, > would something like this be acceptable for base? An alternative would > be to use _POSIX_HOST_NAME_MAX instead. > > The diff is mostly by Romain Petit via[0] adapted for base. > [0]: > > Thoughts? I think they should fix their libc. posix has this to say: {HOST_NAME_MAX} Maximum length of a host name (not including the terminating null) as returned from the gethostname() function. Minimum Acceptable Value: {_POSIX_HOST_NAME_MAX} {_POSIX_HOST_NAME_MAX} Maximum length of a host name (not including the terminating null) as returned from the gethostname() function. Value: 255 > > diff /home/op/w/smtpd > commit - 4ec79e90906150d8ad2e80322cd41778d6546f40 > path + /home/op/w/smtpd > blob - c13d2bef933951b39b335cdeadae9211c2a847dd > file + config.c > --- config.c > +++ config.c > @@ -35,7 +35,7 @@ config_default(void) > struct smtpd *conf = NULL; > struct mta_limits *limits = NULL; > struct table *t = NULL; > - char hostname[HOST_NAME_MAX+1]; > + char hostname[SMTPD_HOST_NAME_MAX+1]; > > if (getmailname(hostname, sizeof hostname) == -1) > return NULL; > blob - b1b49ea757665739e33a643293dfb1c9ed0aa79f > file + dns.c > --- dns.c > +++ dns.c > @@ -40,7 +40,7 @@ struct dns_session { > struct mproc *p; > uint64_t reqid; > int type; > - char name[HOST_NAME_MAX+1]; > + char name[SMTPD_HOST_NAME_MAX+1]; > size_t mxfound; > int error; > int refcount; > @@ -342,7 +342,7 @@ dns_lookup_host(struct dns_session *s, const char *hos > { > struct dns_lookup *lookup; > struct addrinfo hints; > - char hostcopy[HOST_NAME_MAX+1]; > + char hostcopy[SMTPD_HOST_NAME_MAX+1]; > char *p; > void *as; > > blob - 51616d0d59059e807fc387b3ba17526804ede2ff > file + enqueue.c > --- enqueue.c > +++ enqueue.c > @@ -88,7 +88,7 @@ struct { > #define WSP(c) (c == ' ' || c == '\t') > > int verbose = 0; > -static char host[HOST_NAME_MAX+1]; > +static char host[SMTPD_HOST_NAME_MAX+1]; > char *user = NULL; > time_t timestamp; > > blob - fb221da2e289695e44646632c0964dbaeff92854 > file + mail.maildir.c > --- mail.maildir.c > +++ mail.maildir.c > @@ -32,6 +32,8 @@ > #include > #include > > +#include "smtpd-defines.h" > + > #define MAILADDR_ESCAPE "!#$%&'*/?^`{|}~" > > static int maildir_subdir(const char *, char *, size_t); > @@ -116,7 +118,7 @@ maildir_engine(const char *dirname, int junk) > char extpath[PATH_MAX]; > char subdir[PATH_MAX]; > char filename[PATH_MAX]; > - char hostname[HOST_NAME_MAX+1]; > + char hostname[SMTPD_HOST_NAME_MAX+1]; > > char tmp[PATH_MAX]; > char new[PATH_MAX]; > blob - 8022d23ecb02e4654968912bb112c2042701e89e > file + mta.c > --- mta.c > +++ mta.c > @@ -156,7 +156,7 @@ static time_t max_seen_discdelay_route; > > #define HOSTSTAT_EXPIRE_DELAY (4 * 3600) > struct hoststat { > - char name[HOST_NAME_MAX+1]; > + char name[SMTPD_HOST_NAME_MAX+1]; > time_t tm; > char error[LINE_MAX]; > struct tree deferred; > @@ -2627,7 +2627,7 @@ void > mta_hoststat_update(const char *host, const char *error) > { > struct hoststat *hs = NULL; > - char buf[HOST_NAME_MAX+1]; > + char buf[SMTPD_HOST_NAME_MAX+1]; > > if (!lowercase(buf, host, sizeof buf)) > return; > @@ -2652,7 +2652,7 @@ void > mta_hoststat_cache(const char *host, uint64_t evpid) > { > struct hoststat *hs = NULL; > - char buf[HOST_NAME_MAX+1]; > + char buf[SMTPD_HOST_NAME_MAX+1]; > > if (!lowercase(buf, host, sizeof buf)) > return; > @@ -2671,7 +2671,7 @@ void > mta_hoststat_uncache(const char *host, uint64_t evpid) > { > struct hoststat *hs = NULL; > - char buf[HOST_NAME_MAX+1]; > + char buf[SMTPD_HOST_NAME_MAX+1]; > > if (!lowercase(buf, host, sizeof buf)) > return; > @@ -2687,7 +2687,7 @@ void > mta_hoststat_reschedule(const char *host) > { > struct hoststat *hs = NULL; > - char buf[HOST_NAME_MAX+1]; > + char buf[SMTPD_HOST_NAME_MAX+1]; > uint64_t evpid; > > if (!lowercase(buf, host, sizeof buf)) > blob - b4cf1f21ddb02dce7a4911285e33eebfcf517067 > file + parse.y > --- parse.y > +++ parse.y > @@ -319,7 +319,7 @@ ADMD STRING { > > ca: > CA STRING { > - char buf[HOST_NAME_MAX+1]; > + char buf[SMTPD_HOST_NAME_MAX+1]; > > /* if not catchall, check that it is a valid domain */ > if (strcmp($2, "*") != 0) { > @@ -388,7 +388,7 @@ MTA MAX_DEFERRED NUMBER { > > pki: > PKI STRING { > - char buf[HOST_NAME_MAX+1]; > + char buf[SMTPD_HOST_NAME_MAX+1]; > > /* if not catchall, check that it is a valid domain */ > if (strcmp($2, "*") != 0) { > blob - 85659829f541b3e7827120d6cfec379721b1481c > file + smtp_session.c > --- smtp_session.c > +++ smtp_session.c > @@ -123,8 +123,8 @@ struct smtp_session { > struct listener *listener; > void *ssl_ctx; > struct sockaddr_storage ss; > - char rdns[HOST_NAME_MAX+1]; > - char smtpname[HOST_NAME_MAX+1]; > + char rdns[SMTPD_HOST_NAME_MAX+1]; > + char smtpname[SMTPD_HOST_NAME_MAX+1]; > int fcrdns; > > int flags; > blob - 279d9e27b1e5c414a6288b0e13e34017f6214ee6 > file + smtpd-defines.h > --- smtpd-defines.h > +++ smtpd-defines.h > @@ -20,6 +20,9 @@ > #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) > #endif > > +/* for -portable because some systems have a value too short */ > +#define SMTPD_HOST_NAME_MAX HOST_NAME_MAX > + > #define SMTPD_TABLENAME_SIZE (64 + 1) > #define SMTPD_TAG_SIZE (32 + 1) > > blob - 2be11bf2b536398ce24c3942b665cdefc21d7f94 > file + smtpd.h > --- smtpd.h > +++ smtpd.h > @@ -120,7 +120,7 @@ struct netaddr { > struct relayhost { > uint16_t flags; > int tls; > - char hostname[HOST_NAME_MAX+1]; > + char hostname[SMTPD_HOST_NAME_MAX+1]; > uint16_t port; > char authlabel[PATH_MAX]; > }; > @@ -131,7 +131,7 @@ struct credentials { > }; > > struct destination { > - char name[HOST_NAME_MAX+1]; > + char name[SMTPD_HOST_NAME_MAX+1]; > }; > > struct source { > @@ -140,7 +140,7 @@ struct source { > > struct addrname { > struct sockaddr_storage addr; > - char name[HOST_NAME_MAX+1]; > + char name[SMTPD_HOST_NAME_MAX+1]; > }; > > union lookup { > @@ -475,7 +475,7 @@ struct maddrmap { > struct envelope { > TAILQ_ENTRY(envelope) entry; > > - char dispatcher[HOST_NAME_MAX+1]; > + char dispatcher[SMTPD_HOST_NAME_MAX+1]; > > char tag[SMTPD_TAG_SIZE]; > > @@ -483,9 +483,9 @@ struct envelope { > uint64_t id; > enum envelope_flags flags; > > - char smtpname[HOST_NAME_MAX+1]; > - char helo[HOST_NAME_MAX+1]; > - char hostname[HOST_NAME_MAX+1]; > + char smtpname[SMTPD_HOST_NAME_MAX+1]; > + char helo[SMTPD_HOST_NAME_MAX+1]; > + char hostname[SMTPD_HOST_NAME_MAX+1]; > char username[SMTPD_MAXMAILADDRSIZE]; > char errorline[LINE_MAX]; > struct sockaddr_storage ss; > @@ -531,7 +531,7 @@ struct listener { > char ca_name[PATH_MAX]; > char tag[SMTPD_TAG_SIZE]; > char authtable[LINE_MAX]; > - char hostname[HOST_NAME_MAX+1]; > + char hostname[SMTPD_HOST_NAME_MAX+1]; > char hostnametable[PATH_MAX]; > char sendertable[PATH_MAX]; > > @@ -593,7 +593,7 @@ struct smtpd { > int sc_ttl; > #define MAX_BOUNCE_WARN 4 > time_t sc_bounce_warn[MAX_BOUNCE_WARN]; > - char sc_hostname[HOST_NAME_MAX+1]; > + char sc_hostname[SMTPD_HOST_NAME_MAX+1]; > struct stat_backend *sc_stat; > struct compress_backend *sc_comp; > > blob - ef719264f7191cf2c2f3ed55aa913cac004a4cde > file + ssl.c > --- ssl.c > +++ ssl.c > @@ -27,6 +27,7 @@ > #include > #include > > +#include "smtpd-defines.h" > #include "log.h" > #include "ssl.h" > > blob - ced63ebd6d4aa93c1b002ab77157cc6339c101f2 > file + ssl.h > --- ssl.h > +++ ssl.h > @@ -16,7 +16,7 @@ > */ > > struct pki { > - char pki_name[HOST_NAME_MAX+1]; > + char pki_name[SMTPD_HOST_NAME_MAX+1]; > > char *pki_cert_file; > char *pki_cert; > @@ -30,7 +30,7 @@ struct pki { > }; > > struct ca { > - char ca_name[HOST_NAME_MAX+1]; > + char ca_name[SMTPD_HOST_NAME_MAX+1]; > > char *ca_cert_file; > char *ca_cert; > -- In my defence, I have been left unsupervised.