From: Ruediger Pluem Date: Fri, 24 Sep 2021 06:42:04 +0000 (+0000) Subject: * Correctly handle errors returned by dav providers on REPORT requests. X-Git-Tag: 2.5.0-alpha2-ci-test-only~785 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f08c2bfa117ea406e1ea03d683e5e7df34da7f9;p=thirdparty%2Fapache%2Fhttpd.git * Correctly handle errors returned by dav providers on REPORT requests. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1893589 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/changes-entries/mod_dav_report_err.txt b/changes-entries/mod_dav_report_err.txt new file mode 100644 index 00000000000..c709e002116 --- /dev/null +++ b/changes-entries/mod_dav_report_err.txt @@ -0,0 +1,2 @@ + *) mod_dav: Correctly handle errors returned by dav providers on REPORT + requests. [Ruediger Pluem] diff --git a/modules/dav/main/mod_dav.c b/modules/dav/main/mod_dav.c index 9b73867a72f..1a4b0663f07 100644 --- a/modules/dav/main/mod_dav.c +++ b/modules/dav/main/mod_dav.c @@ -4403,10 +4403,32 @@ static int dav_method_report(request_rec *r) /* set up defaults for the report response */ r->status = HTTP_OK; ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + err = NULL; /* run report hook */ result = dav_run_deliver_report(r, resource, doc, r->output_filters, &err); + if (err != NULL) { + + if (! r->sent_bodyct) { + /* No data has been sent to client yet; throw normal error. */ + return dav_handle_err(r, err, NULL); + } + + /* If an error occurred during the report delivery, there's + basically nothing we can do but abort the connection and + log an error. This is one of the limitations of HTTP; it + needs to "know" the entire status of the response before + generating it, which is just impossible in these streamy + response situations. */ + err = dav_push_error(r->pool, err->status, 0, + "Provider encountered an error while streaming" + " a REPORT response.", err); + dav_log_err(r, err, APLOG_ERR); + r->connection->aborted = 1; + + return DONE; + } switch (result) { case OK: return DONE; @@ -4414,27 +4436,7 @@ static int dav_method_report(request_rec *r) /* No one handled the report */ return HTTP_NOT_IMPLEMENTED; default: - if ((err) != NULL) { - - if (! r->sent_bodyct) { - /* No data has been sent to client yet; throw normal error. */ - return dav_handle_err(r, err, NULL); - } - - /* If an error occurred during the report delivery, there's - basically nothing we can do but abort the connection and - log an error. This is one of the limitations of HTTP; it - needs to "know" the entire status of the response before - generating it, which is just impossible in these streamy - response situations. */ - err = dav_push_error(r->pool, err->status, 0, - "Provider encountered an error while streaming" - " a REPORT response.", err); - dav_log_err(r, err, APLOG_ERR); - r->connection->aborted = 1; - - return DONE; - } + return DONE; } return DONE;