-const char parsers_rcs[] = "$Id: parsers.c,v 1.228 2011/09/04 11:31:17 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.232 2011/09/04 11:33:50 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
static jb_err parse_header_time(const char *header_time, time_t *result)
{
struct tm gmt;
- static const char *time_formats[] = {
+ /*
+ * Checking for two-digit years first in an
+ * attempt to work around GNU libc's strptime()
+ * reporting negative year values when using %Y.
+ */
+ static const char * const time_formats[] = {
+ /* Tue, 02-Jun-37 20:00:00 */
+ "%a, %d-%b-%y %H:%M:%S",
/* Tue, 02 Jun 2037 20:00:00 */
"%a, %d %b %Y %H:%M:%S",
/* Tue, 02-Jun-2037 20:00:00 */
"%a, %d-%b-%Y %H:%M:%S",
- /* Tue, 02-Jun-37 20:00:00 */
- "%a, %d-%b-%y %H:%M:%S",
/* Tuesday, 02-Jun-2037 20:00:00 */
"%A, %d-%b-%Y %H:%M:%S",
/* Tuesday Jun 02 20:00:00 2037 */
};
unsigned int i;
- /*
- * Zero out gmt to prevent time zone offsets.
- * Documented to be required for GNU libc.
- */
- memset(&gmt, 0, sizeof(gmt));
-
for (i = 0; i < SZ(time_formats); i++)
{
+ /*
+ * Zero out gmt to prevent time zone offsets.
+ * Documented to be required for GNU libc.
+ */
+ memset(&gmt, 0, sizeof(gmt));
+
if (NULL != strptime(header_time, time_formats[i], &gmt))
{
+ /* Sanity check for GNU libc. */
+ if (gmt.tm_year < 0)
+ {
+ log_error(LOG_LEVEL_HEADER,
+ "Failed to parse '%s' using '%s'. Moving on.",
+ header_time, time_formats[i]);
+ continue;
+ }
*result = timegm(&gmt);
return JB_ERR_OK;
}