mailing list of musl libc
 help / color / mirror / code / Atom feed
From: Rich Felker <dalias@libc.org>
To: musl@lists.openwall.com
Subject: Re: [PATCH] strptime: add basic support for '%s' (seconds since epoch)
Date: Sun, 15 Jul 2018 20:11:16 -0400	[thread overview]
Message-ID: <20180716001116.GL1392@brightrain.aerifal.cx> (raw)
In-Reply-To: <CAKGWAO-gYuwiGjaXM_s6OYeKa_nosGQeJtRPqK51Szhdo3-E5g@mail.gmail.com>

On Sat, Jul 14, 2018 at 10:14:50PM -0500, Will Dietz wrote:
> Attached.
> 
> Background/context:
> 
> * http://www.openwall.com/lists/musl/2018/01/18/4

This message has some context on how %s is problematic, especially
with regard to the question of interpreting it with respect to a
timezone, which is happening here in your patch.

> * http://austingroupbugs.net/view.php?id=169#c283
> 
> Seems to work on basic usage, but has not yet been thoroughly tested/vetted.
> Sharing in case useful / good starting point regardless ;).
> 
> Also available on github:
> https://github.com/dtzWill/musl/tree/feature/strptime-s-fmt
> 
> ~Will

> From 8cc60ad0d982d2ef04c062372e1a459e984da22d Mon Sep 17 00:00:00 2001
> From: Will Dietz <w@wdtz.org>
> Date: Wed, 11 Jul 2018 13:08:22 -0500
> Subject: [PATCH] strptime: add basic support for '%s' (seconds since epoch)
> 
> ---
>  src/time/strptime.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/src/time/strptime.c b/src/time/strptime.c
> index c54a0d8c..bec00368 100644
> --- a/src/time/strptime.c
> +++ b/src/time/strptime.c
> @@ -5,6 +5,9 @@
>  #include <stddef.h>
>  #include <string.h>
>  #include <strings.h>
> +#include "time_impl.h"
> +
> +struct tm *__localtime_r(const time_t *restrict, struct tm *restrict);
>  
>  char *strptime(const char *restrict s, const char *restrict f, struct tm *restrict tm)
>  {
> @@ -119,6 +122,15 @@ char *strptime(const char *restrict s, const char *restrict f, struct tm *restri
>  			min = 0;
>  			range = 61;
>  			goto numeric_range;
> +		case 's':
> +			if (!isdigit(*s)) return 0;
> +			else {

The else seems spurious and weirdly formatted.

> +				char *new_s;
> +				time_t t = strtoull(s, &new_s, 10);

Directly assigning to time_t precludes handling out-of-range values in
any meaningful way. I think we need to both check for overflow in
strtoull, and check that the value fits in time_t. Also it should
probably be signed and accept negative values, but I'm not sure.

It seems like we don't handle this well anywhere else in strptime, but
maybe field width limits avoid the overflow issue there.

> +				s = new_s;
> +				if (!__localtime_r(&t, tm)) return 0;
> +			}

This looks okay modulo my inherent concern about %s vs time zones, but
I don't think there's any better way it can be done...

Rich


  reply	other threads:[~2018-07-16  0:11 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-15  3:14 Will Dietz
2018-07-16  0:11 ` Rich Felker [this message]
2018-07-16 19:41   ` Will Dietz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180716001116.GL1392@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=musl@lists.openwall.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/musl/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).