aboutsummaryrefslogtreecommitdiff
path: root/tools/regression
diff options
context:
space:
mode:
authorMaxim Sobolev <sobomax@FreeBSD.org>2016-12-09 22:13:00 +0000
committerMaxim Sobolev <sobomax@FreeBSD.org>2016-12-09 22:13:00 +0000
commit79847968f9fbe22fe823211bfd689a634cb37132 (patch)
tree0dd4458d5f6edc924530dcea157fe3e8b8b97312 /tools/regression
parent255003da429b8ebab444baf704886785365e2838 (diff)
downloadsrc-79847968f9fbe22fe823211bfd689a634cb37132.tar.gz
src-79847968f9fbe22fe823211bfd689a634cb37132.zip
Check that SCM_XXX timestamp returned by the kernel is less 1 second
away in the past from the current time. This should be plenty for the scheduler to do its job. It provides assurance that the timestamp returned is actually a valid one, not just some random garbage.
Notes
Notes: svn path=/head/; revision=309773
Diffstat (limited to 'tools/regression')
-rw-r--r--tools/regression/sockets/unix_cmsg/Makefile3
-rw-r--r--tools/regression/sockets/unix_cmsg/t_xxxtime.c.in4
-rw-r--r--tools/regression/sockets/unix_cmsg/uc_check_time.c101
-rw-r--r--tools/regression/sockets/unix_cmsg/uc_check_time.h36
4 files changed, 143 insertions, 1 deletions
diff --git a/tools/regression/sockets/unix_cmsg/Makefile b/tools/regression/sockets/unix_cmsg/Makefile
index 13a187d10bd4..d002f9b4c04d 100644
--- a/tools/regression/sockets/unix_cmsg/Makefile
+++ b/tools/regression/sockets/unix_cmsg/Makefile
@@ -4,7 +4,8 @@ PROG= unix_cmsg
SRCS= ${AUTOSRCS} unix_cmsg.c uc_common.h uc_common.c \
t_generic.h t_generic.c t_peercred.h t_peercred.c \
t_cmsgcred.h t_cmsgcred.c t_sockcred.h t_sockcred.c \
- t_cmsgcred_sockcred.h t_cmsgcred_sockcred.c t_cmsg_len.h t_cmsg_len.c
+ t_cmsgcred_sockcred.h t_cmsgcred_sockcred.c t_cmsg_len.h t_cmsg_len.c \
+ uc_check_time.h uc_check_time.c
CLEANFILES+= ${AUTOSRCS}
MAN=
WARNS?= 3
diff --git a/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in b/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
index af804c1ca6ac..8bed032a5e23 100644
--- a/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
+++ b/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include "t_%%TTYPE%%.h"
#include "t_generic.h"
#include "uc_common.h"
+#include "uc_check_time.h"
#if defined(%%SCM_TTYPE%%)
static int
@@ -51,6 +52,9 @@ check_scm_%%TTYPE%%(struct cmsghdr *cmsghdr)
bt = (struct %%DTYPE%% *)CMSG_DATA(cmsghdr);
+ if (uc_check_%%TTYPE%%(bt) < 0)
+ return (-1);
+
uc_dbgmsg("%%DTYPE%%.%%MAJ_MEMB%% %"PRIdMAX", %%DTYPE%%.%%MIN_MEMB%% %"PRIuMAX,
(intmax_t)bt->%%MAJ_MEMB%%, (uintmax_t)bt->%%MIN_MEMB%%);
diff --git a/tools/regression/sockets/unix_cmsg/uc_check_time.c b/tools/regression/sockets/unix_cmsg/uc_check_time.c
new file mode 100644
index 000000000000..5b7dfe11bb89
--- /dev/null
+++ b/tools/regression/sockets/unix_cmsg/uc_check_time.c
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/time.h>
+#include <time.h>
+
+#include "uc_check_time.h"
+
+static const struct timeval max_diff_tv = {.tv_sec = 1, .tv_usec = 0};
+static const struct timespec max_diff_ts = {.tv_sec = 1, .tv_nsec = 0};
+
+#define timespeccmp(tvp, uvp, cmp) \
+ (((tvp)->tv_sec == (uvp)->tv_sec) ? \
+ ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \
+ ((tvp)->tv_sec cmp (uvp)->tv_sec))
+#define timespecsub(vvp, uvp) \
+ do { \
+ (vvp)->tv_sec -= (uvp)->tv_sec; \
+ (vvp)->tv_nsec -= (uvp)->tv_nsec; \
+ if ((vvp)->tv_nsec < 0) { \
+ (vvp)->tv_sec--; \
+ (vvp)->tv_nsec += 1000000000; \
+ } \
+ } while (0)
+
+int
+uc_check_bintime(const struct bintime *mt)
+{
+ struct timespec bt;
+
+ bintime2timespec(mt, &bt);
+ return (uc_check_timespec_real(&bt));
+}
+
+int
+uc_check_timeval(const struct timeval *bt)
+{
+ struct timeval ct, dt;
+
+ if (gettimeofday(&ct, NULL) < 0)
+ return (-1);
+ timersub(&ct, bt, &dt);
+ if (!timercmp(&dt, &max_diff_tv, <))
+ return (-1);
+
+ return (0);
+}
+
+int
+uc_check_timespec_real(const struct timespec *bt)
+{
+ struct timespec ct;
+
+ if (clock_gettime(CLOCK_REALTIME, &ct) < 0)
+ return (-1);
+ timespecsub(&ct, bt);
+ if (!timespeccmp(&ct, &max_diff_ts, <))
+ return (-1);
+
+ return (0);
+}
+
+int
+uc_check_timespec_mono(const struct timespec *bt)
+{
+ struct timespec ct;
+
+ if (clock_gettime(CLOCK_MONOTONIC, &ct) < 0)
+ return (-1);
+ timespecsub(&ct, bt);
+ if (!timespeccmp(&ct, &max_diff_ts, <))
+ return (-1);
+
+ return (0);
+}
diff --git a/tools/regression/sockets/unix_cmsg/uc_check_time.h b/tools/regression/sockets/unix_cmsg/uc_check_time.h
new file mode 100644
index 000000000000..61c52b05996d
--- /dev/null
+++ b/tools/regression/sockets/unix_cmsg/uc_check_time.h
@@ -0,0 +1,36 @@
+/*-
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+struct bintime;
+struct timeval;
+struct timespec;
+
+int uc_check_bintime(const struct bintime *bt);
+int uc_check_timeval(const struct timeval *bt);
+int uc_check_timespec_real(const struct timespec *bt);
+int uc_check_timespec_mono(const struct timespec *bt);