Module Name: src Committed By: ginsbach Date: Wed Jul 29 20:32:54 UTC 2015
Modified Files: src/lib/libc/time: strptime.c Log Message: Only apply am/pm adjustment to tm_hour when it has actually been parsed. To generate a diff of this commit: cvs rdiff -u -r1.47 -r1.48 src/lib/libc/time/strptime.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/time/strptime.c diff -u src/lib/libc/time/strptime.c:1.47 src/lib/libc/time/strptime.c:1.48 --- src/lib/libc/time/strptime.c:1.47 Wed Jul 22 13:33:59 2015 +++ src/lib/libc/time/strptime.c Wed Jul 29 20:32:54 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: strptime.c,v 1.47 2015/07/22 13:33:59 ginsbach Exp $ */ +/* $NetBSD: strptime.c,v 1.48 2015/07/29 20:32:54 ginsbach Exp $ */ /*- * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: strptime.c,v 1.47 2015/07/22 13:33:59 ginsbach Exp $"); +__RCSID("$NetBSD: strptime.c,v 1.48 2015/07/29 20:32:54 ginsbach Exp $"); #endif #include "namespace.h" @@ -70,12 +70,14 @@ static const u_char *find_string(const u #define S_YDAY (1 << 2) #define S_MDAY (1 << 3) #define S_WDAY (1 << 4) +#define S_HOUR (1 << 5) #define HAVE_MDAY(s) (s & S_MDAY) #define HAVE_MON(s) (s & S_MON) #define HAVE_WDAY(s) (s & S_WDAY) #define HAVE_YDAY(s) (s & S_YDAY) #define HAVE_YEAR(s) (s & S_YEAR) +#define HAVE_HOUR(s) (s & S_HOUR) static char gmt[] = { "GMT" }; static char utc[] = { "UTC" }; @@ -262,6 +264,7 @@ literal: case 'H': bp = conv_num(bp, &tm->tm_hour, 0, 23); LEGAL_ALT(ALT_O); + state |= S_HOUR; continue; case 'l': /* The hour (12-hour clock representation). */ @@ -272,6 +275,7 @@ literal: if (tm->tm_hour == 12) tm->tm_hour = 0; LEGAL_ALT(ALT_O); + state |= S_HOUR; continue; case 'j': /* The day of year. */ @@ -298,7 +302,7 @@ literal: case 'p': /* The locale's equivalent of AM/PM. */ bp = find_string(bp, &i, _TIME_LOCALE(loc)->am_pm, NULL, 2); - if (tm->tm_hour > 11) + if (HAVE_HOUR(state) && tm->tm_hour > 11) return NULL; tm->tm_hour += i * 12; LEGAL_ALT(0);