From 9c2b84d84965bc8a3f519f2cd4104df26e855e0f Mon Sep 17 00:00:00 2001 From: Paulo Matos Date: Mon, 23 Mar 2020 17:13:25 +0100 Subject: [PATCH] Change return type of rktio_get_milliseconds to be unsigned This fixes a major issue in arm 32bits, detected by ubsan, where conversion of type to milliseconds results in overflow. ``` rktio_time.c:92:21: runtime error: signed integer overflow: 1584975753 * 1000 cannot be represented in type 'long int' ``` --- racket/src/racket/include/mzwin.def | 1 + racket/src/racket/include/mzwin3m.def | 1 + racket/src/racket/include/racket.exp | 1 + racket/src/racket/include/racket3m.exp | 1 + racket/src/racket/src/fun.c | 7 ++++--- racket/src/racket/src/schemef.h | 2 +- racket/src/racket/src/schemex.h | 3 ++- racket/src/racket/src/schemex.inc | 1 + racket/src/racket/src/schemexm.h | 1 + racket/src/rktio/rktio.h | 2 +- racket/src/rktio/rktio_time.c | 4 ++-- 11 files changed, 16 insertions(+), 8 deletions(-) diff --git a/racket/src/racket/include/mzwin.def b/racket/src/racket/include/mzwin.def index 066584fa8a..9bf64b323f 100644 --- a/racket/src/racket/include/mzwin.def +++ b/racket/src/racket/include/mzwin.def @@ -105,6 +105,7 @@ EXPORTS scheme_warning scheme_raise scheme_log_level_p + scheme_log_level_topic_p scheme_log scheme_log_w_data scheme_log_message diff --git a/racket/src/racket/include/mzwin3m.def b/racket/src/racket/include/mzwin3m.def index e0c174dbd0..c41aeca84f 100644 --- a/racket/src/racket/include/mzwin3m.def +++ b/racket/src/racket/include/mzwin3m.def @@ -105,6 +105,7 @@ EXPORTS scheme_warning scheme_raise scheme_log_level_p + scheme_log_level_topic_p scheme_log scheme_log_w_data scheme_log_message diff --git a/racket/src/racket/include/racket.exp b/racket/src/racket/include/racket.exp index fddf5e8e06..d5ce7223bc 100644 --- a/racket/src/racket/include/racket.exp +++ b/racket/src/racket/include/racket.exp @@ -102,6 +102,7 @@ scheme_raise_exn scheme_warning scheme_raise scheme_log_level_p +scheme_log_level_topic_p scheme_log scheme_log_w_data scheme_log_message diff --git a/racket/src/racket/include/racket3m.exp b/racket/src/racket/include/racket3m.exp index 841806ba61..8fd2b68e3c 100644 --- a/racket/src/racket/include/racket3m.exp +++ b/racket/src/racket/include/racket3m.exp @@ -102,6 +102,7 @@ scheme_raise_exn scheme_warning scheme_raise scheme_log_level_p +scheme_log_level_topic_p scheme_log scheme_log_w_data scheme_log_message diff --git a/racket/src/racket/src/fun.c b/racket/src/racket/src/fun.c index c89aea0af0..2dddc48f77 100644 --- a/racket/src/racket/src/fun.c +++ b/racket/src/racket/src/fun.c @@ -9732,7 +9732,7 @@ static Scheme_Object *jump_to_alt_continuation() /* time */ /*========================================================================*/ -intptr_t scheme_get_milliseconds(void) +uintptr_t scheme_get_milliseconds(void) /* this function can be called from any OS thread */ { return rktio_get_milliseconds(); @@ -9856,10 +9856,11 @@ static Scheme_Object *seconds_to_date(int argc, Scheme_Object **argv) static Scheme_Object *time_apply(int argc, Scheme_Object *argv[]) { - intptr_t start, end; + uintptr_t start, end; intptr_t cpustart, cpuend; intptr_t gcstart, gcend; - intptr_t dur, cpudur, gcdur; + uintptr_t dur; + intptr_t cpudur, gcdur; int i, num_rands; Scheme_Object *v, *p[4], **rand_vec, *rands, *r; diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index bd7a4bd0d9..3d524660a8 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -1150,7 +1150,7 @@ MZ_EXTERN Scheme_Object *scheme_load_extension(const char *filename, Scheme_Env MZ_EXTERN void scheme_register_extension_global(void *ptr, intptr_t size); MZ_EXTERN intptr_t scheme_get_seconds(void); -XFORM_NONGCING MZ_EXTERN intptr_t scheme_get_milliseconds(void); +XFORM_NONGCING MZ_EXTERN uintptr_t scheme_get_milliseconds(void); XFORM_NONGCING MZ_EXTERN double scheme_get_inexact_milliseconds(void); XFORM_NONGCING MZ_EXTERN intptr_t scheme_get_process_milliseconds(void); XFORM_NONGCING MZ_EXTERN intptr_t scheme_get_process_children_milliseconds(void); diff --git a/racket/src/racket/src/schemex.h b/racket/src/racket/src/schemex.h index 7f6a257b21..2f9a678dad 100644 --- a/racket/src/racket/src/schemex.h +++ b/racket/src/racket/src/schemex.h @@ -143,6 +143,7 @@ void (*scheme_raise_exn)(int exnid, ...); void (*scheme_warning)(char *msg, ...); void (*scheme_raise)(Scheme_Object *exn); int (*scheme_log_level_p)(Scheme_Logger *logger, int level); +int (*scheme_log_level_topic_p)(Scheme_Logger *logger, int level, Scheme_Object *name); void (*scheme_log)(Scheme_Logger *logger, int level, int flags, const char *msg, ...); void (*scheme_log_w_data)(Scheme_Logger *logger, int level, int flags, @@ -938,7 +939,7 @@ Scheme_Object *(*scheme_load)(const char *file); Scheme_Object *(*scheme_load_extension)(const char *filename, Scheme_Env *env); void (*scheme_register_extension_global)(void *ptr, intptr_t size); intptr_t (*scheme_get_seconds)(void); -intptr_t (*scheme_get_milliseconds)(void); +uintptr_t (*scheme_get_milliseconds)(void); double (*scheme_get_inexact_milliseconds)(void); intptr_t (*scheme_get_process_milliseconds)(void); intptr_t (*scheme_get_process_children_milliseconds)(void); diff --git a/racket/src/racket/src/schemex.inc b/racket/src/racket/src/schemex.inc index 9bf63c7893..2225b8b59f 100644 --- a/racket/src/racket/src/schemex.inc +++ b/racket/src/racket/src/schemex.inc @@ -111,6 +111,7 @@ scheme_extension_table->scheme_warning = scheme_warning; scheme_extension_table->scheme_raise = scheme_raise; scheme_extension_table->scheme_log_level_p = scheme_log_level_p; + scheme_extension_table->scheme_log_level_topic_p = scheme_log_level_topic_p; scheme_extension_table->scheme_log = scheme_log; scheme_extension_table->scheme_log_w_data = scheme_log_w_data; scheme_extension_table->scheme_log_message = scheme_log_message; diff --git a/racket/src/racket/src/schemexm.h b/racket/src/racket/src/schemexm.h index b3b4fcaaef..5bc0cfb244 100644 --- a/racket/src/racket/src/schemexm.h +++ b/racket/src/racket/src/schemexm.h @@ -111,6 +111,7 @@ #define scheme_warning (scheme_extension_table->scheme_warning) #define scheme_raise (scheme_extension_table->scheme_raise) #define scheme_log_level_p (scheme_extension_table->scheme_log_level_p) +#define scheme_log_level_topic_p (scheme_extension_table->scheme_log_level_topic_p) #define scheme_log (scheme_extension_table->scheme_log) #define scheme_log_w_data (scheme_extension_table->scheme_log_w_data) #define scheme_log_message (scheme_extension_table->scheme_log_message) diff --git a/racket/src/rktio/rktio.h b/racket/src/rktio/rktio.h index 3cc6b4dbb4..45bfb2cec7 100644 --- a/racket/src/rktio/rktio.h +++ b/racket/src/rktio/rktio.h @@ -1013,7 +1013,7 @@ typedef struct rktio_date_t { char *zone_name; /* can be NULL; otherwise, free it */ } rktio_date_t; -RKTIO_EXTERN_NOERR intptr_t rktio_get_milliseconds(void); +RKTIO_EXTERN_NOERR uintptr_t rktio_get_milliseconds(void); RKTIO_EXTERN_NOERR double rktio_get_inexact_milliseconds(void); RKTIO_EXTERN_NOERR intptr_t rktio_get_process_milliseconds(rktio_t *rktio); diff --git a/racket/src/rktio/rktio_time.c b/racket/src/rktio/rktio_time.c index 1d1c903f53..8be400bf9d 100644 --- a/racket/src/rktio/rktio_time.c +++ b/racket/src/rktio/rktio_time.c @@ -81,7 +81,7 @@ rktio_int64_t get_hectonanoseconds_as_longlong() } #endif -intptr_t rktio_get_milliseconds(void) +uintptr_t rktio_get_milliseconds(void) /* this function can be called from any OS thread */ { #ifdef RKTIO_SYSTEM_WINDOWS @@ -89,7 +89,7 @@ intptr_t rktio_get_milliseconds(void) #else struct timeval now; gettimeofday(&now, NULL); - return now.tv_sec * 1000 + now.tv_usec / 1000; + return ((uintptr_t) now.tv_sec) * 1000 + ((uintptr_t) now.tv_usec) / 1000; #endif }