From owner-freebsd-net@FreeBSD.ORG Fri Sep 5 03:06:23 2003 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 438B616A4BF; Fri, 5 Sep 2003 03:06:23 -0700 (PDT) Received: from n2.nomadiclab.com (n2.nomadiclab.com [131.160.193.2]) by mx1.FreeBSD.org (Postfix) with ESMTP id 00E2B43FA3; Fri, 5 Sep 2003 03:06:22 -0700 (PDT) (envelope-from jmgm@iki.fi) Received: from n51.nomadiclab.com (n51.nomadiclab.com [131.160.193.51]) by n2.nomadiclab.com (Postfix) with ESMTP id BD2C0CE4A5; Fri, 5 Sep 2003 13:06:20 +0300 (EEST) From: Jan Mikael Melen To: freebsd-net@freebsd.org Date: Fri, 5 Sep 2003 13:07:29 +0300 User-Agent: KMail/1.5.2 References: <200309051240.02622.jmgm@iki.fi> <200309051251.14970.jmgm@iki.fi> <20030905095448.GA411@FreeBSD.org> In-Reply-To: <20030905095448.GA411@FreeBSD.org> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200309051307.29056.jmgm@iki.fi> cc: "Simon L. Nielsen" Subject: Re: Fatal trap 12 in binding V6 socket in FreeBSD 5.1-p2 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 Sep 2003 10:06:23 -0000 On Friday 05 September 2003 12:54, Simon L. Nielsen wrote: > On 2003.09.05 12:51:14 +0300, Jan Mikael Melen wrote: > > > I've included as an attachment a patch that I have used to fix the > > > problem and allso as attached a short program which can be used to > > > regenerate the problem in unpatched FreeBSD 5.1-p2. > > > > Oops.... Forgot the other attachment... > > The attachement at least didn't make it to the FreeBSD-net list. This > might be useful: > > http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/eresources.html#E >RESOURCES-MAILFILTERING Well let's put it in plain text because c-source files seems to be filtered away on freebsd-net list... #include #include #include #include #include #include #include #include #include static void usage(char *progname) { fprintf(stderr, "Usage: %s ip port\n", progname); exit (1); } int main(int argc, char *argv[]) { int s1, s2, s3, len, ret, fromlen, i; char buf[1024]; struct sockaddr_storage ss0; struct sockaddr_in6 *sin60 = (struct sockaddr_in6 *)&ss0; struct sockaddr_storage ss; char *progname = argv[0]; char *scope; if (argc != 3) usage(progname); memset(&ss0, 0, sizeof(ss0)); sin60->sin6_len = sizeof(struct sockaddr_in6); sin60->sin6_family = AF_INET6; sin60->sin6_port = htons(atoi(argv[2])); scope = strchr(argv[1], '%'); if (scope) { *scope++ = 0; sin60->sin6_scope_id = atoi(scope); } ret = inet_pton(AF_INET6, argv[1], &sin60->sin6_addr.s6_addr); if (ret <= 0) { err(1, "%s: %s", progname, "inet_pton"); } if(fork()) { for(i=0; i<2; i++) { sleep(1); s1 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); if (s1 < 0) { err(1, "%s: %s", progname, "socket"); } ret = connect(s1, (struct sockaddr *)&ss0, ss0.ss_len); if (ret < 0) { err(1, "%s: %s", progname, "connect"); } len = sizeof(ss); ret = getsockname(s1, (struct sockaddr *)&ss, &len); if (ret < 0) { err(1, "%s: %s", progname, "getsockname"); } ret = send(s1, &ss, ss.ss_len, 0); if (ret < 0) { err(1, "%s: %s", progname, "send"); } close(s1); } } else { for(i=0; i<2; i++) { s2 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); if (s2 < 0) { err(1, "%s: %s", progname, "socket"); } ret = bind(s2, (struct sockaddr *)&ss0, ss0.ss_len); if (ret < 0) { err(1, "%s: %s", progname, "bind"); } listen(s2, 5); fromlen = sizeof(ss); if((s3 = accept(s2, (struct sockaddr *)&ss, &fromlen)) > 0) { ret = recv(s3, buf, 1024, 0); if (ret < 0) { err(1, "%s: %s", progname, "recv"); } if (memcmp(&buf, &ss, ss.ss_len) != 0) { printf("accept->receive: [Failed]\n"); } } len = sizeof(ss); ret = getpeername(s3, (struct sockaddr *)&ss, &len); if (ret < 0) { err(1, "%s: %s", progname, "getpeername"); } if (memcmp(&buf, &ss, ss.ss_len) != 0) { printf("accept->getpeername: [Failed]\n"); } close(s3); close(s2); sleep(1); } } return 1; }