From owner-svn-src-user@freebsd.org Tue Aug 9 11:37:09 2016 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C0195BB3943 for ; Tue, 9 Aug 2016 11:37:09 +0000 (UTC) (envelope-from pho@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 74FC71FAE; Tue, 9 Aug 2016 11:37:09 +0000 (UTC) (envelope-from pho@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u79Bb8DK086951; Tue, 9 Aug 2016 11:37:08 GMT (envelope-from pho@FreeBSD.org) Received: (from pho@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u79Bb8ua086950; Tue, 9 Aug 2016 11:37:08 GMT (envelope-from pho@FreeBSD.org) Message-Id: <201608091137.u79Bb8ua086950@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: pho set sender to pho@FreeBSD.org using -f From: Peter Holm Date: Tue, 9 Aug 2016 11:37:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r303871 - user/pho/stress2/misc X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Aug 2016 11:37:09 -0000 Author: pho Date: Tue Aug 9 11:37:08 2016 New Revision: 303871 URL: https://svnweb.freebsd.org/changeset/base/303871 Log: Added a regression test. PR: 211531 Submitted by: markj Sponsored by: EMC / Isilon Storage Division Added: user/pho/stress2/misc/unix_socket_detach.sh (contents, props changed) Added: user/pho/stress2/misc/unix_socket_detach.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/pho/stress2/misc/unix_socket_detach.sh Tue Aug 9 11:37:08 2016 (r303871) @@ -0,0 +1,99 @@ +#!/bin/sh + +# Reproduce problem reported as PR 211531. +# https://reviews.freebsd.org/D7398 + +# Test scenario by Mark Johnston + +# "panic: __rw_wlock_hard: recursing but non-recursive rw unp_link_rwlock @ +# ../../../kern/uipc_usrreq.c:655" seen: +# https://people.freebsd.org/~pho/stress/log/unix_socket_detach.txt +# Fixed in r303855. + +. ../default.cfg + +cd /tmp +cat > unix_socket_detach.c < +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +static void +handler(int i __unused) { + _exit(0); +} + +int +main(void) +{ + struct sockaddr_un sun; + char *file; + pid_t pid; + int sd, flags, one; + + file = "unix_socket_detach.socket"; + memset(&sun, 0, sizeof(sun)); + sun.sun_family = AF_LOCAL; + sun.sun_len = sizeof(sun); + snprintf(sun.sun_path, sizeof(sun.sun_path), "%s", file); + + signal(SIGALRM, handler); + pid = fork(); + if (pid < 0) + err(1, "fork"); + if (pid == 0) { + alarm(300); + for (;;) { + sd = socket(PF_LOCAL, SOCK_STREAM, 0); + if (sd < 0) + err(1, "socket"); + one = 1; + if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &one, + sizeof(one)) < 0) + err(1, "setsockopt"); + if (bind(sd, (struct sockaddr *)&sun, sizeof(sun)) < 0) { + close(sd); + continue; + } + if (listen(sd, 10) != 0) + err(1, "listen"); + usleep(random() % 10); + (void)close(sd); + (void)unlink(file); + } + } else { + alarm(300); + for (;;) { + sd = socket(PF_LOCAL, SOCK_STREAM, 0); + if (sd < 0) + err(1, "socket"); + if ((flags = fcntl(sd, F_GETFL, 0)) < 0) + err(1, "fcntl(F_GETFL)"); + flags |= O_NONBLOCK; + if (fcntl(sd, F_SETFL, flags) < 0) + err(1, "fcntl(F_SETFL)"); + (void)connect(sd, (struct sockaddr *)&sun, sizeof(sun)); + usleep(random() % 10); + (void)close(sd); + } + } + return (0); +} +EOF + +mycc -o unix_socket_detach -Wall -Wextra -O2 -g unix_socket_detach.c || exit 1 + +rm -f unix_socket_detach.socket +/tmp/unix_socket_detach +s=$? + +rm -f unix_socket_detach.c unix_socket_detach unix_socket_detach.socket +exit $s