Update auf Nginx 1.13.4

This commit is contained in:
2017-08-10 14:23:46 +02:00
parent 0a5c3fd43d
commit a7bf678e7c
68 changed files with 1782 additions and 813 deletions

View File

@@ -273,6 +273,12 @@ main(int argc, char *const *argv)
return 1;
}
/*
* ngx_slab_sizes_init() requires ngx_pagesize set in ngx_os_init()
*/
ngx_slab_sizes_init();
if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {
return 1;
}

View File

@@ -9,8 +9,8 @@
#define _NGINX_H_INCLUDED_
#define nginx_version 1013001
#define NGINX_VERSION "1.13.1"
#define nginx_version 1013004
#define NGINX_VERSION "1.13.4"
#define NGINX_VER "nginx/" NGINX_VERSION
#ifdef NGX_BUILD

View File

@@ -473,7 +473,7 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
#if (NGX_HAVE_REUSEPORT)
if (ls[i].reuseport) {
if (ls[i].reuseport && !ngx_test_config) {
int reuseport;
reuseport = 1;
@@ -483,7 +483,7 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
== -1)
{
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
"setsockopt(SO_REUSEPORT) %V failed, ignored",
"setsockopt(SO_REUSEPORT) %V failed",
&ls[i].addr_text);
if (ngx_close_socket(s) == -1) {

View File

@@ -1124,9 +1124,7 @@ ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user)
if (user != (ngx_uid_t) NGX_CONF_UNSET_UINT) {
ngx_file_info_t fi;
if (ngx_file_info((const char *) file[i].name.data, &fi)
== NGX_FILE_ERROR)
{
if (ngx_file_info(file[i].name.data, &fi) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
ngx_file_info_n " \"%s\" failed",
file[i].name.data);

View File

@@ -622,9 +622,7 @@ ngx_create_paths(ngx_cycle_t *cycle, ngx_uid_t user)
{
ngx_file_info_t fi;
if (ngx_file_info((const char *) path[i]->name.data, &fi)
== NGX_FILE_ERROR)
{
if (ngx_file_info(path[i]->name.data, &fi) == NGX_FILE_ERROR) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
ngx_file_info_n " \"%s\" failed", path[i]->name.data);
return NGX_ERROR;

View File

@@ -58,7 +58,7 @@ ngx_parse_http_time(u_char *value, size_t len)
return NGX_ERROR;
}
day = (*p - '0') * 10 + *(p + 1) - '0';
day = (*p - '0') * 10 + (*(p + 1) - '0');
p += 2;
if (*p == ' ') {
@@ -132,7 +132,7 @@ ngx_parse_http_time(u_char *value, size_t len)
}
year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100
+ (*(p + 2) - '0') * 10 + *(p + 3) - '0';
+ (*(p + 2) - '0') * 10 + (*(p + 3) - '0');
p += 4;
} else if (fmt == rfc850) {
@@ -140,7 +140,7 @@ ngx_parse_http_time(u_char *value, size_t len)
return NGX_ERROR;
}
year = (*p - '0') * 10 + *(p + 1) - '0';
year = (*p - '0') * 10 + (*(p + 1) - '0');
year += (year < 70) ? 2000 : 1900;
p += 2;
}
@@ -161,7 +161,7 @@ ngx_parse_http_time(u_char *value, size_t len)
return NGX_ERROR;
}
day = day * 10 + *p++ - '0';
day = day * 10 + (*p++ - '0');
}
if (end - p < 14) {
@@ -177,7 +177,7 @@ ngx_parse_http_time(u_char *value, size_t len)
return NGX_ERROR;
}
hour = (*p - '0') * 10 + *(p + 1) - '0';
hour = (*p - '0') * 10 + (*(p + 1) - '0');
p += 2;
if (*p++ != ':') {
@@ -188,7 +188,7 @@ ngx_parse_http_time(u_char *value, size_t len)
return NGX_ERROR;
}
min = (*p - '0') * 10 + *(p + 1) - '0';
min = (*p - '0') * 10 + (*(p + 1) - '0');
p += 2;
if (*p++ != ':') {
@@ -199,7 +199,7 @@ ngx_parse_http_time(u_char *value, size_t len)
return NGX_ERROR;
}
sec = (*p - '0') * 10 + *(p + 1) - '0';
sec = (*p - '0') * 10 + (*(p + 1) - '0');
if (fmt == isoc) {
p += 2;
@@ -216,7 +216,7 @@ ngx_parse_http_time(u_char *value, size_t len)
}
year = (*p - '0') * 1000 + (*(p + 1) - '0') * 100
+ (*(p + 2) - '0') * 10 + *(p + 3) - '0';
+ (*(p + 2) - '0') * 10 + (*(p + 3) - '0');
}
if (hour > 23 || min > 59 || sec > 59) {

View File

@@ -105,6 +105,8 @@ static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp,
ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel);
static ngx_int_t ngx_resolver_copy(ngx_resolver_t *r, ngx_str_t *name,
u_char *buf, u_char *src, u_char *last);
static ngx_int_t ngx_resolver_set_timeout(ngx_resolver_t *r,
ngx_resolver_ctx_t *ctx);
static void ngx_resolver_timeout_handler(ngx_event_t *ev);
static void ngx_resolver_free_node(ngx_resolver_t *r, ngx_resolver_node_t *rn);
static void *ngx_resolver_alloc(ngx_resolver_t *r, size_t size);
@@ -189,6 +191,7 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
r->event->handler = ngx_resolver_resend_handler;
r->event->data = r;
r->event->log = &cf->cycle->new_log;
r->event->cancelable = 1;
r->ident = -1;
r->resend_timeout = 5;
@@ -443,7 +446,7 @@ ngx_resolve_name(ngx_resolver_ctx_t *ctx)
name.data = ngx_resolver_alloc(r, name.len);
if (name.data == NULL) {
return NGX_ERROR;
goto failed;
}
if (slen == ctx->service.len) {
@@ -481,6 +484,8 @@ ngx_resolve_name(ngx_resolver_ctx_t *ctx)
ngx_resolver_free(r, ctx->event);
}
failed:
ngx_resolver_free(r, ctx);
return NGX_ERROR;
@@ -726,24 +731,14 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,
}
if (rn->waiting) {
if (ctx->event == NULL && ctx->timeout) {
ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
if (ctx->event == NULL) {
return NGX_ERROR;
}
ctx->event->handler = ngx_resolver_timeout_handler;
ctx->event->data = ctx;
ctx->event->log = r->log;
ctx->ident = -1;
ngx_add_timer(ctx->event, ctx->timeout);
if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
return NGX_ERROR;
}
last->next = rn->waiting;
rn->waiting = ctx;
ctx->state = NGX_AGAIN;
ctx->async = 1;
do {
ctx->node = rn;
@@ -861,18 +856,8 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,
goto failed;
}
if (ctx->event == NULL && ctx->timeout) {
ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
if (ctx->event == NULL) {
goto failed;
}
ctx->event->handler = ngx_resolver_timeout_handler;
ctx->event->data = ctx;
ctx->event->log = r->log;
ctx->ident = -1;
ngx_add_timer(ctx->event, ctx->timeout);
if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
goto failed;
}
if (ngx_resolver_resend_empty(r)) {
@@ -890,6 +875,7 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx,
rn->waiting = ctx;
ctx->state = NGX_AGAIN;
ctx->async = 1;
do {
ctx->node = rn;
@@ -1003,24 +989,14 @@ ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
}
if (rn->waiting) {
if (ctx->event == NULL && ctx->timeout) {
ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
if (ctx->event == NULL) {
return NGX_ERROR;
}
ctx->event->handler = ngx_resolver_timeout_handler;
ctx->event->data = ctx;
ctx->event->log = r->log;
ctx->ident = -1;
ngx_add_timer(ctx->event, ctx->timeout);
if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
return NGX_ERROR;
}
ctx->next = rn->waiting;
rn->waiting = ctx;
ctx->state = NGX_AGAIN;
ctx->async = 1;
ctx->node = rn;
/* unlock addr mutex */
@@ -1084,18 +1060,8 @@ ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
goto failed;
}
if (ctx->event == NULL && ctx->timeout) {
ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
if (ctx->event == NULL) {
goto failed;
}
ctx->event->handler = ngx_resolver_timeout_handler;
ctx->event->data = ctx;
ctx->event->log = r->log;
ctx->ident = -1;
ngx_add_timer(ctx->event, ctx->timeout);
if (ngx_resolver_set_timeout(r, ctx) != NGX_OK) {
goto failed;
}
if (ngx_resolver_resend_empty(r)) {
@@ -1117,6 +1083,7 @@ ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
/* unlock addr mutex */
ctx->state = NGX_AGAIN;
ctx->async = 1;
ctx->node = rn;
return NGX_OK;
@@ -3017,6 +2984,7 @@ ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
srv = cctx->srvs;
ctx->count--;
ctx->async |= cctx->async;
srv->ctx = NULL;
srv->state = cctx->state;
@@ -3027,25 +2995,15 @@ ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
addrs = ngx_resolver_calloc(r, cctx->naddrs * sizeof(ngx_addr_t));
if (addrs == NULL) {
ngx_resolve_name_done(cctx);
ctx->state = NGX_ERROR;
ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
ctx->handler(ctx);
return;
srv->state = NGX_ERROR;
goto done;
}
sockaddr = ngx_resolver_alloc(r, cctx->naddrs * sizeof(ngx_sockaddr_t));
if (sockaddr == NULL) {
ngx_resolver_free(r, addrs);
ngx_resolve_name_done(cctx);
ctx->state = NGX_ERROR;
ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
ctx->handler(ctx);
return;
srv->state = NGX_ERROR;
goto done;
}
for (i = 0; i < cctx->naddrs; i++) {
@@ -3062,6 +3020,8 @@ ngx_resolver_srv_names_handler(ngx_resolver_ctx_t *cctx)
srv->naddrs = cctx->naddrs;
}
done:
ngx_resolve_name_done(cctx);
if (ctx->count == 0) {
@@ -4034,6 +3994,30 @@ done:
}
static ngx_int_t
ngx_resolver_set_timeout(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
{
if (ctx->event || ctx->timeout == 0) {
return NGX_OK;
}
ctx->event = ngx_resolver_calloc(r, sizeof(ngx_event_t));
if (ctx->event == NULL) {
return NGX_ERROR;
}
ctx->event->handler = ngx_resolver_timeout_handler;
ctx->event->data = ctx;
ctx->event->log = r->log;
ctx->event->cancelable = ctx->cancelable;
ctx->ident = -1;
ngx_add_timer(ctx->event, ctx->timeout);
return NGX_OK;
}
static void
ngx_resolver_timeout_handler(ngx_event_t *ev)
{
@@ -4247,10 +4231,21 @@ ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
ngx_resolver_addr_t *addrs;
ngx_resolver_srv_name_t *srvs;
srvs = ctx->srvs;
nsrvs = ctx->nsrvs;
naddrs = 0;
for (i = 0; i < ctx->nsrvs; i++) {
naddrs += ctx->srvs[i].naddrs;
for (i = 0; i < nsrvs; i++) {
if (srvs[i].state == NGX_ERROR) {
ctx->state = NGX_ERROR;
ctx->valid = ngx_time() + (r->valid ? r->valid : 10);
ctx->handler(ctx);
return;
}
naddrs += srvs[i].naddrs;
}
if (naddrs == 0) {
@@ -4270,9 +4265,6 @@ ngx_resolver_report_srv(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
return;
}
srvs = ctx->srvs;
nsrvs = ctx->nsrvs;
i = 0;
n = 0;

View File

@@ -218,7 +218,9 @@ struct ngx_resolver_ctx_s {
void *data;
ngx_msec_t timeout;
ngx_uint_t quick; /* unsigned quick:1; */
unsigned quick:1;
unsigned async:1;
unsigned cancelable:1;
ngx_uint_t recursion;
ngx_event_t *event;
};

View File

@@ -94,7 +94,7 @@ ngx_rwlock_unlock(ngx_atomic_t *lock)
readers = *lock;
if (readers == NGX_RWLOCK_WLOCK) {
*lock = 0;
(void) ngx_atomic_cmp_set(lock, NGX_RWLOCK_WLOCK, 0);
return;
}
@@ -109,6 +109,15 @@ ngx_rwlock_unlock(ngx_atomic_t *lock)
}
void
ngx_rwlock_downgrade(ngx_atomic_t *lock)
{
if (*lock == NGX_RWLOCK_WLOCK) {
*lock = 1;
}
}
#else
#if (NGX_HTTP_UPSTREAM_ZONE || NGX_STREAM_UPSTREAM_ZONE)

View File

@@ -16,6 +16,7 @@
void ngx_rwlock_wlock(ngx_atomic_t *lock);
void ngx_rwlock_rlock(ngx_atomic_t *lock);
void ngx_rwlock_unlock(ngx_atomic_t *lock);
void ngx_rwlock_downgrade(ngx_atomic_t *lock);
#endif /* _NGX_RWLOCK_H_INCLUDED_ */

View File

@@ -82,6 +82,19 @@ static ngx_uint_t ngx_slab_exact_size;
static ngx_uint_t ngx_slab_exact_shift;
void
ngx_slab_sizes_init(void)
{
ngx_uint_t n;
ngx_slab_max_size = ngx_pagesize / 2;
ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));
for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) {
/* void */
}
}
void
ngx_slab_init(ngx_slab_pool_t *pool)
{
@@ -91,16 +104,6 @@ ngx_slab_init(ngx_slab_pool_t *pool)
ngx_uint_t i, n, pages;
ngx_slab_page_t *slots, *page;
/* STUB */
if (ngx_slab_max_size == 0) {
ngx_slab_max_size = ngx_pagesize / 2;
ngx_slab_exact_size = ngx_pagesize / (8 * sizeof(uintptr_t));
for (n = ngx_slab_exact_size; n >>= 1; ngx_slab_exact_shift++) {
/* void */
}
}
/**/
pool->min_size = (size_t) 1 << pool->min_shift;
slots = ngx_slab_slots(pool);
@@ -181,8 +184,8 @@ void *
ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)
{
size_t s;
uintptr_t p, n, m, mask, *bitmap;
ngx_uint_t i, slot, shift, map;
uintptr_t p, m, mask, *bitmap;
ngx_uint_t i, n, slot, shift, map;
ngx_slab_page_t *page, *prev, *slots;
if (size > ngx_slab_max_size) {
@@ -226,7 +229,7 @@ ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)
bitmap = (uintptr_t *) ngx_slab_page_addr(pool, page);
map = (ngx_pagesize >> shift) / (sizeof(uintptr_t) * 8);
map = (ngx_pagesize >> shift) / (8 * sizeof(uintptr_t));
for (n = 0; n < map; n++) {
@@ -239,7 +242,7 @@ ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)
bitmap[n] |= m;
i = (n * sizeof(uintptr_t) * 8 + i) << shift;
i = (n * 8 * sizeof(uintptr_t) + i) << shift;
p = (uintptr_t) bitmap + i;
@@ -339,11 +342,17 @@ ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)
}
/* "n" elements for bitmap, plus one requested */
bitmap[0] = ((uintptr_t) 2 << n) - 1;
map = (ngx_pagesize >> shift) / (sizeof(uintptr_t) * 8);
for (i = 0; i < (n + 1) / (8 * sizeof(uintptr_t)); i++) {
bitmap[i] = NGX_SLAB_BUSY;
}
for (i = 1; i < map; i++) {
m = ((uintptr_t) 1 << ((n + 1) % (8 * sizeof(uintptr_t)))) - 1;
bitmap[i] = m;
map = (ngx_pagesize >> shift) / (8 * sizeof(uintptr_t));
for (i = i + 1; i < map; i++) {
bitmap[i] = 0;
}
@@ -369,7 +378,7 @@ ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size)
slots[slot].next = page;
pool->stats[slot].total += sizeof(uintptr_t) * 8;
pool->stats[slot].total += 8 * sizeof(uintptr_t);
p = ngx_slab_page_addr(pool, page);
@@ -480,8 +489,8 @@ ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)
}
n = ((uintptr_t) p & (ngx_pagesize - 1)) >> shift;
m = (uintptr_t) 1 << (n % (sizeof(uintptr_t) * 8));
n /= sizeof(uintptr_t) * 8;
m = (uintptr_t) 1 << (n % (8 * sizeof(uintptr_t)));
n /= 8 * sizeof(uintptr_t);
bitmap = (uintptr_t *)
((uintptr_t) p & ~((uintptr_t) ngx_pagesize - 1));
@@ -506,13 +515,16 @@ ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)
n = 1;
}
if (bitmap[0] & ~(((uintptr_t) 1 << n) - 1)) {
i = n / (8 * sizeof(uintptr_t));
m = ((uintptr_t) 1 << (n % (8 * sizeof(uintptr_t)))) - 1;
if (bitmap[i] & ~m) {
goto done;
}
map = (ngx_pagesize >> shift) / (sizeof(uintptr_t) * 8);
map = (ngx_pagesize >> shift) / (8 * sizeof(uintptr_t));
for (i = 1; i < map; i++) {
for (i = i + 1; i < map; i++) {
if (bitmap[i]) {
goto done;
}
@@ -558,7 +570,7 @@ ngx_slab_free_locked(ngx_slab_pool_t *pool, void *p)
ngx_slab_free_pages(pool, page, 1);
pool->stats[slot].total -= sizeof(uintptr_t) * 8;
pool->stats[slot].total -= 8 * sizeof(uintptr_t);
goto done;
}

View File

@@ -59,6 +59,7 @@ typedef struct {
} ngx_slab_pool_t;
void ngx_slab_sizes_init(void);
void ngx_slab_init(ngx_slab_pool_t *pool);
void *ngx_slab_alloc(ngx_slab_pool_t *pool, size_t size);
void *ngx_slab_alloc_locked(ngx_slab_pool_t *pool, size_t size);

View File

@@ -178,7 +178,7 @@ ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args)
slen = (size_t) -1;
while (*fmt >= '0' && *fmt <= '9') {
width = width * 10 + *fmt++ - '0';
width = width * 10 + (*fmt++ - '0');
}
@@ -211,7 +211,7 @@ ngx_vslprintf(u_char *buf, u_char *last, const char *fmt, va_list args)
fmt++;
while (*fmt >= '0' && *fmt <= '9') {
frac_width = frac_width * 10 + *fmt++ - '0';
frac_width = frac_width * 10 + (*fmt++ - '0');
}
break;
@@ -1655,7 +1655,7 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)
state = sw_usual;
if (ch >= '0' && ch <= '9') {
ch = (u_char) ((decoded << 4) + ch - '0');
ch = (u_char) ((decoded << 4) + (ch - '0'));
if (type & NGX_UNESCAPE_REDIRECT) {
if (ch > '%' && ch < 0x7f) {
@@ -1675,7 +1675,7 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)
c = (u_char) (ch | 0x20);
if (c >= 'a' && c <= 'f') {
ch = (u_char) ((decoded << 4) + c - 'a' + 10);
ch = (u_char) ((decoded << 4) + (c - 'a') + 10);
if (type & NGX_UNESCAPE_URI) {
if (ch == '?') {