#2185 closed defect (invalid)
ngx_write_chain_to_file cannot be closed file when write error
| Reported by: | Owned by: | ||
|---|---|---|---|
| Priority: | minor | Milestone: | |
| Component: | documentation | Version: | 1.19.x |
| Keywords: | Cc: | ||
| uname -a: | Linux 11143d1c63c9 4.19.76-linuxkit #1 SMP Tue May 26 11:42:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux | ||
| nginx -V: |
nginx version: nginx/1.19.9
built by gcc 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) built with OpenSSL 1.1.1k 25 Mar 2021 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --with-pcre-jit --with-http_ssl_module --with-file-aio --with-threads --with-openssl=/usr/local/src/openssl-1.1.1k |
||
Description
ngx_write_chain_to_file cannot be closed file when ngx_write_file returns NGX_ERROR.
It seems to be a same issue below. I'm not sure why here is to be missing file closing.
https://github.com/nginx/nginx/pull/52/
http://hg.nginx.org/nginx/rev/4f30f75dbdf3
patch
diff --git a/src/os/unix/ngx_files.c b/src/os/unix/ngx_files.c
index 1c82a8ea..7d3d5be8 100644
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -300,9 +300,13 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
/* use pwrite() if there is the only buf in a chain */
if (cl->next == NULL) {
- return ngx_write_file(file, cl->buf->pos,
+ n = ngx_write_file(file, cl->buf->pos,
(size_t) (cl->buf->last - cl->buf->pos),
offset);
+ if (n == NGX_ERROR) {
+ (void) ngx_close_file(file->fd);
+ }
+ return n;
}
total = 0;
@@ -321,6 +325,7 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, off_t offset,
iovs[0].iov_len, offset);
if (n == NGX_ERROR) {
+ (void) ngx_close_file(file->fd);
return n;
}
@@ -330,6 +335,7 @@ ngx_write_chain_to_file(ngx_file_t *file, ngx_chain_t *cl, o
ff_t offset,
n = ngx_writev_file(file, &vec, offset);
if (n == NGX_ERROR) {
+ (void) ngx_close_file(file->fd);
return n;
}
Change History (3)
comment:1 by , 4 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
comment:2 by , 4 years ago
Thanks comment.
In case ngx_write_chain_to_file has been called by ngx_event_pipe which returns NGX_ABORT for failing ngx_write_file(in this case, ngx_event_pipe is only called from ngx_http_upstream, all of them return ngx_http_upstream_finalize_request(r, u, NGX_ERROR); ), I considered that it should be closed the file stream to prevent from resource leaks.
It might have another procedure which sweep and close file stream which remains opening, but I cannot find it.
comment:3 by , 4 years ago
All files opened during request processing are bound to the request pool, and closed automatically once the request is freed.

Since ngx_write_chain_to_file() does not open the file, it's not its responsibility to close it.