From 33dbb0a6309129182f85ad9f82c7e7e5a9d2aa6c Mon Sep 17 00:00:00 2001 From: Sheldon Hearn Date: Wed, 10 Nov 1999 14:40:59 +0000 Subject: [PATCH] Decremement by 1 the value taken for %j before assigning it to tm_yday, which is zero-based. Correct the range checking for the value taken for %S. Add %w for the day of the week (0-6). Accept (but do nothing with) %U and %W. The comment for this change was taken from NetBSD. These changes were made after several failed attempts to contact the author of our strptime.c . PR: 10131 Submitted by: tadf@kt.rim.or.jp (Tadayoshi Funaba) --- lib/libc/stdtime/strptime.c | 56 +++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/lib/libc/stdtime/strptime.c b/lib/libc/stdtime/strptime.c index 7f2de92047e8..f9a385514e62 100644 --- a/lib/libc/stdtime/strptime.c +++ b/lib/libc/stdtime/strptime.c @@ -171,10 +171,10 @@ _strptime(const char *buf, const char *fmt, struct tm *tm) i *= 10; i += *buf - '0'; } - if (i > 365) + if (i < 1 || i > 366) return 0; - tm->tm_yday = i; + tm->tm_yday = i - 1; break; case 'M': @@ -189,13 +189,16 @@ _strptime(const char *buf, const char *fmt, struct tm *tm) i *= 10; i += *buf - '0'; } - if (i > 59) - return 0; - if (c == 'M') + if (c == 'M') { + if (i > 59) + return 0; tm->tm_min = i; - else + } else { + if (i > 60) + return 0; tm->tm_sec = i; + } if (*buf != 0 && isspace((unsigned char)*buf)) while (*ptr != 0 && !isspace((unsigned char)*ptr)) @@ -271,6 +274,47 @@ _strptime(const char *buf, const char *fmt, struct tm *tm) buf += len; break; + case 'U': + case 'W': + /* + * XXX This is bogus, as we can not assume any valid + * information present in the tm structure at this + * point to calculate a real value, so just check the + * range for now. + */ + if (!isdigit((unsigned char)*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) { + i *= 10; + i += *buf - '0'; + } + if (i > 53) + return 0; + + if (*buf != 0 && isspace((unsigned char)*buf)) + while (*ptr != 0 && !isspace((unsigned char)*ptr)) + ptr++; + break; + + case 'w': + if (!isdigit((unsigned char)*buf)) + return 0; + + for (i = 0; *buf != 0 && isdigit((unsigned char)*buf); buf++) { + i *= 10; + i += *buf - '0'; + } + if (i > 6) + return 0; + + tm->tm_wday = i; + + if (*buf != 0 && isspace((unsigned char)*buf)) + while (*ptr != 0 && !isspace((unsigned char)*ptr)) + ptr++; + break; + case 'd': case 'e': if (!isdigit((unsigned char)*buf))