Mercurial > hg > nginx
changeset 931:87f456ff13b0
fix segfault in "out of memory" situation
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 18 Dec 2006 20:46:49 +0000 |
parents | 45df22906c12 |
children | 1b8111df8051 |
files | src/core/ngx_palloc.c |
diffstat | 1 files changed, 10 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/core/ngx_palloc.c Fri Dec 15 21:31:03 2006 +0000 +++ b/src/core/ngx_palloc.c Mon Dec 18 20:46:49 2006 +0000 @@ -85,14 +85,17 @@ ngx_palloc(ngx_pool_t *pool, size_t size) { u_char *m; - ngx_pool_t *p, *n; + ngx_pool_t *p, *n, *current; ngx_pool_large_t *large; if (size <= (size_t) NGX_MAX_ALLOC_FROM_POOL && size <= (size_t) (pool->end - (u_char *) pool) - (size_t) ngx_align_ptr(sizeof(ngx_pool_t), NGX_ALIGNMENT)) { - for (p = pool->current; /* void */ ; p = p->next) { + p = pool->current; + current = p; + + for ( ;; ) { if (size < sizeof(int) || (size & 1)) { m = p->last; @@ -108,12 +111,15 @@ } if ((size_t) (p->end - m) < NGX_ALIGNMENT) { - pool->current = p->next; + current = p->next; } if (p->next == NULL) { break; } + + p = p->next; + pool->current = current; } /* allocate a new pool block */ @@ -123,9 +129,7 @@ return NULL; } - if (pool->current == NULL) { - pool->current = n; - } + pool->current = current ? current : n; p->next = n; m = ngx_align_ptr(n->last, NGX_ALIGNMENT);