Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Dec 2016 22:13:00 +0000 (UTC)
From:      Maxim Sobolev <sobomax@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r309773 - head/tools/regression/sockets/unix_cmsg
Message-ID:  <201612092213.uB9MD0ZT093923@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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@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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201612092213.uB9MD0ZT093923>