Re: date & touch: timegm/mktime checks

Florian Obser <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
reads correct, OK florian
On 2026-06-21 10:11 +02, Theo Buehler <[email protected]> wrote:
> Another bunch of straightforward changes. The checks in touch don't make
> that code prettier, though.
>
> Index: bin/date/date.c
> ===================================================================
> RCS file: /cvs/src/bin/date/date.c,v
> diff -u -p -r1.60 date.c
> --- bin/date/date.c	28 Apr 2024 16:43:15 -0000	1.60
> +++ bin/date/date.c	21 Jun 2026 08:03:07 -0000
> @@ -223,11 +223,12 @@ setthetime(char *p, const char *pformat)
>  	}
>  
>  	/* convert broken-down time to UTC clock time */
> +	lt->tm_wday = -1;
>  	if (pformat != NULL && strstr(pformat, "%s") != NULL)
>  		tval = timegm(lt);
>  	else
>  		tval = mktime(lt);
> -	if (tval == -1)
> +	if (tval == -1 && lt->tm_wday == -1)
>  		errx(1, "specified date is outside allowed range");
>  
>  	if (jflag)
> Index: usr.bin/touch/touch.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/touch/touch.c,v
> diff -u -p -r1.27 touch.c
> --- usr.bin/touch/touch.c	29 Jan 2022 00:06:26 -0000	1.27
> +++ usr.bin/touch/touch.c	21 Jun 2026 08:06:55 -0000
> @@ -223,8 +223,9 @@ stime_arg1(char *arg, struct timespec *t
>  	}
>  
>  	lt->tm_isdst = -1;		/* Figure out DST. */
> +	lt->tm_wday = -1;
>  	tsp[0].tv_sec = tsp[1].tv_sec = mktime(lt);
> -	if (tsp[0].tv_sec == -1)
> +	if (tsp[0].tv_sec == -1 && lt->tm_wday == -1)
>  terr:		errx(1,
>  	"out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]");
>  
> @@ -264,8 +265,9 @@ stime_arg2(char *arg, int year, struct t
>  	lt->tm_sec = 0;
>  
>  	lt->tm_isdst = -1;		/* Figure out DST. */
> +	lt->tm_wday = -1;
>  	tsp[0].tv_sec = tsp[1].tv_sec = mktime(lt);
> -	if (tsp[0].tv_sec == -1)
> +	if (tsp[0].tv_sec == -1 && lt->tm_wday == -1)
>  terr:		errx(1,
>  	"out of range or illegal time specification: MMDDhhmm[YY]");
>  
> @@ -323,8 +325,9 @@ stime_argd(char *arg, struct timespec *t
>  		goto terr;
>  
>  	tm.tm_isdst = -1;
> +	tm.tm_wday = -1;
>  	tsp[0].tv_sec = utc ? timegm(&tm) : mktime(&tm);
> -	if (tsp[0].tv_sec == -1)
> +	if (tsp[0].tv_sec == -1 && tm.tm_wday == -1)
>  terr:		errx(1,
>    "out of range or illegal time specification: YYYY-MM-DDThh:mm:ss[.frac][Z]");
>  	tsp[1] = tsp[0];
>

-- 
In my defence, I have been left unsupervised.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.