Re: rdate gets pledge error with -c option

Mark Kettenis <[email protected]> Sun, 26 Apr 2026 11:09:56 +0200
Newsgroups gmane.os.openbsd.bugs
Message-ID <[email protected]>
> Date: Sun, 26 Apr 2026 13:10:44 +1000
> From: David Leadbeater <[email protected]>
> 
> On Wed, Apr 22, 2026 at 09:39:08AM -0600, Todd C. Miller wrote:
> > On Wed, 22 Apr 2026 11:03:23 +1000, David Leadbeater wrote:
> > 
> > > This is because ntp.c attempts to open /usr/share/zoneinfo/right/UTC.
> > > The following fixes the pledge issues. Although I don't know where
> > > /usr/share/zoneinfo/right/ is supposed to come from and strangely I
> > > don't see an error from failing to open this.
> > 
> > We don't install /usr/share/zoneinfo/right by default.  Like most
> > systems, we just install the POSIX zoneinfo files and not the vesion
> > that counts leap seconds.
> > 
> > Since the rdate -c option won't work with the default install, is
> > there any reason to keep it?
> 
> Here is a diff making -c a noop.

I think -c should be completely removed, If somebody actually has a
valid reason to use that option their time will jump by 27 seconds if
you make -c a noop.

Not that I believe anybody has a valid reason to use -c.

> I have left ntpleaps.h here, two macros from it are needed. I think
> this could be cleaned up, but this diff keeps the removal simple as
> a candidate for release.
> 
> 
> diff --git usr.sbin/rdate/Makefile usr.sbin/rdate/Makefile
> index 2ca709ac1b2..5f0e619d8b7 100644
> --- usr.sbin/rdate/Makefile
> +++ usr.sbin/rdate/Makefile
> @@ -1,7 +1,7 @@
>  #	$OpenBSD: Makefile,v 1.8 2026/03/27 14:33:58 deraadt Exp $
>  
>  PROG=	rdate
> -SRCS=	rdate.c ntp.c ntpleaps.c
> +SRCS=	rdate.c ntp.c
>  CFLAGS+=-Wall
>  DPADD+= ${LIBUTIL}
>  LDADD+= -lutil
> diff --git usr.sbin/rdate/ntp.c usr.sbin/rdate/ntp.c
> index 4aed956d62f..7107082872c 100644
> --- usr.sbin/rdate/ntp.c
> +++ usr.sbin/rdate/ntp.c
> @@ -120,7 +120,7 @@ struct ntp_data {
>  	u_int64_t	xmitck;
>  };
>  
> -void	ntp_client(const char *, int, struct timeval *, struct timeval *, int);
> +void	ntp_client(const char *, int, struct timeval *, struct timeval *);
>  int	sync_ntp(int, const struct sockaddr *, double *, double *);
>  int	write_packet(int, struct ntp_data *);
>  int	read_packet(int, struct ntp_data *, double *, double *);
> @@ -132,11 +132,9 @@ void	create_timeval(double, struct timeval *, struct timeval *);
>  void	print_packet(const struct ntp_data *);
>  #endif
>  
> -int	corrleaps;
> -
>  void
>  ntp_client(const char *hostname, int family, struct timeval *new,
> -    struct timeval *adjust, int leapflag)
> +    struct timeval *adjust)
>  {
>  	struct addrinfo hints, *res0, *res;
>  	double offset, error;
> @@ -154,10 +152,6 @@ ntp_client(const char *hostname, int family, struct timeval *new,
>  	if (pledge("stdio inet", NULL) == -1)
>  		err(1, "pledge");
>  
> -	corrleaps = leapflag;
> -	if (corrleaps)
> -		ntpleaps_init();
> -
>  	s = -1;
>  	for (res = res0; res; res = res->ai_next) {
>  		s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
> @@ -458,8 +452,6 @@ current_time(double offset)
>  	 */
>  
>  	t = SEC_TO_TAI64(current.tv_sec);
> -	if (corrleaps)
> -		ntpleaps_sub(&t);
>  
>  	return (offset + TAI64_TO_SEC(t) + 1.0e-6 * current.tv_usec);
>  }
> diff --git usr.sbin/rdate/rdate.8 usr.sbin/rdate/rdate.8
> index 08d3c645f2d..a6682a21335 100644
> --- usr.sbin/rdate/rdate.8
> +++ usr.sbin/rdate/rdate.8
> @@ -55,10 +55,6 @@ Use the
>  .Xr adjtime 2
>  call to gradually skew the local time to the
>  remote time rather than just hopping.
> -.It Fl c
> -Correct leap seconds.
> -This should be used only when synchronizing to a server
> -which does not correctly account for leap seconds.
>  .It Fl n
>  Use SNTP (RFC 5905).
>  This is the default.
> diff --git usr.sbin/rdate/rdate.c usr.sbin/rdate/rdate.c
> index e6c77711b4d..2e7dd9534e6 100644
> --- usr.sbin/rdate/rdate.c
> +++ usr.sbin/rdate/rdate.c
> @@ -52,7 +52,7 @@
>  #define logwtmp(a,b,c)
>  #endif
>  
> -void ntp_client(const char *, int, struct timeval *, struct timeval *, int);
> +void ntp_client(const char *, int, struct timeval *, struct timeval *);
>  
>  extern char    *__progname;
>  __dead void	usage(void);
> @@ -66,7 +66,7 @@ struct {
>  __dead void
>  usage(void)
>  {
> -	(void) fprintf(stderr, "usage: %s [-46acnpsv] host\n", __progname);
> +	(void) fprintf(stderr, "usage: %s [-46anpsv] host\n", __progname);
>  	exit(1);
>  }
>  
> @@ -74,7 +74,7 @@ int
>  main(int argc, char **argv)
>  {
>  	int             pr = 0, silent = 0, verbose = 0;
> -	int		slidetime = 0, corrleaps = 0;
> +	int		slidetime = 0;
>  	char           *hname;
>  	int             c, p[2], pid;
>  	int		family = PF_UNSPEC;
> @@ -106,7 +106,7 @@ main(int argc, char **argv)
>  			break;
>  
>  		case 'c':
> -			corrleaps = 1;
> +			/* noop */
>  			break;
>  
>  		case 'v':
> @@ -144,8 +144,7 @@ main(int argc, char **argv)
>  		setvbuf(stdout, NULL, _IOFBF, 0);
>  		setvbuf(stderr, NULL, _IOFBF, 0);
>  
> -		ntp_client(hname, family, &pdata.new,
> -		    &pdata.adjust, corrleaps);
> +		ntp_client(hname, family, &pdata.new, &pdata.adjust);
>  
>  		if (write(STDOUT_FILENO, &pdata, sizeof pdata) != sizeof pdata)
>  			exit(1);
> 
>