[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] hvm: Handle extreme wallclock offsets safely.
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1274857192 -3600 # Node ID 459f35d8cac4f19e6eae0a7396f6c97e20ae955c # Parent 145c822dd629160219676a39fda4d7dc26763508 hvm: Handle extreme wallclock offsets safely. When a VM's wallclock offset is negative enough, gmtime() can be called with an underflowed uint64, which it then tries to divide into years by subtraction. Handle the input as a 40-bit signed integer instead. Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx> --- xen/common/time.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletion(-) diff -r 145c822dd629 -r 459f35d8cac4 xen/common/time.c --- a/xen/common/time.c Wed May 26 07:48:09 2010 +0100 +++ b/xen/common/time.c Wed May 26 07:59:52 2010 +0100 @@ -42,6 +42,18 @@ struct tm gmtime(unsigned long t) int y; const unsigned short int *ip; + y = 1970; +#ifdef __x86_64__ + /* Allow the concept of time before 1970. 64-bit only; for 32-bit + * time after 2038 seems more important than time before 1970. */ + while ( t & (1UL<<39) ) + { + y -= 400; + t += ((unsigned long)(365 * 303 + 366 * 97)) * SECS_PER_DAY; + } + t &= (1UL << 40) - 1; +#endif + days = t / SECS_PER_DAY; rem = t % SECS_PER_DAY; @@ -53,7 +65,6 @@ struct tm gmtime(unsigned long t) tbuf.tm_wday = (4 + days) % 7; if ( tbuf.tm_wday < 0 ) tbuf.tm_wday += 7; - y = 1970; while ( days >= (rem = __isleap(y) ? 366 : 365) ) { ++y; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |