diff options
author | Jim Jagielski <jim@apache.org> | 2013-01-08 20:49:50 +0000 |
---|---|---|
committer | Jim Jagielski <jim@apache.org> | 2013-01-08 20:49:50 +0000 |
commit | 18eb5b7bbba4ab254bd92381a553fa583a85a98d (patch) | |
tree | 82e2fbd180c9e016975ff28d679d9d0f20445278 | |
parent | 2d854077e308522fc9ab07987ef69d15ebb53c14 (diff) | |
download | httpd-18eb5b7bbba4ab254bd92381a553fa583a85a98d.tar.gz |
Merge r1331110 from trunk:
Replace use of apr_file_write() with apr_file_write_full() to prevent
incomplete writes.
Add comments in some places where error handling/logging is missing.
PR: 53131.
Submitted by: Nicolas Viennot <apache viennot biz>, Stefan Fritsch
Submitted by: sf
Reviewed/backported by: jim
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1430514 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | STATUS | 12 | ||||
-rw-r--r-- | modules/cache/mod_cache_disk.c | 21 | ||||
-rw-r--r-- | modules/dav/fs/lock.c | 2 | ||||
-rw-r--r-- | modules/filters/mod_ext_filter.c | 4 | ||||
-rw-r--r-- | modules/generators/mod_cgid.c | 2 | ||||
-rw-r--r-- | modules/mappers/mod_rewrite.c | 8 | ||||
-rw-r--r-- | support/rotatelogs.c | 17 |
8 files changed, 25 insertions, 45 deletions
@@ -2,6 +2,10 @@ Changes with Apache 2.4.4 + *) various modules, rotatelogs: Replace use of apr_file_write() with + apr_file_write_full() to prevent incomplete writes. PR 53131. + [Nicolas Viennot <apache viennot biz>, Stefan Fritsch] + *) ab: Support socket timeout (-s timeout). [Guido Serra <zeph fsfe org>] @@ -91,18 +91,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * Replace use of apr_file_write() with apr_file_write_full() to prevent - incomplete writes. - Add comments in some places where error handling/logging is missing. - PR: 53131. - Submitted by: Nicolas Viennot <apache viennot biz>, Stefan Fritsch - Not critical for 2.4.4. - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1331110 - 2.4.x patch: Trunk patch works except for modules/slotmem/mod_slotmem_shm.c - which should be ommitted (already done in r1400951). - +1: rjung, jim - -1: jorton on mod_log_*.c parts per <20130108093848.GA7521@redhat.com> - +1: jorton on non-mod_log_*.c parts PATCHES PROPOSED TO BACKPORT FROM TRUNK: diff --git a/modules/cache/mod_cache_disk.c b/modules/cache/mod_cache_disk.c index ab8429fc61..8427e8fd60 100644 --- a/modules/cache/mod_cache_disk.c +++ b/modules/cache/mod_cache_disk.c @@ -757,8 +757,7 @@ static apr_status_t store_array(apr_file_t *fd, apr_array_header_t* arr) iov[1].iov_base = CRLF; iov[1].iov_len = sizeof(CRLF) - 1; - rv = apr_file_writev(fd, (const struct iovec *) &iov, 2, - &amt); + rv = apr_file_writev_full(fd, (const struct iovec *) &iov, 2, &amt); if (rv != APR_SUCCESS) { return rv; } @@ -767,8 +766,7 @@ static apr_status_t store_array(apr_file_t *fd, apr_array_header_t* arr) iov[0].iov_base = CRLF; iov[0].iov_len = sizeof(CRLF) - 1; - return apr_file_writev(fd, (const struct iovec *) &iov, 1, - &amt); + return apr_file_writev_full(fd, (const struct iovec *) &iov, 1, &amt); } static apr_status_t read_table(cache_handle_t *handle, request_rec *r, @@ -916,8 +914,7 @@ static apr_status_t store_table(apr_file_t *fd, apr_table_t *table) iov[3].iov_base = CRLF; iov[3].iov_len = sizeof(CRLF) - 1; - rv = apr_file_writev(fd, (const struct iovec *) &iov, 4, - &amt); + rv = apr_file_writev_full(fd, (const struct iovec *) &iov, 4, &amt); if (rv != APR_SUCCESS) { return rv; } @@ -925,8 +922,7 @@ static apr_status_t store_table(apr_file_t *fd, apr_table_t *table) } iov[0].iov_base = CRLF; iov[0].iov_len = sizeof(CRLF) - 1; - rv = apr_file_writev(fd, (const struct iovec *) &iov, 1, - &amt); + rv = apr_file_writev_full(fd, (const struct iovec *) &iov, 1, &amt); return rv; } @@ -992,7 +988,7 @@ static apr_status_t write_headers(cache_handle_t *h, request_rec *r) } amt = sizeof(format); - rv = apr_file_write(dobj->vary.tempfd, &format, &amt); + rv = apr_file_write_full(dobj->vary.tempfd, &format, amt, NULL); if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, APLOGNO(00722) "could not write to vary file %s", @@ -1003,8 +999,8 @@ static apr_status_t write_headers(cache_handle_t *h, request_rec *r) } amt = sizeof(h->cache_obj->info.expire); - rv = apr_file_write(dobj->vary.tempfd, &h->cache_obj->info.expire, - &amt); + rv = apr_file_write_full(dobj->vary.tempfd, + &h->cache_obj->info.expire, amt, NULL); if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, APLOGNO(00723) "could not write to vary file %s", @@ -1069,7 +1065,8 @@ static apr_status_t write_headers(cache_handle_t *h, request_rec *r) iov[1].iov_base = (void*)dobj->name; iov[1].iov_len = disk_info.name_len; - rv = apr_file_writev(dobj->hdrs.tempfd, (const struct iovec *) &iov, 2, &amt); + rv = apr_file_writev_full(dobj->hdrs.tempfd, (const struct iovec *) &iov, + 2, &amt); if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r, APLOGNO(00726) "could not write info to header file %s", diff --git a/modules/dav/fs/lock.c b/modules/dav/fs/lock.c index 331d4e8314..a15b4b91c7 100644 --- a/modules/dav/fs/lock.c +++ b/modules/dav/fs/lock.c @@ -845,7 +845,7 @@ static dav_error * dav_fs_save_locknull_list(apr_pool_t *p, const char *dirpath, } amt = pbuf->cur_len; - if ((rv = apr_file_write(file, pbuf->buf, &amt)) != APR_SUCCESS + if ((rv = apr_file_write_full(file, pbuf->buf, amt, &amt)) != APR_SUCCESS || amt != pbuf->cur_len) { err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, rv, apr_psprintf(p, diff --git a/modules/filters/mod_ext_filter.c b/modules/filters/mod_ext_filter.c index fc1ed2ce72..658c121a0b 100644 --- a/modules/filters/mod_ext_filter.c +++ b/modules/filters/mod_ext_filter.c @@ -681,9 +681,9 @@ static apr_status_t pass_data_to_filter(ap_filter_t *f, const char *data, do { tmplen = len - bytes_written; - rv = apr_file_write(ctx->proc->in, + rv = apr_file_write_full(ctx->proc->in, (const char *)data + bytes_written, - &tmplen); + tmplen, &tmplen); bytes_written += tmplen; if (rv != APR_SUCCESS && !APR_STATUS_IS_EAGAIN(rv)) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, APLOGNO(01461) diff --git a/modules/generators/mod_cgid.c b/modules/generators/mod_cgid.c index 1155bd7501..56d3524330 100644 --- a/modules/generators/mod_cgid.c +++ b/modules/generators/mod_cgid.c @@ -1155,7 +1155,7 @@ static int log_script(request_rec *r, cgid_server_conf * conf, int ret, apr_file_puts("%stdout\n", f); first = 0; } - apr_file_write(f, buf, &len); + apr_file_write_full(f, buf, len, NULL); apr_file_puts("\n", f); } diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c index 2193bfd0ee..cd293013d7 100644 --- a/modules/mappers/mod_rewrite.c +++ b/modules/mappers/mod_rewrite.c @@ -1403,9 +1403,10 @@ static char *lookup_map_program(request_rec *r, apr_file_t *fpin, /* write out the request key */ #ifdef NO_WRITEV nbytes = strlen(key); - apr_file_write(fpin, key, &nbytes); + /* XXX: error handling */ + apr_file_write_full(fpin, key, nbytes, NULL); nbytes = 1; - apr_file_write(fpin, "\n", &nbytes); + apr_file_write_full(fpin, "\n", nbytes, NULL); #else iova[0].iov_base = key; iova[0].iov_len = strlen(key); @@ -1413,7 +1414,8 @@ static char *lookup_map_program(request_rec *r, apr_file_t *fpin, iova[1].iov_len = 1; niov = 2; - apr_file_writev(fpin, iova, niov, &nbytes); + /* XXX: error handling */ + apr_file_writev_full(fpin, iova, niov, &nbytes); #endif buf = apr_palloc(r->pool, REWRITE_PRG_MAP_BUF + 1); diff --git a/support/rotatelogs.c b/support/rotatelogs.c index 96c40e35d2..9bc3328599 100644 --- a/support/rotatelogs.c +++ b/support/rotatelogs.c @@ -459,7 +459,7 @@ static void doRotate(rotate_config_t *config, rotate_status_t *status) fprintf(stderr, "Error truncating the file %s\n", status->current.name); exit(2); } - if (apr_file_write(status->current.fd, status->errbuf, &nWrite) != APR_SUCCESS) { + if (apr_file_write_full(status->current.fd, status->errbuf, nWrite, NULL) != APR_SUCCESS) { fprintf(stderr, "Error writing to the file %s\n", status->current.name); exit(2); } @@ -687,18 +687,7 @@ int main (int argc, const char * const argv[]) } nWrite = nRead; - rv = apr_file_write(status.current.fd, buf, &nWrite); - if (rv == APR_SUCCESS && nWrite != nRead) { - /* buffer partially written, which for rotatelogs means we encountered - * an error such as out of space or quota or some other limit reached; - * try to write the rest so we get the real error code - */ - apr_size_t nWritten = nWrite; - - nRead = nRead - nWritten; - nWrite = nRead; - rv = apr_file_write(status.current.fd, buf + nWritten, &nWrite); - } + rv = apr_file_write_full(status.current.fd, buf, nWrite, &nWrite); if (nWrite != nRead) { char strerrbuf[120]; apr_off_t cur_offset; @@ -715,7 +704,7 @@ int main (int argc, const char * const argv[]) rv, cur_offset, status.nMessCount, strerrbuf); nWrite = strlen(status.errbuf); apr_file_trunc(status.current.fd, 0); - if (apr_file_write(status.current.fd, status.errbuf, &nWrite) != APR_SUCCESS) { + if (apr_file_write_full(status.current.fd, status.errbuf, nWrite, NULL) != APR_SUCCESS) { fprintf(stderr, "Error writing to the file %s\n", status.current.name); exit(2); } |