18a272653SPeter Holm#!/bin/sh 28a272653SPeter Holm 38a272653SPeter Holm# 4*4d846d26SWarner Losh# SPDX-License-Identifier: BSD-2-Clause 58a272653SPeter Holm# 68a272653SPeter Holm# Copyright (c) 2020 Peter Holm <pho@FreeBSD.org> 78a272653SPeter Holm# 88a272653SPeter Holm# Redistribution and use in source and binary forms, with or without 98a272653SPeter Holm# modification, are permitted provided that the following conditions 108a272653SPeter Holm# are met: 118a272653SPeter Holm# 1. Redistributions of source code must retain the above copyright 128a272653SPeter Holm# notice, this list of conditions and the following disclaimer. 138a272653SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright 148a272653SPeter Holm# notice, this list of conditions and the following disclaimer in the 158a272653SPeter Holm# documentation and/or other materials provided with the distribution. 168a272653SPeter Holm# 178a272653SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 188a272653SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 198a272653SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 208a272653SPeter Holm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 218a272653SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 228a272653SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 238a272653SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 248a272653SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 258a272653SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 268a272653SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 278a272653SPeter Holm# SUCH DAMAGE. 288a272653SPeter Holm# 298a272653SPeter Holm 308a272653SPeter Holm# setsockopt() fuzz test scenario inspired by syzkaller. 318a272653SPeter Holm 328a272653SPeter Holm# "panic: mtx_lock() of spin mutex (null) @ 338a272653SPeter Holm# ../../../dev/hyperv/hvsock/hv_sock.c:519" seen. 348a272653SPeter Holm# https://people.freebsd.org/~pho/stress/log/setsockopt.txt 358a272653SPeter Holm# Introduced by r361275 368a272653SPeter Holm# Fixed by r361360 378a272653SPeter Holm 388a272653SPeter Holm. ../default.cfg 398a272653SPeter Holm 408a272653SPeter Holmdir=/tmp 418a272653SPeter Holmodir=`pwd` 428a272653SPeter Holmcd $dir 438a272653SPeter Holmsed '1,/^EOF/d' < $odir/$0 > $dir/setsockopt.c 448a272653SPeter Holmmycc -o setsockopt -Wall -Wextra -O0 -g setsockopt.c || exit 1 458a272653SPeter Holmrm -f setsockopt.c 468a272653SPeter Holm 478a272653SPeter Holmdaemon sh -c "(cd $odir/../testcases/swap; ./swap -t 5m)" > /dev/null 2>&1 488a272653SPeter Holm/tmp/setsockopt 498a272653SPeter Holms=$? 508a272653SPeter Holmwhile pgrep -q swap; do 518a272653SPeter Holm pkill -9 swap 528a272653SPeter Holmdone 538a272653SPeter Holmrm -rf /tmp/setsockopt /tmp/setsockopt.c 548a272653SPeter Holmexit $s 558a272653SPeter HolmEOF 568a272653SPeter Holm#include <sys/param.h> 578a272653SPeter Holm#include <sys/socket.h> 588a272653SPeter Holm#include <sys/stat.h> 598a272653SPeter Holm#include <sys/wait.h> 608a272653SPeter Holm 618a272653SPeter Holm#include <netinet/in.h> 628a272653SPeter Holm 638a272653SPeter Holm#include <err.h> 648a272653SPeter Holm#include <errno.h> 658a272653SPeter Holm#include <fcntl.h> 668a272653SPeter Holm#include <netdb.h> 678a272653SPeter Holm#include <signal.h> 688a272653SPeter Holm#include <stdio.h> 698a272653SPeter Holm#include <stdlib.h> 708a272653SPeter Holm#include <string.h> 718a272653SPeter Holm#include <time.h> 728a272653SPeter Holm#include <unistd.h> 738a272653SPeter Holm 748a272653SPeter Holm#define PARALLEL 128 758a272653SPeter Holm#define RUNTIME (3 * 60) 768a272653SPeter Holm 778a272653SPeter Holmstatic int port; 788a272653SPeter Holm 798a272653SPeter Holmstatic void 808a272653SPeter Holmtest(int idx) { 818a272653SPeter Holm struct hostent *hostent; 828a272653SPeter Holm struct sockaddr_in inetaddr; 838a272653SPeter Holm int i, j, r; 848a272653SPeter Holm int tcpsock, on; 858a272653SPeter Holm 868a272653SPeter Holm on = 1; 878a272653SPeter Holm for (i = 1; i < 5; i++) { 888a272653SPeter Holm for (j = 0; j < 10000; j++) { 898a272653SPeter Holm if ((tcpsock = socket(arc4random() % 64, arc4random() % 10, arc4random() % 10)) != -1) 908a272653SPeter Holm break; 918a272653SPeter Holm } 928a272653SPeter Holm if (tcpsock == -1) 938a272653SPeter Holm _exit(0); 948a272653SPeter Holm 958a272653SPeter Holm /* 968a272653SPeter Holm if (setsockopt(tcpsock, 978a272653SPeter Holm SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) 988a272653SPeter Holm err(1, "setsockopt(), %s:%d", __FILE__, __LINE__); 998a272653SPeter Holm */ 1008a272653SPeter Holm for (j = 0; j < 10000; j++) { 1018a272653SPeter Holm r = setsockopt(tcpsock, arc4random(), arc4random(), (char *)&on, sizeof(on)); 1028a272653SPeter Holm if (r != -1) 1038a272653SPeter Holm break; 1048a272653SPeter Holm } 1058a272653SPeter Holm 1068a272653SPeter Holm hostent = gethostbyname ("localhost"); 1078a272653SPeter Holm r = -1; 1088a272653SPeter Holm for (j = 0; j < 10000 && r != 0; j++) { 1098a272653SPeter Holm bzero((char *) &inetaddr, sizeof(inetaddr)); 1108a272653SPeter Holm memcpy (&inetaddr.sin_addr.s_addr, hostent->h_addr, 1118a272653SPeter Holm sizeof (struct in_addr)); 1128a272653SPeter Holm 1138a272653SPeter Holm// inetaddr.sin_family = AF_INET; 1148a272653SPeter Holm inetaddr.sin_family = arc4random() % 128; 1158a272653SPeter Holm// inetaddr.sin_addr.s_addr = INADDR_ANY; 1168a272653SPeter Holm inetaddr.sin_addr.s_addr = arc4random(); 1178a272653SPeter Holm inetaddr.sin_port = htons(port + idx); 1188a272653SPeter Holm inetaddr.sin_len = sizeof(inetaddr); 1198a272653SPeter Holm 1208a272653SPeter Holm alarm(1); 1218a272653SPeter Holm r = connect(tcpsock, (struct sockaddr *) &inetaddr, 1228a272653SPeter Holm sizeof(inetaddr)); 1238a272653SPeter Holm alarm(0); 1248a272653SPeter Holm } 1258a272653SPeter Holm usleep(1000); 1268a272653SPeter Holm close(tcpsock); 1278a272653SPeter Holm } 1288a272653SPeter Holm write(tcpsock, "a", 1); 1298a272653SPeter Holm _exit(0); 1308a272653SPeter Holm} 1318a272653SPeter Holm 1328a272653SPeter Holmint 1338a272653SPeter Holmmain(void) 1348a272653SPeter Holm{ 1358a272653SPeter Holm time_t start; 1368a272653SPeter Holm int i, pids[PARALLEL], status; 1378a272653SPeter Holm 1388a272653SPeter Holm port = 77665; 1398a272653SPeter Holm start = time(NULL); 1408a272653SPeter Holm while ((time(NULL) - start) < RUNTIME) { 1418a272653SPeter Holm for (i = 0; i < PARALLEL; i++) { 1428a272653SPeter Holm if ((pids[i] = fork()) == 0) 1438a272653SPeter Holm test(i); 1448a272653SPeter Holm } 1458a272653SPeter Holm for (i = 0; i < PARALLEL; i++) { 1468a272653SPeter Holm if (waitpid(pids[i], &status, 0) == -1) 1478a272653SPeter Holm err(1, "waitpid(%d)", pids[i]); 1488a272653SPeter Holm } 1498a272653SPeter Holm } 1508a272653SPeter Holm 1518a272653SPeter Holm return (0); 1528a272653SPeter Holm} 153