Release - v1.17.7

This commit is contained in:
2019-12-25 00:35:18 +09:00
parent b013300457
commit 1d1103eacb
16 changed files with 175 additions and 76 deletions
+1
View File
@@ -445,3 +445,4 @@ ed4303aa1b31a9aad5440640c0840d9d0af45fed release-1.17.3
ce2ced3856909f36f8130c99eaa4dbdbae636ddc release-1.17.4 ce2ced3856909f36f8130c99eaa4dbdbae636ddc release-1.17.4
9af0dddbddb2c368bfedd2801bc100ffad01e19b release-1.17.5 9af0dddbddb2c368bfedd2801bc100ffad01e19b release-1.17.5
de68d0d94320cbf033599c6f3ca37e5335c67fd7 release-1.17.6 de68d0d94320cbf033599c6f3ca37e5335c67fd7 release-1.17.6
e56295fe0ea76bf53b06bffa77a2d3a9a335cb8c release-1.17.7
+8 -7
View File
@@ -1,5 +1,5 @@
.\" .\"
.\" Copyright (C) 2010 Sergey A. Osokin .\" Copyright (C) 2010, 2019 Sergey A. Osokin
.\" Copyright (C) Nginx, Inc. .\" Copyright (C) Nginx, Inc.
.\" All rights reserved. .\" All rights reserved.
.\" .\"
@@ -25,7 +25,7 @@
.\" SUCH DAMAGE. .\" SUCH DAMAGE.
.\" .\"
.\" .\"
.Dd June 16, 2015 .Dd December 5, 2019
.Dt NGINX 8 .Dt NGINX 8
.Os .Os
.Sh NAME .Sh NAME
@@ -42,7 +42,8 @@
.Nm .Nm
(pronounced (pronounced
.Dq engine x ) .Dq engine x )
is an HTTP and reverse proxy server, as well as a mail proxy server. is an HTTP and reverse proxy server, a mail proxy server, and a generic
TCP/UDP proxy server.
It is known for its high performance, stability, rich feature set, simple It is known for its high performance, stability, rich feature set, simple
configuration, and low resource consumption. configuration, and low resource consumption.
.Pp .Pp
@@ -82,15 +83,15 @@ The following table shows the corresponding system signals:
.It Cm reload .It Cm reload
.Dv SIGHUP .Dv SIGHUP
.El .El
.It Fl T
Same as
.Fl t ,
but additionally dump configuration files to standard output.
.It Fl t .It Fl t
Do not run, just test the configuration file. Do not run, just test the configuration file.
.Nm .Nm
checks the configuration file syntax and then tries to open files checks the configuration file syntax and then tries to open files
referenced in the configuration file. referenced in the configuration file.
.It Fl T
Same as
.Fl t ,
but additionally dump configuration files to standard output.
.It Fl V .It Fl V
Print the Print the
.Nm .Nm
+84
View File
@@ -5,6 +5,90 @@
<change_log title="nginx"> <change_log title="nginx">
<changes ver="1.17.7" date="2019-12-24">
<change type="bugfix">
<para lang="ru">
на старте или во время переконфигурации мог произойти segmentation fault,
если в конфигурации использовалась
директива rewrite с пустой строкой замены.
</para>
<para lang="en">
a segmentation fault might occur on start or during reconfiguration
if the "rewrite" directive with an empty replacement string
was used in the configuration.
</para>
</change>
<change type="bugfix">
<para lang="ru">
в рабочем процессе мог произойти segmentation fault,
если директива break использовалась совместно с директивой alias
или директивой proxy_pass с URI.
</para>
<para lang="en">
a segmentation fault might occur in a worker process
if the "break" directive was used with the "alias" directive
or with the "proxy_pass" directive with a URI.
</para>
</change>
<change type="bugfix">
<para lang="ru">
строка Location заголовка ответа могла содержать мусор,
если URI запроса был изменён на URI, содержащий нулевой символ.
</para>
<para lang="en">
the "Location" response header line might contain garbage
if the request URI was rewritten to the one containing a null character.
</para>
</change>
<change type="bugfix">
<para lang="ru">
при возврате перенаправлений с помощью директивы error_page
запросы с телом обрабатывались некорректно;
ошибка появилась в 0.7.12.
</para>
<para lang="en">
requests with bodies were handled incorrectly
when returning redirections with the "error_page" directive;
the bug had appeared in 0.7.12.
</para>
</change>
<change type="bugfix">
<para lang="ru">
утечки сокетов при использовании HTTP/2.
</para>
<para lang="en">
socket leak when using HTTP/2.
</para>
</change>
<change type="bugfix">
<para lang="ru">
при обработке pipelined-запросов по SSL-соединению мог произойти таймаут;
ошибка появилась в 1.17.5.
</para>
<para lang="en">
a timeout might occur while handling pipelined requests in an SSL connection;
the bug had appeared in 1.17.5.
</para>
</change>
<change type="bugfix">
<para lang="ru">
в модуле ngx_http_dav_module.
</para>
<para lang="en">
in the ngx_http_dav_module.
</para>
</change>
</changes>
<changes ver="1.17.6" date="2019-11-19"> <changes ver="1.17.6" date="2019-11-19">
<change type="feature"> <change type="feature">
+1 -2
View File
@@ -238,8 +238,6 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
} }
if (!ngx_queue_empty(&ngx_posted_next_events)) { if (!ngx_queue_empty(&ngx_posted_next_events)) {
ngx_queue_add(&ngx_posted_events, &ngx_posted_next_events);
ngx_queue_init(&ngx_posted_next_events);
timer = 0; timer = 0;
} }
@@ -263,6 +261,7 @@ ngx_process_events_and_timers(ngx_cycle_t *cycle)
} }
ngx_event_process_posted(cycle, &ngx_posted_events); ngx_event_process_posted(cycle, &ngx_posted_events);
ngx_event_process_posted_next(cycle, &ngx_posted_next_events);
} }
-31
View File
@@ -43,7 +43,6 @@ static ssize_t ngx_ssl_recv_early(ngx_connection_t *c, u_char *buf,
#endif #endif
static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n); static ngx_int_t ngx_ssl_handle_recv(ngx_connection_t *c, int n);
static void ngx_ssl_write_handler(ngx_event_t *wev); static void ngx_ssl_write_handler(ngx_event_t *wev);
static void ngx_ssl_next_read_handler(ngx_event_t *rev);
#ifdef SSL_READ_EARLY_DATA_SUCCESS #ifdef SSL_READ_EARLY_DATA_SUCCESS
static ssize_t ngx_ssl_write_early(ngx_connection_t *c, u_char *data, static ssize_t ngx_ssl_write_early(ngx_connection_t *c, u_char *data,
size_t size); size_t size);
@@ -2027,11 +2026,6 @@ ngx_ssl_recv(ngx_connection_t *c, u_char *buf, size_t size)
c->read->available = 0; c->read->available = 0;
c->read->ready = 0; c->read->ready = 0;
if (c->ssl->next_read_handler == NULL) {
c->ssl->next_read_handler = c->read->handler;
c->read->handler = ngx_ssl_next_read_handler;
}
ngx_post_event(c->read, &ngx_posted_next_events); ngx_post_event(c->read, &ngx_posted_next_events);
} }
@@ -2337,31 +2331,6 @@ ngx_ssl_write_handler(ngx_event_t *wev)
} }
static void
ngx_ssl_next_read_handler(ngx_event_t *rev)
{
ngx_connection_t *c;
c = rev->data;
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL next read handler");
rev->handler = c->ssl->next_read_handler;
c->ssl->next_read_handler = NULL;
if (!rev->ready) {
rev->ready = 1;
rev->available = -1;
}
if (rev->posted) {
ngx_delete_posted_event(rev);
}
rev->handler(rev);
}
/* /*
* OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer * OpenSSL has no SSL_writev() so we copy several bufs into our 16K buffer
* before the SSL_write() call to decrease a SSL overhead. * before the SSL_write() call to decrease a SSL overhead.
-1
View File
@@ -95,7 +95,6 @@ struct ngx_ssl_connection_s {
ngx_event_handler_pt saved_read_handler; ngx_event_handler_pt saved_read_handler;
ngx_event_handler_pt saved_write_handler; ngx_event_handler_pt saved_write_handler;
ngx_event_handler_pt next_read_handler;
u_char early_buf; u_char early_buf;
+26
View File
@@ -34,3 +34,29 @@ ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted)
ev->handler(ev); ev->handler(ev);
} }
} }
void
ngx_event_process_posted_next(ngx_cycle_t *cycle, ngx_queue_t *posted)
{
ngx_queue_t *q;
ngx_event_t *ev;
while (!ngx_queue_empty(posted)) {
q = ngx_queue_head(posted);
ev = ngx_queue_data(q, ngx_event_t, queue);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"posted next event %p", ev);
ngx_delete_posted_event(ev);
if (!ev->ready) {
ev->ready = 1;
ev->available = -1;
}
ev->handler(ev);
}
}
+1
View File
@@ -39,6 +39,7 @@
void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted); void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted);
void ngx_event_process_posted_next(ngx_cycle_t *cycle, ngx_queue_t *posted);
extern ngx_queue_t ngx_posted_accept_events; extern ngx_queue_t ngx_posted_accept_events;
+10 -28
View File
@@ -56,7 +56,7 @@ static ngx_int_t ngx_http_dav_copy_tree_file(ngx_tree_ctx_t *ctx,
static ngx_int_t ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt); static ngx_int_t ngx_http_dav_depth(ngx_http_request_t *r, ngx_int_t dflt);
static ngx_int_t ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, static ngx_int_t ngx_http_dav_error(ngx_log_t *log, ngx_err_t err,
ngx_int_t not_found, char *failed, u_char *path); ngx_int_t not_found, char *failed, u_char *path);
static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r, u_char *path); static ngx_int_t ngx_http_dav_location(ngx_http_request_t *r);
static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf); static void *ngx_http_dav_create_loc_conf(ngx_conf_t *cf);
static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf, static char *ngx_http_dav_merge_loc_conf(ngx_conf_t *cf,
void *parent, void *child); void *parent, void *child);
@@ -285,7 +285,7 @@ ngx_http_dav_put_handler(ngx_http_request_t *r)
} }
if (status == NGX_HTTP_CREATED) { if (status == NGX_HTTP_CREATED) {
if (ngx_http_dav_location(r, path.data) != NGX_OK) { if (ngx_http_dav_location(r) != NGX_OK) {
ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);
return; return;
} }
@@ -312,7 +312,7 @@ ngx_http_dav_delete_handler(ngx_http_request_t *r)
ngx_file_info_t fi; ngx_file_info_t fi;
ngx_http_dav_loc_conf_t *dlcf; ngx_http_dav_loc_conf_t *dlcf;
if (r->headers_in.content_length_n > 0) { if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"DELETE with body is unsupported"); "DELETE with body is unsupported");
return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
@@ -495,7 +495,7 @@ ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf)
size_t root; size_t root;
ngx_str_t path; ngx_str_t path;
if (r->headers_in.content_length_n > 0) { if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"MKCOL with body is unsupported"); "MKCOL with body is unsupported");
return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
@@ -513,7 +513,6 @@ ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf)
} }
*(p - 1) = '\0'; *(p - 1) = '\0';
r->uri.len--;
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http mkcol path: \"%s\"", path.data); "http mkcol path: \"%s\"", path.data);
@@ -521,7 +520,7 @@ ngx_http_dav_mkcol_handler(ngx_http_request_t *r, ngx_http_dav_loc_conf_t *dlcf)
if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access)) if (ngx_create_dir(path.data, ngx_dir_access(dlcf->access))
!= NGX_FILE_ERROR) != NGX_FILE_ERROR)
{ {
if (ngx_http_dav_location(r, path.data) != NGX_OK) { if (ngx_http_dav_location(r) != NGX_OK) {
return NGX_HTTP_INTERNAL_SERVER_ERROR; return NGX_HTTP_INTERNAL_SERVER_ERROR;
} }
@@ -550,7 +549,9 @@ ngx_http_dav_copy_move_handler(ngx_http_request_t *r)
ngx_http_dav_copy_ctx_t copy; ngx_http_dav_copy_ctx_t copy;
ngx_http_dav_loc_conf_t *dlcf; ngx_http_dav_loc_conf_t *dlcf;
if (r->headers_in.content_length_n > 0) { if (r->headers_in.content_length_n > 0 || r->headers_in.chunked) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
"COPY and MOVE with body are unsupported");
return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE; return NGX_HTTP_UNSUPPORTED_MEDIA_TYPE;
} }
@@ -1069,35 +1070,16 @@ ngx_http_dav_error(ngx_log_t *log, ngx_err_t err, ngx_int_t not_found,
static ngx_int_t static ngx_int_t
ngx_http_dav_location(ngx_http_request_t *r, u_char *path) ngx_http_dav_location(ngx_http_request_t *r)
{ {
u_char *location;
ngx_http_core_loc_conf_t *clcf;
r->headers_out.location = ngx_list_push(&r->headers_out.headers); r->headers_out.location = ngx_list_push(&r->headers_out.headers);
if (r->headers_out.location == NULL) { if (r->headers_out.location == NULL) {
return NGX_ERROR; return NGX_ERROR;
} }
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
if (!clcf->alias && clcf->root_lengths == NULL) {
location = path + clcf->root.len;
} else {
location = ngx_pnalloc(r->pool, r->uri.len);
if (location == NULL) {
ngx_http_clear_location(r);
return NGX_ERROR;
}
ngx_memcpy(location, r->uri.data, r->uri.len);
}
r->headers_out.location->hash = 1; r->headers_out.location->hash = 1;
ngx_str_set(&r->headers_out.location->key, "Location"); ngx_str_set(&r->headers_out.location->key, "Location");
r->headers_out.location->value.len = r->uri.len; r->headers_out.location->value = r->uri;
r->headers_out.location->value.data = location;
return NGX_OK; return NGX_OK;
} }
+1 -1
View File
@@ -163,7 +163,7 @@ ngx_http_index_handler(ngx_http_request_t *r)
name = ngx_http_map_uri_to_path(r, &path, &root, reserve); name = ngx_http_map_uri_to_path(r, &path, &root, reserve);
if (name == NULL) { if (name == NULL) {
return NGX_ERROR; return NGX_HTTP_INTERNAL_SERVER_ERROR;
} }
allocated = path.data + path.len - name; allocated = path.data + path.len - name;
@@ -318,6 +318,11 @@ ngx_http_rewrite(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
value = cf->args->elts; value = cf->args->elts;
if (value[2].len == 0) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "empty replacement");
return NGX_CONF_ERROR;
}
ngx_memzero(&rc, sizeof(ngx_regex_compile_t)); ngx_memzero(&rc, sizeof(ngx_regex_compile_t));
rc.pattern = value[1]; rc.pattern = value[1];
+2 -2
View File
@@ -157,8 +157,8 @@ ngx_http_static_handler(ngx_http_request_t *r)
len = r->uri.len + 1; len = r->uri.len + 1;
if (!clcf->alias && clcf->root_lengths == NULL && r->args.len == 0) { if (!clcf->alias && r->args.len == 0) {
location = path.data + clcf->root.len; location = path.data + root;
*last = '/'; *last = '/';
+2 -1
View File
@@ -1857,7 +1857,8 @@ ngx_http_map_uri_to_path(ngx_http_request_t *r, ngx_str_t *path,
} }
} }
last = ngx_cpystrn(last, r->uri.data + alias, r->uri.len - alias + 1); last = ngx_copy(last, r->uri.data + alias, r->uri.len - alias);
*last = '\0';
return last; return last;
} }
+8 -1
View File
@@ -1470,7 +1470,14 @@ ngx_http_script_return_code(ngx_http_script_engine_t *e)
void void
ngx_http_script_break_code(ngx_http_script_engine_t *e) ngx_http_script_break_code(ngx_http_script_engine_t *e)
{ {
e->request->uri_changed = 0; ngx_http_request_t *r;
r = e->request;
if (r->uri_changed) {
r->valid_location = 0;
r->uri_changed = 0;
}
e->ip = ngx_http_script_exit; e->ip = ngx_http_script_exit;
} }
+6
View File
@@ -622,6 +622,12 @@ ngx_http_send_error_page(ngx_http_request_t *r, ngx_http_err_page_t *err_page)
return ngx_http_named_location(r, &uri); return ngx_http_named_location(r, &uri);
} }
r->expect_tested = 1;
if (ngx_http_discard_request_body(r) != NGX_OK) {
r->keepalive = 0;
}
location = ngx_list_push(&r->headers_out.headers); location = ngx_list_push(&r->headers_out.headers);
if (location == NULL) { if (location == NULL) {
+20 -2
View File
@@ -178,6 +178,7 @@ static void ngx_http_v2_read_client_request_body_handler(ngx_http_request_t *r);
static ngx_int_t ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c, static ngx_int_t ngx_http_v2_terminate_stream(ngx_http_v2_connection_t *h2c,
ngx_http_v2_stream_t *stream, ngx_uint_t status); ngx_http_v2_stream_t *stream, ngx_uint_t status);
static void ngx_http_v2_close_stream_handler(ngx_event_t *ev); static void ngx_http_v2_close_stream_handler(ngx_event_t *ev);
static void ngx_http_v2_retry_close_stream_handler(ngx_event_t *ev);
static void ngx_http_v2_handle_connection_handler(ngx_event_t *rev); static void ngx_http_v2_handle_connection_handler(ngx_event_t *rev);
static void ngx_http_v2_idle_handler(ngx_event_t *rev); static void ngx_http_v2_idle_handler(ngx_event_t *rev);
static void ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c, static void ngx_http_v2_finalize_connection(ngx_http_v2_connection_t *h2c,
@@ -4298,8 +4299,9 @@ ngx_http_v2_close_stream(ngx_http_v2_stream_t *stream, ngx_int_t rc)
fc = stream->request->connection; fc = stream->request->connection;
if (stream->queued) { if (stream->queued) {
fc->write->handler = ngx_http_v2_close_stream_handler; fc->error = 1;
fc->read->handler = ngx_http_empty_handler; fc->write->handler = ngx_http_v2_retry_close_stream_handler;
fc->read->handler = ngx_http_v2_retry_close_stream_handler;
return; return;
} }
@@ -4421,6 +4423,22 @@ ngx_http_v2_close_stream_handler(ngx_event_t *ev)
} }
static void
ngx_http_v2_retry_close_stream_handler(ngx_event_t *ev)
{
ngx_connection_t *fc;
ngx_http_request_t *r;
fc = ev->data;
r = fc->data;
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,
"http2 retry close stream handler");
ngx_http_v2_close_stream(r->stream, 0);
}
static void static void
ngx_http_v2_handle_connection_handler(ngx_event_t *rev) ngx_http_v2_handle_connection_handler(ngx_event_t *rev)
{ {