Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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 */
}