| diff -ruN htpdate/htpdate.c htpdate.new/htpdate.c |
| --- htpdate/htpdate.c 2010-10-13 17:19:57.000000000 -0700 |
| +++ new/htpdate.c 2010-10-13 17:16:06.000000000 -0700 |
| @@ -301,9 +301,23 @@ static long getHTTPdate( char *host, cha |
| return 0; |
| } |
| |
| +static int is_before_build_time(time_t time) |
| +{ |
| + time_t build_time; |
| + /* Is the given time before the build time? */ |
| + /* If no build date given, default to 0 (01 Jan 1970) */ |
| +#ifdef BUILD_TIME_UTC |
| + build_time = BUILD_TIME_UTC; |
| +#else |
| + build_time = 0; |
| +#endif |
| + return time < build_time; |
| +} |
| |
| static int setclock( double timedelta, int setmode ) { |
| - struct timeval timeofday; |
| + struct timeval timediff; /* Change in time (case 1 */ |
| + struct timeval timeofday; /* Actual time of day (case 2) */ |
| + double target_time; /* Time to adjust clock to, in sec */ |
| |
| if ( timedelta == 0 ) { |
| printlog( 0, "No time correction needed" ); |
| @@ -317,8 +331,20 @@ static int setclock( double timedelta, i |
| return(0); |
| |
| case 1: /* Adjust time smoothly */ |
| - timeofday.tv_sec = (long)timedelta; |
| - timeofday.tv_usec = (long)((timedelta - timeofday.tv_sec) * 1000000); |
| + timediff.tv_sec = (long)timedelta; |
| + timediff.tv_usec = (long)((timedelta - timediff.tv_sec) * 1000000); |
| + |
| + /* Check against build time */ |
| + gettimeofday( &timeofday, NULL ); |
| + target_time = timedelta + (double)timeofday.tv_sec + 1e-6 * timeofday.tv_usec; |
| + |
| + timeofday.tv_sec = (long)target_time; |
| + timeofday.tv_usec = (long)((target_time - timeofday.tv_sec) * 1000000); |
| + |
| + if (is_before_build_time(timeofday.tv_sec)) { |
| + printlog(1, "Cannot set time to be before build time."); |
| + return (-1); |
| + } |
| |
| printlog( 0, "Adjusting %.3f seconds", timedelta ); |
| |
| @@ -327,17 +353,22 @@ static int setclock( double timedelta, i |
| printlog( 1, "seteuid()" ); |
| exit(1); |
| } else { |
| - return( adjtime(&timeofday, NULL) ); |
| + return( adjtime(&timediff, NULL) ); |
| } |
| |
| case 2: /* Set time */ |
| printlog( 0, "Setting %.3f seconds", timedelta ); |
| |
| gettimeofday( &timeofday, NULL ); |
| - timedelta += ( timeofday.tv_sec + timeofday.tv_usec*1e-6 ); |
| + target_time = timedelta + (double)timeofday.tv_sec + 1e-6 * timeofday.tv_usec; |
| |
| - timeofday.tv_sec = (long)timedelta; |
| - timeofday.tv_usec = (long)(timedelta - timeofday.tv_sec) * 1000000; |
| + timeofday.tv_sec = (long)target_time; |
| + timeofday.tv_usec = (long)((target_time - timeofday.tv_sec) * 1000000); |
| + |
| + if (is_before_build_time(timeofday.tv_sec)) { |
| + printlog(1, "Cannot set time to be before build time."); |
| + return (-1); |
| + } |
| |
| printlog( 0, "Set: %s", asctime(localtime(&timeofday.tv_sec)) ); |
| |