Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src Introduce enhancements to the kcov(4) code
details: https://anonhg.NetBSD.org/src/rev/1e87c7985074
branches: trunk
changeset: 449564:1e87c7985074
user: kamil <kamil%NetBSD.org@localhost>
date: Sun Mar 10 22:34:14 2019 +0000
description:
Introduce enhancements to the kcov(4) code
Add new tests verifying dup2(2) scenarios:
- kcov_dup2
- kcov_basic_dup2_pc
- kcov_basic_dup2_cmp
The dup2(2) trick is used by syzkaller and assert that it works.
All new tests pass.
While there add minor non-functional cleanup changes.
diffstat:
sys/kern/subr_kcov.c | 4 +-
tests/modules/t_kcov.c | 80 +++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 71 insertions(+), 13 deletions(-)
diffs (174 lines):
diff -r bfa2fb9e9e67 -r 1e87c7985074 sys/kern/subr_kcov.c
--- a/sys/kern/subr_kcov.c Sun Mar 10 22:28:56 2019 +0000
+++ b/sys/kern/subr_kcov.c Sun Mar 10 22:34:14 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_kcov.c,v 1.5 2019/03/10 17:51:00 kamil Exp $ */
+/* $NetBSD: subr_kcov.c,v 1.6 2019/03/10 22:34:14 kamil Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -417,7 +417,7 @@
}
if (kd->mode != KCOV_MODE_TRACE_CMP) {
- /* PC tracing mode not enabled */
+ /* CMP tracing mode not enabled */
return;
}
diff -r bfa2fb9e9e67 -r 1e87c7985074 tests/modules/t_kcov.c
--- a/tests/modules/t_kcov.c Sun Mar 10 22:28:56 2019 +0000
+++ b/tests/modules/t_kcov.c Sun Mar 10 22:34:14 2019 +0000
@@ -57,6 +57,34 @@
return fd;
}
+static int
+pick_unassigned_fd(int greater_than_fd)
+{
+ int fd2;
+
+ fd2 = greater_than_fd;
+ do {
+ ++fd2;
+ } while (fcntl(fd2, F_GETFL) != -1 || errno != EBADF);
+
+ return fd2;
+}
+
+ATF_TC_WITHOUT_HEAD(kcov_dup2);
+ATF_TC_BODY(kcov_dup2, tc)
+{
+ int fd1, fd2;
+ fd1 = open_kcov();
+
+ fd2 = pick_unassigned_fd(fd1);
+
+ /* Test the dup2(2) trick used by syzkaller */
+ ATF_REQUIRE_EQ(dup2(fd1, fd2), fd2);
+
+ close(fd1);
+ close(fd2);
+}
+
ATF_TC_WITHOUT_HEAD(kcov_multiopen);
ATF_TC_BODY(kcov_multiopen, tc)
{
@@ -216,11 +244,7 @@
ATF_CHECK(ioctl(fd, KCOV_IOC_DISABLE) == 0);
ATF_CHECK(ioctl(fd, KCOV_IOC_DISABLE) == -1);
- /* Re-enabling should also work */
- ATF_CHECK(ioctl(fd, KCOV_IOC_ENABLE, &mode) == 0);
- ATF_CHECK(ioctl(fd, KCOV_IOC_DISABLE) == 0);
-
- /* Re-enablibling and changing mode should also work */
+ /* Re-enabling and changing mode should also work */
mode = KCOV_MODE_NONE;
ATF_CHECK(ioctl(fd, KCOV_IOC_ENABLE, &mode) == 0);
ATF_CHECK(ioctl(fd, KCOV_IOC_DISABLE) == 0);
@@ -262,14 +286,22 @@
}
static void *
-common_head(int *fdp)
+common_head_raw(bool fd_dup, int *fdp)
{
void *data;
- int fd;
+ int fd, fd2;
uint64_t size = PAGE_SIZE / KCOV_ENTRY_SIZE;
fd = open_kcov();
+ /* Test the dup2(2) trick used by syzkaller */
+ if (fd_dup) {
+ fd2 = pick_unassigned_fd(fd);
+ ATF_REQUIRE_EQ(dup2(fd, fd2), fd2);
+ close(fd);
+ fd = fd2;
+ }
+
ATF_REQUIRE_MSG(ioctl(fd, KCOV_IOC_SETBUFSIZE, &size) == 0,
"Unable to set the kcov buffer size");
@@ -280,6 +312,13 @@
return data;
}
+static void *
+common_head(int *fdp)
+{
+
+ return common_head_raw(false, fdp);
+}
+
static void
common_tail(int fd, kcov_int_t *data)
{
@@ -291,12 +330,12 @@
}
static void
-kcov_basic(int mode)
+kcov_basic(bool fd_dup, int mode)
{
kcov_int_t *buf;
int fd;
- buf = common_head(&fd);
+ buf = common_head_raw(fd_dup, &fd);
ATF_REQUIRE_MSG(ioctl(fd, KCOV_IOC_ENABLE, &mode) == 0,
"Unable to enable kcov ");
@@ -315,7 +354,7 @@
ATF_TC_BODY(kcov_basic_pc, tc)
{
- kcov_basic(KCOV_MODE_TRACE_PC);
+ kcov_basic(false, KCOV_MODE_TRACE_PC);
}
ATF_TC_WITHOUT_HEAD(kcov_basic_cmp);
@@ -324,7 +363,23 @@
atf_tc_skip("XXX: GCC8 needed");
- kcov_basic(KCOV_MODE_TRACE_CMP);
+ kcov_basic(false, KCOV_MODE_TRACE_CMP);
+}
+
+ATF_TC_WITHOUT_HEAD(kcov_basic_dup2_pc);
+ATF_TC_BODY(kcov_basic_dup2_pc, tc)
+{
+
+ kcov_basic(true, KCOV_MODE_TRACE_PC);
+}
+
+ATF_TC_WITHOUT_HEAD(kcov_basic_dup2_cmp);
+ATF_TC_BODY(kcov_basic_dup2_cmp, tc)
+{
+
+ atf_tc_skip("XXX: GCC8 needed");
+
+ kcov_basic(true, KCOV_MODE_TRACE_CMP);
}
ATF_TC_WITHOUT_HEAD(kcov_multienable_on_the_same_thread);
@@ -486,6 +541,7 @@
ATF_TP_ADD_TCS(tp)
{
+ ATF_TP_ADD_TC(tp, kcov_dup2);
ATF_TP_ADD_TC(tp, kcov_multiopen);
ATF_TP_ADD_TC(tp, kcov_open_close_open);
ATF_TP_ADD_TC(tp, kcov_bufsize);
@@ -498,6 +554,8 @@
ATF_TP_ADD_TC(tp, kcov_mmap_enable_thread_close);
ATF_TP_ADD_TC(tp, kcov_basic_pc);
ATF_TP_ADD_TC(tp, kcov_basic_cmp);
+ ATF_TP_ADD_TC(tp, kcov_basic_dup2_pc);
+ ATF_TP_ADD_TC(tp, kcov_basic_dup2_cmp);
ATF_TP_ADD_TC(tp, kcov_multienable_on_the_same_thread);
ATF_TP_ADD_TC(tp, kcov_buffer_access_from_custom_thread);
ATF_TP_ADD_TC(tp, kcov_thread);
Home |
Main Index |
Thread Index |
Old Index