Date: Wed, 22 Sep 1999 11:36:33 -0400 From: scott <scott@chronis.pobox.com> To: freebsd-stable@freebsd.org Subject: strptime bug? Message-ID: <19990922113633.A15733@chronis.pobox.com>
next in thread | raw e-mail | index | archive | help
I have a number of dates in YYYYMMDD format (eg 19990922), and am
using strptime to parse them, but it's not working:
#include <stdio.h>
#include <time.h>
int main(int argc, char * argv[]) {
struct tm t;
char * foo;
foo = strptime("19991023", "%Y%m %d", &t);
if (foo == NULL)
printf("foo is NULL!\n");
else
printf("foo: '%s'\n", foo);
printf("tm.tm_year: %d tm.tm_month: %d tm.tm_mday: %d\n", t.tm_year, t.tm_mon, t.tm_mday);
return 0;
}
this prints out:
0922 11:17 chronis:libc/stdtime# /tmp/t
foo: ''
tm.tm_year: 19989123 tm.tm_month: 671465728 tm.tm_mday: -1077945476
0922 11:17 chronis:libc/stdtime#
(BTW)
0922 11:34 chronis:login/pay% uname -a
FreeBSD chronis.pobox.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Sep 20
09:58:31 EDT 1999 root@chronis.pobox.com:/usr/src/sys/compile/MYBSD i386
So I took a closer look at the code for strptime in
/usr/src/lib/libc/stdtime/strptime.c and found what appears to be the
problem. Below is a snippit from when the code evaluates a format for
year ('%y') (or year including century '%Y').
case 'y':
if (*buf == 0 || isspace((unsigned char)*buf))
break;
if (!isdigit((unsigned char)*buf))
return 0;
for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) {
i *= 10;
i += *buf - '0';
}
if (c == 'Y')
i -= 1900;
if (c == 'y' && i < 69)
i += 100;
if (i < 0)
return 0;
tm->tm_year = i;
if (*buf != 0 && isspace((unsigned char)*buf))
while (*ptr != 0 && !isspace((unsigned char)*ptr))
ptr++;
break;
The problem appears to be that the for (1 = 0... loop isn't terminated
after the maximum of 4 digits. While one may argue that years can be
> 9999, I think it's safe to say all this will change before that
becomes relevant. Additionally, the check for month ('%m'), isn't
bounded at 2 digits, and there should never be more than 12 months.
In my opinion, these checks against a maximum number of digits should
be done. If there's a consensus on this, I'll post a patch for the
maintainers, otherwise, I'll either have to learn to live with this
deficiency, or patch my own systems.
Apologies if this has been discussed before, a quick search of the
archives didn't turn up anything directly relevant.
scott
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990922113633.A15733>
