[master] 90623cc5c vtim: Avoid a float cast overflow
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Mon May 10 13:14:06 UTC 2021
commit 90623cc5cdb220df78b476c77c6e1c50295e979b
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date: Wed May 5 21:36:03 2021 +0200
vtim: Avoid a float cast overflow
Spotted by ubsan.
diff --git a/lib/libvarnish/vtim.c b/lib/libvarnish/vtim.c
index 676330e1b..1ca0d836d 100644
--- a/lib/libvarnish/vtim.c
+++ b/lib/libvarnish/vtim.c
@@ -60,6 +60,7 @@
#include <sys/time.h>
#include <math.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -168,15 +169,20 @@ VTIM_format(vtim_real t, char *p)
time_t tt;
AN(p);
- tt = (time_t) t;
- if (gmtime_r(&tt, &tm) != NULL)
- AN(snprintf(p, VTIM_FORMAT_SIZE,
- "%s, %02d %s %4d %02d:%02d:%02d GMT",
- weekday_name[tm.tm_wday],
- tm.tm_mday, month_name[tm.tm_mon],
- tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec));
- else
- *p = '\0';
+ *p = '\0';
+
+ if (t < (vtim_real)INTMAX_MIN || t > (vtim_real)INTMAX_MAX)
+ return;
+
+ tt = (time_t)(intmax_t)t;
+ if (gmtime_r(&tt, &tm) == NULL)
+ return;
+
+ AN(snprintf(p, VTIM_FORMAT_SIZE,
+ "%s, %02d %s %4d %02d:%02d:%02d GMT",
+ weekday_name[tm.tm_wday],
+ tm.tm_mday, month_name[tm.tm_mon], tm.tm_year + 1900,
+ tm.tm_hour, tm.tm_min, tm.tm_sec));
}
#ifdef TEST_DRIVER
More information about the varnish-commit
mailing list