Index | Thread | Search

From:
Florian Obser <florian@openbsd.org>
Subject:
Re: smtpd: spell HOST_NAME_MAX differently (for -portable)
To:
Omar Polo <op@omarpolo.com>
Cc:
tech@openbsd.org, gilles@poolp.org
Date:
Tue, 20 Aug 2024 14:49:06 +0200

Download raw body.

Thread
On 2024-08-20 12:40 +02, Omar Polo <op@omarpolo.com> 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]: <https://github.com/OpenSMTPD/OpenSMTPD/pull/1260>
>
> 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 <time.h>
>  #include <unistd.h>
>  
> +#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 <string.h>
>  #include <unistd.h>
>  
> +#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.