Module Name: src Committed By: jruoho Date: Tue Mar 6 10:32:15 UTC 2012
Modified Files: src/tests/lib/libc/sys: t_stat.c Log Message: A test case for PR kern/46077: fstat() returns EINVAL on dup'd connected socket. Expected failure on NetBSD x86, 5.0 - 6.0. Does not fail on Linux. To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/tests/lib/libc/sys/t_stat.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/sys/t_stat.c diff -u src/tests/lib/libc/sys/t_stat.c:1.2 src/tests/lib/libc/sys/t_stat.c:1.3 --- src/tests/lib/libc/sys/t_stat.c:1.2 Sun Oct 16 08:28:10 2011 +++ src/tests/lib/libc/sys/t_stat.c Tue Mar 6 10:32:15 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: t_stat.c,v 1.2 2011/10/16 08:28:10 jruoho Exp $ */ +/* $NetBSD: t_stat.c,v 1.3 2012/03/06 10:32:15 jruoho Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -29,11 +29,14 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: t_stat.c,v 1.2 2011/10/16 08:28:10 jruoho Exp $"); +__RCSID("$NetBSD: t_stat.c,v 1.3 2012/03/06 10:32:15 jruoho Exp $"); #include <sys/stat.h> +#include <sys/socket.h> #include <sys/types.h> +#include <arpa/inet.h> + #include <atf-c.h> #include <errno.h> #include <fcntl.h> @@ -314,6 +317,51 @@ ATF_TC_CLEANUP(stat_size, tc) (void)unlink(path); } +ATF_TC(stat_socket); +ATF_TC_HEAD(stat_socket, tc) +{ + atf_tc_set_md_var(tc, "descr", "Test fstat(2) with a socket"); +} + +ATF_TC_BODY(stat_socket, tc) +{ + struct sockaddr_in addr; + struct stat st; + uint32_t iaddr; + int fd, flags; + + atf_tc_expect_fail("PR kern/46077"); + + (void)memset(&st, 0, sizeof(struct stat)); + (void)memset(&addr, 0, sizeof(struct sockaddr_in)); + + fd = socket(AF_INET, SOCK_STREAM, 0); + ATF_REQUIRE(fd >= 0); + + flags = fcntl(fd, F_GETFL); + + ATF_REQUIRE(flags != -1); + ATF_REQUIRE(fcntl(fd, F_SETFL, flags | O_NONBLOCK) != -1); + ATF_REQUIRE(inet_pton(AF_INET, "127.0.0.1", &iaddr) == 1); + + addr.sin_port = htons(42); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = iaddr; + + errno = 0; + + ATF_REQUIRE_ERRNO(EINPROGRESS, + connect(fd, (struct sockaddr *)&addr, + sizeof(struct sockaddr_in)) == -1); + + errno = 0; + + if (fstat(fd, &st) != 0 || errno != 0) + atf_tc_fail("fstat(2) failed for a EINPROGRESS socket"); + + (void)close(fd); +} + ATF_TC_WITH_CLEANUP(stat_symlink); ATF_TC_HEAD(stat_symlink, tc) { @@ -363,6 +411,7 @@ ATF_TP_ADD_TCS(tp) ATF_TP_ADD_TC(tp, stat_mtime); ATF_TP_ADD_TC(tp, stat_perm); ATF_TP_ADD_TC(tp, stat_size); + ATF_TP_ADD_TC(tp, stat_socket); ATF_TP_ADD_TC(tp, stat_symlink); return atf_no_error();