Date: Tue, 1 Sep 2009 21:56:46 GMT From: Bruce Cran <bruce@cran.org.uk> To: freebsd-gnats-submit@FreeBSD.org Subject: kern/138465: [patch] add data verification to tools/regression/sockets/sendfile Message-ID: <200909012156.n81Luk5Z009790@www.freebsd.org> Resent-Message-ID: <200909012200.n81M0CM5016234@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 138465 >Category: kern >Synopsis: [patch] add data verification to tools/regression/sockets/sendfile >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Tue Sep 01 22:00:11 UTC 2009 >Closed-Date: >Last-Modified: >Originator: Bruce Cran >Release: 8.0-BETA3 >Organization: >Environment: FreeBSD gluon.draftnet 8.0-BETA3 FreeBSD 8.0-BETA3 #1: Mon Aug 31 08:45:18 BST 2009 brucec@gluon.draftnet:/usr/obj/usr/src/sys/GENERIC i386 >Description: Data corruption is known to occur when a file stored in a tmpfs filesystem is transferred using sendfile(2). The attached patch adds a step to verify that the data hasn't been corrupted by adding an MD5 checksum field to the header in tools/regression/sockets/sendfile. >How-To-Repeat: >Fix: Patch attached with submission follows: diff -r -U3 sendfile.orig/Makefile sendfile/Makefile --- sendfile.orig/Makefile 2009-08-03 09:13:06.000000000 +0100 +++ sendfile/Makefile 2009-09-01 20:37:37.000000000 +0100 @@ -5,5 +5,6 @@ PROG= sendfile NO_MAN= WARNS?= 6 +LDADD = -lmd .include <bsd.prog.mk> diff -r -U3 sendfile.orig/sendfile.c sendfile/sendfile.c --- sendfile.orig/sendfile.c 2009-08-03 09:13:06.000000000 +0100 +++ sendfile/sendfile.c 2009-09-01 22:50:05.000000000 +0100 @@ -34,6 +34,7 @@ #include <err.h> #include <limits.h> +#include <md5.h> #include <signal.h> #include <stdint.h> #include <stdio.h> @@ -57,11 +58,15 @@ u_int32_t th_header_length; u_int32_t th_offset; u_int32_t th_length; + char th_md5[33]; }; pid_t child_pid, parent_pid; int listen_socket; int file_fd; +char path[PATH_MAX]; + +void cleanup(void); static int test_th(struct test_header *th, u_int32_t *header_length, u_int32_t *offset, @@ -105,7 +110,9 @@ u_int32_t header_length, offset, length, counter; struct test_header th; ssize_t len; - char ch; + char buf[10240]; + MD5_CTX md5ctx; + char *rxmd5; len = read(accept_socket, &th, sizeof(th)); if (len < 0) @@ -116,19 +123,30 @@ if (test_th(&th, &header_length, &offset, &length) == 0) errx(1, "test_th: bad"); + MD5Init(&md5ctx); + counter = 0; while (1) { - len = read(accept_socket, &ch, sizeof(ch)); + len = read(accept_socket, buf, sizeof(buf)); if (len < 0) err(1, "read"); if (len == 0) break; - counter++; - /* XXXRW: Validate byte here. */ + counter += len; + MD5Update(&md5ctx, buf, len); } + if (counter != header_length + length) errx(1, "receive_test: expected (%d, %d) received %d", header_length, length, counter); + + rxmd5 = MD5End(&md5ctx, NULL); + + if (memcmp(th.th_md5, rxmd5, 33) != 0) + err(1, "receive_test: expected %s, received %s", + th.th_md5, rxmd5); + + free(rxmd5); } static void @@ -171,12 +189,13 @@ init_th(struct test_header *th, u_int32_t header_length, u_int32_t offset, u_int32_t length) { - bzero(th, sizeof(*th)); th->th_magic = htonl(TEST_MAGIC); th->th_header_length = htonl(header_length); th->th_offset = htonl(offset); th->th_length = htonl(length); + + MD5FileChunk(path, th->th_md5, offset, length); } static void @@ -196,6 +215,14 @@ if (len != 0) errx(1, "lseek: %zd", len); + if (length == 0) + { + struct stat st; + if (fstat(file_fd, &st) < 0) + err(1, "fstat"); + length = st.st_size - offset; + } + init_th(&th, header_length, offset, length); len = write(connect_socket, &th, sizeof(th)); @@ -311,14 +338,23 @@ (void)kill(child_pid, SIGKILL); } +void +cleanup(void) +{ + if (*path != '\0') + unlink(path); +} + int main(void) { - char path[PATH_MAX], *page_buffer; + char *page_buffer; struct sockaddr_in sin; int pagesize; ssize_t len; + *path = '\0'; + pagesize = getpagesize(); page_buffer = malloc(TEST_PAGES * pagesize); if (page_buffer == NULL) @@ -337,7 +373,7 @@ snprintf(path, PATH_MAX, "/tmp/sendfile.XXXXXXXXXXXX"); file_fd = mkstemp(path); - (void)unlink(path); + atexit(cleanup); len = write(file_fd, page_buffer, TEST_PAGES * pagesize); if (len < 0) >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909012156.n81Luk5Z009790>