-*- coding: utf-8 -*-
Changes with Apache 2.5.0
+ *) 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]
+
*) core: Fix segfault in logging if r->useragent_addr or c->client_addr is
unset. [Stefan Fritsch]
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;
}
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,
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;
}
}
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;
}
}
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",
}
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",
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",
}
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,
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)
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);
}
static void flush_log(buffered_log *buf)
{
if (buf->outcnt && buf->handle != NULL) {
- apr_file_write(buf->handle, buf->outbuf, &buf->outcnt);
+ /* XXX: error handling */
+ apr_file_write_full(buf->handle, buf->outbuf, buf->outcnt, NULL);
buf->outcnt = 0;
}
}
s += strl[i];
}
- rv = apr_file_write((apr_file_t*)handle, str, &len);
+ rv = apr_file_write_full((apr_file_t*)handle, str, len, NULL);
return rv;
}
s += strl[i];
}
w = len;
- rv = apr_file_write(buf->handle, str, &w);
+ rv = apr_file_write_full(buf->handle, str, w, NULL);
}
else {
*h.pos++ = '\n';
n = h.count-1;
- rv = apr_file_write(cfg->fd, h.log, &n);
+ rv = apr_file_write_full(cfg->fd, h.log, n, &n);
ap_assert(rv == APR_SUCCESS && n == h.count-1);
apr_table_setn(r->notes, "forensic-id", id);
s = apr_pstrcat(r->pool, "-", id, "\n", NULL);
l = n = strlen(s);
- rv = apr_file_write(cfg->fd, s, &n);
+ rv = apr_file_write_full(cfg->fd, s, n, &n);
ap_assert(rv == APR_SUCCESS && n == l);
return OK;
/* 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);
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);
}
nbytes = (slotmem->desc.size * slotmem->desc.num) +
(slotmem->desc.num * sizeof(char)) + AP_UNSIGNEDINT_OFFSET;
- apr_file_write(fp, slotmem->persist, &nbytes);
+ /* XXX: Error handling */
+ apr_file_write_full(fp, slotmem->persist, &nbytes, NULL);
apr_file_close(fp);
}
}
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);
}
}
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;
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);
}