time_t GetDate(const uni_char* date_str) { struct tm gmt_time; if (GetTmDate(date_str, gmt_time)) { if (gmt_time.tm_year < 70 || (gmt_time.tm_year == 70 && (gmt_time.tm_mon <= 0 || gmt_time.tm_mday < 1 || (gmt_time.tm_hour == 0 && gmt_time.tm_min == 0 && gmt_time.tm_sec == 0))) ) return 1; /* Avoid overflowing time functions: A four-digit time_t wraps * after 2037; a eight-digit time_t overflows a 32-bit signed * int for time formatting in the year 2147483647 (0x7FFFFFFF), * which adjusted for the 1900 offset is 0x7FFFF893 */ static const int max_tm_year = sizeof (time_t) == 4 ? 136 : 0x7FFFF893; if(gmt_time.tm_year > max_tm_year) gmt_time.tm_year = max_tm_year; time_t ret_time = op_timegm(&gmt_time); if ((long)ret_time == -1) return 0; return ret_time; } return 0; }
time_t ParseDate(char *date_string) { #ifdef _OPENWAVE struct op_tm tm; if (op_time_parse_http_date(date_string, &tm)) { return op_timegm(&tm); } return 0; #else struct tm time_info; // Points to static tm structure char* ip = NULL; char mname[256] = {0}; /* Flawfinder: ignore */ time_t rv; memset(&time_info, 0, sizeof(struct tm)); // Whatever format we're looking at, it will start with weekday. // Skip to first space if(!(ip = strchr(date_string,' '))) { return 0; } else { while(IS_SPACE(*ip)) { ++ip; } } /* make sure that the date is less than 256 * That will keep mname from ever overflowing */ if(255 < strlen(ip)) { return 0; } if(isalpha(*ip)) { // ctime sscanf(ip, (strstr(ip, "DST") ? "%s %d %d:%d:%d %*s %d" : "%s %d %d:%d:%d %d"), mname, &time_info.tm_mday, &time_info.tm_hour, &time_info.tm_min, &time_info.tm_sec, &time_info.tm_year); time_info.tm_year -= 1900; } else if(ip[2] == '-') { // RFC 850 (normal HTTP) char t[256] = {0}; /* Flawfinder: ignore */ sscanf(ip,"%s %d:%d:%d", t, &time_info.tm_hour, &time_info.tm_min, &time_info.tm_sec); t[2] = '\0'; time_info.tm_mday = atoi(t); t[6] = '\0'; SafeStrCpy(mname, &t[3], 256); time_info.tm_year = atoi(&t[7]); // Prevent wraparound from ambiguity if(time_info.tm_year < 70) { time_info.tm_year += 100; } else if(time_info.tm_year > 1900) { time_info.tm_year -= 1900; } } else { // RFC 822 sscanf(ip,"%d %s %d %d:%d:%d",&time_info.tm_mday, mname, &time_info.tm_year, &time_info.tm_hour, &time_info.tm_min, &time_info.tm_sec); // since tm_year is years since 1900 and the year we parsed // is absolute, we need to subtract 1900 years from it time_info.tm_year -= 1900; } time_info.tm_mon = MonthNo(mname); if(time_info.tm_mon == -1) { return 0; } rv = mktime(&time_info); #ifndef NO_TM_ISDST if(time_info.tm_isdst) { rv -= 3600; } #endif /* NO_TM_ISDST */ if(rv == -1) { return(0); } else { return(rv); } #endif /* _OPENWAVE */ }