Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F151379824
D19523.id54879.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D19523.id54879.diff
View Options
Index: lib/libc/tests/sys/Makefile
===================================================================
--- lib/libc/tests/sys/Makefile
+++ lib/libc/tests/sys/Makefile
@@ -8,6 +8,7 @@
ATF_TESTS_C+= brk_test
.endif
ATF_TESTS_C+= queue_test
+ATF_TESTS_C+= sendfile_test
# TODO: clone, lwp_create, lwp_ctl, posix_fadvise, recvmmsg,
# swapcontext
Index: lib/libc/tests/sys/sendfile_test.c
===================================================================
--- /dev/null
+++ lib/libc/tests/sys/sendfile_test.c
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: head/lib/libc/tests/sys/sendfile_test.c 343362 2019-01-23 22:00:17Z ngie $");
+__FBSDID("$FreeBSD: stable/12/lib/libc/tests/sys/sendfile_test.c 343362 2019-01-23 22:00:17Z ngie $");
#include <sys/param.h>
#include <sys/mman.h>
@@ -97,24 +97,33 @@
static void
resolve_localhost(struct addrinfo **res, int domain, int type, int port)
{
+ const char *host;
char *serv;
struct addrinfo hints;
int error;
- ATF_REQUIRE_MSG(domain == AF_INET || domain == AF_INET6,
- "unhandled domain: %d", domain);
+ switch (domain) {
+ case AF_INET:
+ host = "127.0.0.1";
+ break;
+ case AF_INET6:
+ host = "::1";
+ break;
+ default:
+ atf_tc_fail("unhandled domain: %d", domain);
+ }
ATF_REQUIRE_MSG(asprintf(&serv, "%d", port) >= 0,
"asprintf failed: %s", strerror(errno));
memset(&hints, 0, sizeof(hints));
hints.ai_family = domain;
- hints.ai_flags = AI_ADDRCONFIG|AI_NUMERICSERV;
+ hints.ai_flags = AI_ADDRCONFIG|AI_NUMERICSERV|AI_NUMERICHOST;
hints.ai_socktype = type;
- error = getaddrinfo("localhost", serv, &hints, res);
+ error = getaddrinfo(host, serv, &hints, res);
ATF_REQUIRE_EQ_MSG(error, 0,
- "getaddrinfo failed: %s", gai_strerror(errno));
+ "getaddrinfo failed: %s", gai_strerror(error));
free(serv);
}
@@ -147,6 +156,8 @@
"Will try to connect to host='%s', address_family=%d, "
"socket_type=%d\n",
host, res->ai_family, res->ai_socktype);
+ /* Avoid a double print when forked by flushing. */
+ fflush(stdout);
sock = make_socket(res->ai_family, res->ai_socktype, res->ai_protocol);
error = connect(sock, (struct sockaddr*)res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
@@ -178,6 +189,8 @@
"Will try to bind socket to host='%s', address_family=%d, "
"socket_type=%d\n",
host, res->ai_family, res->ai_socktype);
+ /* Avoid a double print when forked by flushing. */
+ fflush(stdout);
error = bind(sock, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
ATF_REQUIRE_EQ_MSG(error, 0, "bind failed: %s", strerror(errno));
@@ -195,11 +208,17 @@
static void
server_cat(const char *dest_filename, int server_sock, size_t len)
{
- void *buffer;
+ char *buffer, *buf_window_ptr;
int recv_sock;
- ssize_t received_bytes;
+ size_t buffer_size;
+ ssize_t received_bytes, recv_ret;
- buffer = calloc(len + 1, sizeof(char));
+ /*
+ * Ensure that there isn't excess data sent across the wire by
+ * capturing 10 extra bytes (plus 1 for nul).
+ */
+ buffer_size = len + 10 + 1;
+ buffer = calloc(buffer_size, sizeof(char));
if (buffer == NULL)
err(1, "malloc failed");
@@ -207,32 +226,26 @@
if (recv_sock == -1)
err(1, "accept failed");
- /*
- * XXX: this assumes the simplest case where all data is received in a
- * single recv(2) call.
- */
- if (recv(recv_sock, buffer, len, 0) == -1)
- err(1, "recv failed");
+ buf_window_ptr = buffer;
+ received_bytes = 0;
+ do {
+ recv_ret = recv(recv_sock, buf_window_ptr,
+ buffer_size - received_bytes, 0);
+ if (recv_ret <= 0)
+ break;
+ buf_window_ptr += recv_ret;
+ received_bytes += recv_ret;
+ } while (received_bytes < buffer_size);
atf_utils_create_file(dest_filename, "%s", buffer);
- /*
- * This recv(2) call helps ensure the amount of sent data is exactly
- * what was specified by `len`.
- */
- received_bytes = recv(recv_sock, buffer, len, 0);
- switch (received_bytes) {
- case -1:
- err(1, "recv failed");
- case 0:
- break;
- default:
- errx(1, "received unexpected data: %s", buffer);
- }
-
(void)close(recv_sock);
(void)close(server_sock);
free(buffer);
+
+ if (received_bytes != len)
+ errx(1, "received unexpected data: %zd != %zd", received_bytes,
+ len);
}
static int
@@ -268,7 +281,7 @@
verify_source_and_dest(const char* dest_filename, int src_fd, off_t offset,
size_t nbytes)
{
- void *dest_pointer, *src_pointer;
+ char *dest_pointer, *src_pointer;
off_t dest_file_size, src_file_size;
size_t length;
int dest_fd;
@@ -290,7 +303,7 @@
ATF_REQUIRE_EQ_MSG(dest_file_size, length,
"number of bytes written out to %s (%ju) doesn't match the "
- "expected number of bytes (%ju)", dest_filename, dest_file_size,
+ "expected number of bytes (%zu)", dest_filename, dest_file_size,
length);
ATF_REQUIRE_EQ_MSG(0, lseek(src_fd, offset, SEEK_SET),
@@ -384,7 +397,7 @@
static void
fd_positive_shm_test(int domain)
{
- void *shm_pointer;
+ char *shm_pointer;
off_t offset;
size_t nbytes, pattern_size;
pid_t server_pid;
@@ -658,10 +671,6 @@
offset = 0;
nbytes = 0;
- atf_tc_expect_fail(
- "The header/trailer testcases fail today with a data mismatch; "
- "bug # 234809");
-
for (i = 0; i < nitems(testcases); i++) {
struct sf_hdtr hdtr;
char *pattern;
@@ -687,9 +696,9 @@
client_sock = setup_tcp_client(domain, port);
rc = asprintf(&pattern, "%s%s%s",
- testcases[i].include_headers ? headers[0].iov_base : "",
+ testcases[i].include_headers ? (char *)headers[0].iov_base : "",
DETERMINISTIC_PATTERN,
- testcases[i].include_trailers ? trailers[0].iov_base : "");
+ testcases[i].include_trailers ? (char *)trailers[0].iov_base : "");
ATF_REQUIRE_MSG(rc != -1, "asprintf failed: %s", strerror(errno));
atf_utils_create_file(SOURCE_FILE ".full", "%s", pattern);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 9, 12:35 AM (14 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31124313
Default Alt Text
D19523.id54879.diff (5 KB)
Attached To
Mode
D19523: MFC r343362,r343365,r343367,r343368,r343461,r343751,r344310:
Attached
Detach File
Event Timeline
Log In to Comment