svn commit: r309773 - head/tools/regression/sockets/unix_cmsg
Maxim Sobolev
sobomax at FreeBSD.org
Fri Dec 9 22:13:02 UTC 2016
Author: sobomax
Date: Fri Dec 9 22:13:00 2016
New Revision: 309773
URL: https://svnweb.freebsd.org/changeset/base/309773
Log:
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.
Added:
head/tools/regression/sockets/unix_cmsg/uc_check_time.c (contents, props changed)
head/tools/regression/sockets/unix_cmsg/uc_check_time.h (contents, props changed)
Modified:
head/tools/regression/sockets/unix_cmsg/Makefile
head/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
Modified: head/tools/regression/sockets/unix_cmsg/Makefile
==============================================================================
--- head/tools/regression/sockets/unix_cmsg/Makefile Fri Dec 9 21:21:24 2016 (r309772)
+++ head/tools/regression/sockets/unix_cmsg/Makefile Fri Dec 9 22:13:00 2016 (r309773)
@@ -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
Modified: head/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
==============================================================================
--- head/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in Fri Dec 9 21:21:24 2016 (r309772)
+++ head/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in Fri Dec 9 22:13:00 2016 (r309773)
@@ -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 *cmsg
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%%);
Added: head/tools/regression/sockets/unix_cmsg/uc_check_time.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/uc_check_time.c Fri Dec 9 22:13:00 2016 (r309773)
@@ -0,0 +1,101 @@
+/*-
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax at 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);
+}
Added: head/tools/regression/sockets/unix_cmsg/uc_check_time.h
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/tools/regression/sockets/unix_cmsg/uc_check_time.h Fri Dec 9 22:13:00 2016 (r309773)
@@ -0,0 +1,36 @@
+/*-
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax at 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);
More information about the svn-src-all
mailing list