am 4e57cf3f: Merge change 24463 into eclair

Merge commit '4e57cf3f8c0b696f117579c8165b13c8d32b9b5d' into eclair-plus-aosp

* commit '4e57cf3f8c0b696f117579c8165b13c8d32b9b5d':
  Fix an infinite loop in time2sub.
This commit is contained in:
David 'Digit' Turner 2009-09-09 18:01:11 -07:00 committed by Android Git Automerger
commit 0dfd94cff4
1 changed files with 47 additions and 12 deletions

View File

@ -75,6 +75,31 @@ static __inline__ void _tzUnlock(void)
pthread_mutex_unlock(&_tzMutex); pthread_mutex_unlock(&_tzMutex);
} }
/* Complex computations to determine the min/max of time_t depending
* on TYPE_BIT / TYPE_SIGNED / TYPE_INTEGRAL.
* These macros cannot be used in pre-processor directives, so we
* let the C compiler do the work, which makes things a bit funky.
*/
static const time_t TIME_T_MAX =
TYPE_INTEGRAL(time_t) ?
( TYPE_SIGNED(time_t) ?
~((time_t)1 << (TYPE_BIT(time_t)-1))
:
~(time_t)0
)
: /* if time_t is a floating point number */
( sizeof(time_t) > sizeof(float) ? (time_t)DBL_MAX : (time_t)FLT_MAX );
static const time_t TIME_T_MIN =
TYPE_INTEGRAL(time_t) ?
( TYPE_SIGNED(time_t) ?
((time_t)1 << (TYPE_BIT(time_t)-1))
:
0
)
:
( sizeof(time_t) > sizeof(float) ? (time_t)DBL_MIN : (time_t)FLT_MIN );
#ifndef WILDABBR #ifndef WILDABBR
/* /*
** Someone might make incorrect use of a time zone abbreviation: ** Someone might make incorrect use of a time zone abbreviation:
@ -1683,11 +1708,16 @@ increment_overflow(number, delta)
int * number; int * number;
int delta; int delta;
{ {
int number0; unsigned number0 = (unsigned)*number;
unsigned number1 = (unsigned)(number0 + delta);
number0 = *number; *number = (int)number1;
*number += delta;
return (*number < number0) != (delta < 0); if (delta >= 0) {
return ((int)number1 < (int)number0);
} else {
return ((int)number1 > (int)number0);
}
} }
static int static int
@ -1695,11 +1725,16 @@ long_increment_overflow(number, delta)
long * number; long * number;
int delta; int delta;
{ {
long number0; unsigned long number0 = (unsigned long)*number;
unsigned long number1 = (unsigned long)(number0 + delta);
number0 = *number; *number = (long)number1;
*number += delta;
return (*number < number0) != (delta < 0); if (delta >= 0) {
return ((long)number1 < (long)number0);
} else {
return ((long)number1 > (long)number0);
}
} }
static int static int
@ -1868,14 +1903,14 @@ const int do_norm_secs;
} else dir = tmcomp(&mytm, &yourtm); } else dir = tmcomp(&mytm, &yourtm);
if (dir != 0) { if (dir != 0) {
if (t == lo) { if (t == lo) {
++t; if (t == TIME_T_MAX)
if (t <= lo)
return WRONG; return WRONG;
++t;
++lo; ++lo;
} else if (t == hi) { } else if (t == hi) {
--t; if (t == TIME_T_MIN)
if (t >= hi)
return WRONG; return WRONG;
--t;
--hi; --hi;
} }
if (lo > hi) if (lo > hi)