Fixed ngx_open_cached_file() error handling.

If of.err is 0, it means that there was a memory allocation error
and no further logging and/or processing is needed.  The of.failed
string can be only accessed if of.err is not 0.
This commit is contained in:
Sergey Kandaurov 2017-03-28 14:21:38 +03:00
parent eb017e75cf
commit 9ad18e43ac
5 changed files with 24 additions and 3 deletions

View File

@ -217,13 +217,13 @@ ngx_http_index_handler(ngx_http_request_t *r)
if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
!= NGX_OK) != NGX_OK)
{ {
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, of.err,
"%s \"%s\" failed", of.failed, path.data);
if (of.err == 0) { if (of.err == 0) {
return NGX_HTTP_INTERNAL_SERVER_ERROR; return NGX_HTTP_INTERNAL_SERVER_ERROR;
} }
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, of.err,
"%s \"%s\" failed", of.failed, path.data);
#if (NGX_HAVE_OPENAT) #if (NGX_HAVE_OPENAT)
if (of.err == NGX_EMLINK if (of.err == NGX_EMLINK
|| of.err == NGX_ELOOP) || of.err == NGX_ELOOP)

View File

@ -552,6 +552,11 @@ ngx_http_log_script_write(ngx_http_request_t *r, ngx_http_log_script_t *script,
if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool) if (ngx_open_cached_file(llcf->open_file_cache, &log, &of, r->pool)
!= NGX_OK) != NGX_OK)
{ {
if (of.err == 0) {
/* simulate successful logging */
return len;
}
ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno, ngx_log_error(NGX_LOG_CRIT, r->connection->log, ngx_errno,
"%s \"%s\" failed", of.failed, log.data); "%s \"%s\" failed", of.failed, log.data);
/* simulate successful logging */ /* simulate successful logging */

View File

@ -1314,6 +1314,11 @@ ngx_http_core_try_files_phase(ngx_http_request_t *r,
if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
!= NGX_OK) != NGX_OK)
{ {
if (of.err == 0) {
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
return NGX_OK;
}
if (of.err != NGX_ENOENT if (of.err != NGX_ENOENT
&& of.err != NGX_ENOTDIR && of.err != NGX_ENOTDIR
&& of.err != NGX_ENAMETOOLONG) && of.err != NGX_ENAMETOOLONG)

View File

@ -1513,6 +1513,12 @@ ngx_http_script_file_code(ngx_http_script_engine_t *e)
if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool) if (ngx_open_cached_file(clcf->open_file_cache, &path, &of, r->pool)
!= NGX_OK) != NGX_OK)
{ {
if (of.err == 0) {
e->ip = ngx_http_script_exit;
e->status = NGX_HTTP_INTERNAL_SERVER_ERROR;
return;
}
if (of.err != NGX_ENOENT if (of.err != NGX_ENOENT
&& of.err != NGX_ENOTDIR && of.err != NGX_ENOTDIR
&& of.err != NGX_ENAMETOOLONG) && of.err != NGX_ENAMETOOLONG)

View File

@ -443,6 +443,11 @@ ngx_stream_log_script_write(ngx_stream_session_t *s,
s->connection->pool) s->connection->pool)
!= NGX_OK) != NGX_OK)
{ {
if (of.err == 0) {
/* simulate successful logging */
return len;
}
ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno, ngx_log_error(NGX_LOG_CRIT, s->connection->log, ngx_errno,
"%s \"%s\" failed", of.failed, log.data); "%s \"%s\" failed", of.failed, log.data);
/* simulate successful logging */ /* simulate successful logging */