Mercurial > hg > nginx-quic
view src/os/unix/ngx_thread.h @ 4964:2464ccebdb52
Upstream: fixed SIGSEGV with the "if" directive.
Configuration like
location / {
set $true 1;
if ($true) {
proxy_pass http://backend;
}
if ($true) {
# nothing
}
}
resulted in segmentation fault due to NULL pointer dereference as the
upstream configuration wasn't initialized in an implicit location created
by the last if(), but the r->content_handler was set due to first if().
Instead of committing a suicide by dereferencing a NULL pointer, return
500 (Internal Server Error) in such cases, i.e. if uscf is NULL. Better
fix would be to avoid such cases by fixing the "if" directive handling,
but it's out of scope of this patch.
Prodded by Piotr Sikora.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 13 Dec 2012 16:05:59 +0000 |
parents | d620f497c50f |
children | 457ec43dd8d5 |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_THREAD_H_INCLUDED_ #define _NGX_THREAD_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> #if (NGX_THREADS) #define NGX_MAX_THREADS 128 #if (NGX_USE_RFORK) #include <ngx_freebsd_rfork_thread.h> #else /* use pthreads */ #include <pthread.h> typedef pthread_t ngx_tid_t; #define ngx_thread_self() pthread_self() #define ngx_log_tid (int) ngx_thread_self() #if (NGX_FREEBSD) && !(NGX_LINUXTHREADS) #define NGX_TID_T_FMT "%p" #else #define NGX_TID_T_FMT "%d" #endif typedef pthread_key_t ngx_tls_key_t; #define ngx_thread_key_create(key) pthread_key_create(key, NULL) #define ngx_thread_key_create_n "pthread_key_create()" #define ngx_thread_set_tls pthread_setspecific #define ngx_thread_set_tls_n "pthread_setspecific()" #define ngx_thread_get_tls pthread_getspecific #define NGX_MUTEX_LIGHT 0 typedef struct { pthread_mutex_t mutex; ngx_log_t *log; } ngx_mutex_t; typedef struct { pthread_cond_t cond; ngx_log_t *log; } ngx_cond_t; #define ngx_thread_sigmask pthread_sigmask #define ngx_thread_sigmask_n "pthread_sigmask()" #define ngx_thread_join(t, p) pthread_join(t, p) #define ngx_setthrtitle(n) ngx_int_t ngx_mutex_trylock(ngx_mutex_t *m); void ngx_mutex_lock(ngx_mutex_t *m); void ngx_mutex_unlock(ngx_mutex_t *m); #endif #define ngx_thread_volatile volatile typedef struct { ngx_tid_t tid; ngx_cond_t *cv; ngx_uint_t state; } ngx_thread_t; #define NGX_THREAD_FREE 1 #define NGX_THREAD_BUSY 2 #define NGX_THREAD_EXIT 3 #define NGX_THREAD_DONE 4 extern ngx_int_t ngx_threads_n; extern volatile ngx_thread_t ngx_threads[NGX_MAX_THREADS]; typedef void * ngx_thread_value_t; ngx_int_t ngx_init_threads(int n, size_t size, ngx_cycle_t *cycle); ngx_err_t ngx_create_thread(ngx_tid_t *tid, ngx_thread_value_t (*func)(void *arg), void *arg, ngx_log_t *log); ngx_mutex_t *ngx_mutex_init(ngx_log_t *log, ngx_uint_t flags); void ngx_mutex_destroy(ngx_mutex_t *m); ngx_cond_t *ngx_cond_init(ngx_log_t *log); void ngx_cond_destroy(ngx_cond_t *cv); ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m); ngx_int_t ngx_cond_signal(ngx_cond_t *cv); #else /* !NGX_THREADS */ #define ngx_thread_volatile #define ngx_log_tid 0 #define NGX_TID_T_FMT "%d" #define ngx_mutex_trylock(m) NGX_OK #define ngx_mutex_lock(m) #define ngx_mutex_unlock(m) #define ngx_cond_signal(cv) #define ngx_thread_main() 1 #endif #endif /* _NGX_THREAD_H_INCLUDED_ */