Date: Fri, 5 Sep 2003 13:07:29 +0300 From: Jan Mikael Melen <jmgm@iki.fi> To: freebsd-net@freebsd.org Cc: "Simon L. Nielsen" <simon@FreeBSD.org> Subject: Re: Fatal trap 12 in binding V6 socket in FreeBSD 5.1-p2 Message-ID: <200309051307.29056.jmgm@iki.fi> In-Reply-To: <20030905095448.GA411@FreeBSD.org> References: <200309051240.02622.jmgm@iki.fi> <200309051251.14970.jmgm@iki.fi> <20030905095448.GA411@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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 <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <err.h> 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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309051307.29056.jmgm>