1 /* $NetBSD: t_kevent.c,v 1.7 2015/02/05 13:55:37 isaki Exp $ */
4 * Copyright (c) 2011 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundatiom
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
31 #include <sys/cdefs.h>
32 __RCSID("$NetBSD: t_kevent.c,v 1.7 2015/02/05 13:55:37 isaki Exp $");
34 #include <sys/types.h>
35 #include <sys/event.h>
46 #include <sys/drvctlio.h>
47 #include <sys/event.h>
49 #include <sys/socket.h>
52 ATF_TC(kevent_zerotimer
);
53 ATF_TC_HEAD(kevent_zerotimer
, tc
)
55 atf_tc_set_md_var(tc
, "descr", "Checks that kevent with a 0 timer "
56 "does not crash the system (PR lib/45618)");
59 ATF_TC_BODY(kevent_zerotimer
, tc
)
64 ATF_REQUIRE((kq
= kqueue()) != -1);
65 EV_SET(&ev
, 1, EVFILT_TIMER
, EV_ADD
|EV_ENABLE
, 0, 1, 0);
66 ATF_REQUIRE(kevent(kq
, &ev
, 1, NULL
, 0, NULL
) != -1);
67 ATF_REQUIRE(kevent(kq
, NULL
, 0, &ev
, 1, NULL
) == 1);
70 ATF_TC(kqueue_desc_passing
);
71 ATF_TC_HEAD(kqueue_desc_passing
, tc
)
73 atf_tc_set_md_var(tc
, "descr", "Checks that passing a kqueue to "
74 "another process does not crash the kernel (PR 46463)");
77 ATF_TC_BODY(kqueue_desc_passing
, tc
)
80 int s
[2], storage
, status
, kq
;
86 ATF_REQUIRE((kq
= kqueue()) != -1);
88 // atf_tc_skip("crashes kernel (PR 46463)");
90 ATF_REQUIRE(socketpair(AF_LOCAL
, SOCK_STREAM
, 0, s
) != -1);
91 msg
= malloc(CMSG_SPACE(sizeof(int)));
97 m
.msg_controllen
= CMSG_SPACE(sizeof(int));
103 iov
.iov_base
= &storage
;
104 iov
.iov_len
= sizeof(int);
108 if (recvmsg(s
[1], &m
, 0) == -1)
109 err(1, "child: could not recvmsg");
111 kq
= *(int *)CMSG_DATA(msg
);
112 printf("child (pid %d): received kq fd %d\n", getpid(), kq
);
118 iov
.iov_base
= &storage
;
119 iov
.iov_len
= sizeof(int);
121 msg
->cmsg_level
= SOL_SOCKET
;
122 msg
->cmsg_type
= SCM_RIGHTS
;
123 msg
->cmsg_len
= CMSG_LEN(sizeof(int));
125 *(int *)CMSG_DATA(msg
) = kq
;
127 EV_SET(&ev
, 1, EVFILT_TIMER
, EV_ADD
|EV_ENABLE
, 0, 1, 0);
128 ATF_CHECK(kevent(kq
, &ev
, 1, NULL
, 0, NULL
) != -1);
130 printf("parent (pid %d): sending kq fd %d\n", getpid(), kq
);
131 if (sendmsg(s
[0], &m
, 0) == -1) {
132 ATF_REQUIRE_EQ_MSG(errno
, EBADF
, "errno is %d", errno
);
133 atf_tc_skip("PR kern/46523");
138 waitpid(child
, &status
, 0);
139 ATF_CHECK(WIFEXITED(status
) && WEXITSTATUS(status
)==0);
142 ATF_TC(kqueue_unsupported_fd
);
143 ATF_TC_HEAD(kqueue_unsupported_fd
, tc
)
145 atf_tc_set_md_var(tc
, "descr", "Checks that watching an fd whose"
146 " type is not supported does not crash the kernel");
149 ATF_TC_BODY(kqueue_unsupported_fd
, tc
)
151 /* mqueue and semaphore use fnullop_kqueue also */
155 fd
= open(DRVCTLDEV
, O_RDONLY
);
160 atf_tc_skip("no " DRVCTLDEV
" available for testing");
164 ATF_REQUIRE(fd
!= -1);
165 ATF_REQUIRE((kq
= kqueue()) != -1);
167 EV_SET(&ev
, fd
, EVFILT_VNODE
, EV_ADD
| EV_ENABLE
| EV_CLEAR
,
168 NOTE_DELETE
|NOTE_WRITE
|NOTE_EXTEND
|NOTE_ATTRIB
|NOTE_LINK
|
169 NOTE_RENAME
|NOTE_REVOKE
, 0, 0);
171 ATF_REQUIRE(kevent(kq
, &ev
, 1, NULL
, 0, NULL
) == -1);
172 ATF_REQUIRE_ERRNO(EOPNOTSUPP
, true);
181 ATF_TP_ADD_TC(tp
, kevent_zerotimer
);
182 ATF_TP_ADD_TC(tp
, kqueue_desc_passing
);
183 ATF_TP_ADD_TC(tp
, kqueue_unsupported_fd
);
185 return atf_no_error();