summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Rühsen <tim.ruehsen@gmx.de>2018-06-26 19:33:00 +0000
committerTim Rühsen <tim.ruehsen@gmx.de>2018-06-26 19:33:00 +0000
commit0257a5a6a5dafcebb4cc6e626c23bb5a7b333c3c (patch)
treef41fbba1c9e30d1f3336864823ed73e43da3a064
parent9c871f95e258d1110afea1d0f45876f289fc03c3 (diff)
parent9aa4bbdb885c5b5ab7c29ee598d0e6df14df1141 (diff)
downloadgnutls-0257a5a6a5dafcebb4cc6e626c23bb5a7b333c3c.tar.gz
Merge branch 'timespec-overflow2' into 'master'
avoid more possible overflows when substracting timespecs See merge request gnutls/gnutls!685
-rw-r--r--doc/examples/ex-serv-dtls.c9
-rw-r--r--src/benchmark.c4
-rw-r--r--src/common.h8
-rw-r--r--src/udp-serv.c9
-rw-r--r--tests/mini-dtls-mtu.c9
-rw-r--r--tests/suite/mini-record-timing.c4
6 files changed, 11 insertions, 32 deletions
diff --git a/doc/examples/ex-serv-dtls.c b/doc/examples/ex-serv-dtls.c
index 887b4b83df..23b51a1781 100644
--- a/doc/examples/ex-serv-dtls.c
+++ b/doc/examples/ex-serv-dtls.c
@@ -303,13 +303,8 @@ static int pull_timeout_func(gnutls_transport_ptr_t ptr, unsigned int ms)
FD_ZERO(&rfds);
FD_SET(priv->fd, &rfds);
- tv.tv_sec = 0;
- tv.tv_usec = ms * 1000;
-
- while (tv.tv_usec >= 1000000) {
- tv.tv_usec -= 1000000;
- tv.tv_sec++;
- }
+ tv.tv_sec = ms / 1000;
+ tv.tv_usec = (ms % 1000) * 1000;
ret = select(priv->fd + 1, &rfds, NULL, NULL, &tv);
diff --git a/src/benchmark.c b/src/benchmark.c
index 9a83318c3e..bcc12a9037 100644
--- a/src/benchmark.c
+++ b/src/benchmark.c
@@ -130,9 +130,7 @@ double stop_benchmark(struct benchmark_st *st, const char *metric,
gettime(&stop);
- lsecs = (stop.tv_sec * 1000 + stop.tv_nsec / (1000 * 1000) -
- (st->start.tv_sec * 1000 +
- st->start.tv_nsec / (1000 * 1000)));
+ lsecs = timespec_sub_ms(&stop, &st->start);
secs = lsecs;
secs /= 1000;
diff --git a/src/common.h b/src/common.h
index f1c828ce40..20faf7d521 100644
--- a/src/common.h
+++ b/src/common.h
@@ -101,12 +101,8 @@ static int system_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms)
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
- tv.tv_sec = 0;
- tv.tv_usec = ms * 1000;
- while (tv.tv_usec >= 1000000) {
- tv.tv_usec -= 1000000;
- tv.tv_sec++;
- }
+ tv.tv_sec = ms / 1000;
+ tv.tv_usec = (ms % 1000) * 1000;
return select(fd + 1, &rfds, NULL, NULL, &tv);
}
diff --git a/src/udp-serv.c b/src/udp-serv.c
index 5442946165..46e1e70878 100644
--- a/src/udp-serv.c
+++ b/src/udp-serv.c
@@ -239,13 +239,8 @@ static int pull_timeout_func(gnutls_transport_ptr_t ptr, unsigned int ms)
FD_ZERO(&rfds);
FD_SET(priv->fd, &rfds);
- tv.tv_sec = 0;
- tv.tv_usec = ms * 1000;
-
- while (tv.tv_usec >= 1000000) {
- tv.tv_usec -= 1000000;
- tv.tv_sec++;
- }
+ tv.tv_sec = ms / 1000;
+ tv.tv_usec = (ms % 1000) * 1000;
ret = select(priv->fd + 1, &rfds, NULL, NULL, &tv);
diff --git a/tests/mini-dtls-mtu.c b/tests/mini-dtls-mtu.c
index 82106081d6..1ae7325665 100644
--- a/tests/mini-dtls-mtu.c
+++ b/tests/mini-dtls-mtu.c
@@ -103,13 +103,8 @@ static int client_pull_timeout(gnutls_transport_ptr_t ptr, unsigned int ms)
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
- tv.tv_sec = 0;
- tv.tv_usec = ms * 1000;
-
- while (tv.tv_usec >= 1000000) {
- tv.tv_usec -= 1000000;
- tv.tv_sec++;
- }
+ tv.tv_sec = (ms / 1000);
+ tv.tv_usec = (ms % 1000) * 1000;
ret = select(fd + 1, &rfds, NULL, NULL, &tv);
if (ret <= 0)
diff --git a/tests/suite/mini-record-timing.c b/tests/suite/mini-record-timing.c
index b08d36434c..5d425a9573 100644
--- a/tests/suite/mini-record-timing.c
+++ b/tests/suite/mini-record-timing.c
@@ -154,8 +154,8 @@ push_crippled(gnutls_transport_ptr_t tr, const void *_data, size_t len)
static unsigned long timespec_sub_ns(struct timespec *a,
struct timespec *b)
{
- return (a->tv_sec * 1000 * 1000 * 1000 + a->tv_nsec -
- (b->tv_sec * 1000 * 1000 * 1000 + b->tv_nsec));
+ return (a->tv_sec - b->tv_sec) * 1000 * 1000 * 1000 + a->tv_nsec -
+ b->tv_nsec;
}
#endif