From cd8920a28dbdc0eeb2c58bacd80b7a215baecbd4 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 11 Mar 2011 21:30:24 +0000 Subject: [PATCH] libmicrohttpd] bug in MHD_create_response_from_fd_at_offset() From: Eivind Sarto To: "libmicrohttpd@gnu.org" Date: Today 09:32:21 pm Spam Status: Spamassassin 0% probability of being spam. Full report: Probability=No, score=-2.6 required=7.0 tests=BAYES_00 autolearn=ham version=3.2.5-tuminfo_1 There appears to be a bug in MHD_create_response_from_fd_at_offset(). Calling this function with anything other than a zero offset will cause wrong data or no data (sendfile fails if length < 0). If you use this call with any application that uses ranges, this bug will trigger. In src/daemon/daemon.c: send_param_adapter() ..... /* can use sendfile */ offset = (off_t) connection->response_write_position + connection->response->fd_off; #ifdef BUGFIX /* correct */ left = connection->response->total_size - connection->response_write_position; #else left = connection->response->total_size - offset; #endif if (left > SSIZE_MAX) left = SSIZE_MAX; /* cap at return value limit */ ret = sendfile (connection->socket_fd, fd, &offset, left); -eivind --- AUTHORS | 1 + ChangeLog | 3 +++ src/daemon/daemon.c | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 8c663bc4..38b76a29 100644 --- a/AUTHORS +++ b/AUTHORS @@ -29,6 +29,7 @@ Piotr Grzybowski Gerrit Telkamp Erik Slagter Andreas Wehrmann +Eivind Sarto Documentation contributions also came from: Marco Maggi diff --git a/ChangeLog b/ChangeLog index c9275bc6..f914a7a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +Fri Mar 11 22:25:29 CET 2011 + Fixing bug in MHD_create_response_from_fd_at_offset with non-zero offsets. -ES + Sat Mar 5 22:00:36 CET 2011 Do not use POLLRDHUP, which causes build errors on OS X / OpenSolaris (#1667). -CG diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c index efa8b018..23836168 100644 --- a/src/daemon/daemon.c +++ b/src/daemon/daemon.c @@ -746,7 +746,7 @@ send_param_adapter (struct MHD_Connection *connection, { /* can use sendfile */ offset = (off_t) connection->response_write_position + connection->response->fd_off; - left = connection->response->total_size - offset; + left = connection->response->total_size - connection->response_write_position; if (left > SSIZE_MAX) left = SSIZE_MAX; /* cap at return value limit */ ret = sendfile (connection->socket_fd,