From: mvs Date: Thu, 9 Dec 2021 23:26:48 +0000 (+0000) Subject: Move 'unfdpassfail' test to regress/sys/kern/unixsockets/ directory. X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=025de3dcbda8e3569ca07f190d5f4e4402dd5487;p=openbsd Move 'unfdpassfail' test to regress/sys/kern/unixsockets/ directory. --- diff --git a/regress/sys/kern/Makefile b/regress/sys/kern/Makefile index d554a2914c3..04d74b11ae0 100644 --- a/regress/sys/kern/Makefile +++ b/regress/sys/kern/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.97 2021/12/09 17:41:51 mvs Exp $ +# $OpenBSD: Makefile,v 1.98 2021/12/09 23:26:48 mvs Exp $ SUBDIR+= __syscall SUBDIR+= accept access @@ -23,8 +23,8 @@ SUBDIR+= setuid .endif SUBDIR+= signal sosplice stackjmp stackpivot syscall syscall_segment SUBDIR+= sysvmsg sysvsem sysvshm -SUBDIR+= unalign unconacc undgram_conclose unfdpass unfdpassfail -SUBDIR+= unixsockets unsendrecvthr unixsock unveil unveil-unmount +SUBDIR+= unalign unconacc undgram_conclose unfdpass unixsockets +SUBDIR+= unsendrecvthr unixsock unveil unveil-unmount SUBDIR+= wait install: diff --git a/regress/sys/kern/unfdpassfail/Makefile b/regress/sys/kern/unfdpassfail/Makefile deleted file mode 100644 index ac1e649b5b4..00000000000 --- a/regress/sys/kern/unfdpassfail/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -# $OpenBSD: Makefile,v 1.1 2021/05/27 20:23:53 mvs Exp $ - -# -# This test enforces unp_internalize() to follow error path because -# we pass kqueue(2) descriptor. We have concurrent thread which closes -# socket descriptor passed to socket and if we are lucky this triggers -# FRELE(9). -# - -PROG= unfdpassfail -LDFLAGS= -lpthread - -.include diff --git a/regress/sys/kern/unfdpassfail/unfdpassfail.c b/regress/sys/kern/unfdpassfail/unfdpassfail.c deleted file mode 100644 index 2df68bff7d6..00000000000 --- a/regress/sys/kern/unfdpassfail/unfdpassfail.c +++ /dev/null @@ -1,117 +0,0 @@ -/* $OpenBSD: unfdpassfail.c,v 1.1 2021/05/27 20:23:53 mvs Exp $ */ - -/* - * Copyright (c) 2021 Vitaliy Makkoveev - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -union msg_control{ - struct cmsghdr cmsgh; - char control[CMSG_SPACE(sizeof(int)*2)]; -}; - -static void *thr_close(void *arg) -{ - close(*(int *)arg); - return NULL; -} - -int main(int argc, char *argv[]) -{ - struct timespec ts_start, ts_now, ts_time; - union msg_control msg_control; - int iov_buf; - struct iovec iov; - struct msghdr msgh; - struct cmsghdr *cmsgh; - pthread_t thr; - int s[2], fd, kqfd; - int infinite = 0, error; - - if (argc > 1 && !strcmp(argv[1], "--infinite")) - infinite = 1; - - if ((kqfd = kqueue()) < 0) - err(1, "kqueue"); - - if (!infinite) - if (clock_gettime(CLOCK_BOOTTIME, &ts_start) <0) - err(1, "clock_gettime"); - - while (1) { - if (socketpair(AF_UNIX, SOCK_STREAM|O_NONBLOCK, 0, s) < 0) - err(1, "socketpair"); - if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) - err(1, "open"); - - iov_buf = 0; - iov.iov_base = &iov_buf; - iov.iov_len = sizeof(iov_buf); - msgh.msg_control = msg_control.control; - msgh.msg_controllen = sizeof(msg_control.control); - msgh.msg_iov = &iov; - msgh.msg_iovlen = 1; - msgh.msg_name = NULL; - msgh.msg_namelen = 0; - cmsgh = CMSG_FIRSTHDR(&msgh); - cmsgh->cmsg_len = CMSG_LEN(sizeof(int) * 2); - cmsgh->cmsg_level = SOL_SOCKET; - cmsgh->cmsg_type = SCM_RIGHTS; - *((int *)CMSG_DATA(cmsgh) + 0) = fd; - *((int *)CMSG_DATA(cmsgh) + 1) = kqfd; - - error = pthread_create(&thr, NULL, thr_close, &fd); - if (error) - errc(1, error, "pthread_create"); - - if (sendmsg(s[0], &msgh, 0) < 0) { - if (errno != EINVAL) - err(1, "sendmsg"); - } - - error = pthread_join(thr, NULL); - if (error) - errc(1, error, "pthread_join"); - - close(s[0]); - close(s[1]); - close(fd); - - if (!infinite) { - if (clock_gettime(CLOCK_BOOTTIME, &ts_now) <0) - err(1, "clock_gettime"); - - timespecsub(&ts_now, &ts_start, &ts_time); - if (ts_time.tv_sec >= 20) - break; - } - } - - close(kqfd); - - return 0; -} diff --git a/regress/sys/kern/unixsockets/Makefile b/regress/sys/kern/unixsockets/Makefile index 99f6214af58..336fc2acd23 100644 --- a/regress/sys/kern/unixsockets/Makefile +++ b/regress/sys/kern/unixsockets/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.2 2021/12/09 17:41:51 mvs Exp $ +# $OpenBSD: Makefile,v 1.3 2021/12/09 23:26:48 mvs Exp $ # Copyright (c) 2021 Makkoveev Vitaliy # @@ -18,6 +18,9 @@ WARNINGS = yes PROGS = undgram_selfconn ungc +PROGS += unfdpassfail +LDADD_unfdpassfail = -lpthread + CLEANFILES += *.socket .include diff --git a/regress/sys/kern/unixsockets/unfdpassfail.c b/regress/sys/kern/unixsockets/unfdpassfail.c new file mode 100644 index 00000000000..49fa0774087 --- /dev/null +++ b/regress/sys/kern/unixsockets/unfdpassfail.c @@ -0,0 +1,117 @@ +/* $OpenBSD: unfdpassfail.c,v 1.1 2021/12/09 23:26:48 mvs Exp $ */ + +/* + * Copyright (c) 2021 Vitaliy Makkoveev + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +union msg_control{ + struct cmsghdr cmsgh; + char control[CMSG_SPACE(sizeof(int)*2)]; +}; + +static void *thr_close(void *arg) +{ + close(*(int *)arg); + return NULL; +} + +int main(int argc, char *argv[]) +{ + struct timespec ts_start, ts_now, ts_time; + union msg_control msg_control; + int iov_buf; + struct iovec iov; + struct msghdr msgh; + struct cmsghdr *cmsgh; + pthread_t thr; + int s[2], fd, kqfd; + int infinite = 0, error; + + if (argc > 1 && !strcmp(argv[1], "--infinite")) + infinite = 1; + + if ((kqfd = kqueue()) < 0) + err(1, "kqueue"); + + if (!infinite) + if (clock_gettime(CLOCK_BOOTTIME, &ts_start) <0) + err(1, "clock_gettime"); + + while (1) { + if (socketpair(AF_UNIX, SOCK_STREAM|O_NONBLOCK, 0, s) < 0) + err(1, "socketpair"); + if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) + err(1, "open"); + + iov_buf = 0; + iov.iov_base = &iov_buf; + iov.iov_len = sizeof(iov_buf); + msgh.msg_control = msg_control.control; + msgh.msg_controllen = sizeof(msg_control.control); + msgh.msg_iov = &iov; + msgh.msg_iovlen = 1; + msgh.msg_name = NULL; + msgh.msg_namelen = 0; + cmsgh = CMSG_FIRSTHDR(&msgh); + cmsgh->cmsg_len = CMSG_LEN(sizeof(int) * 2); + cmsgh->cmsg_level = SOL_SOCKET; + cmsgh->cmsg_type = SCM_RIGHTS; + *((int *)CMSG_DATA(cmsgh) + 0) = fd; + *((int *)CMSG_DATA(cmsgh) + 1) = kqfd; + + error = pthread_create(&thr, NULL, thr_close, &fd); + if (error) + errc(1, error, "pthread_create"); + + if (sendmsg(s[0], &msgh, 0) < 0) { + if (errno != EINVAL) + err(1, "sendmsg"); + } + + error = pthread_join(thr, NULL); + if (error) + errc(1, error, "pthread_join"); + + close(s[0]); + close(s[1]); + close(fd); + + if (!infinite) { + if (clock_gettime(CLOCK_BOOTTIME, &ts_now) <0) + err(1, "clock_gettime"); + + timespecsub(&ts_now, &ts_start, &ts_time); + if (ts_time.tv_sec >= 20) + break; + } + } + + close(kqfd); + + return 0; +}