Mercurial > hg > nginx
comparison src/http/ngx_http_core_module.c @ 3259:e9c0fae6be1e
fix segfaults if no listen directive was set in default server {} block:
ngx_http_add_listen() uses server's connection_pool_size and
client_header_timeout values, therefore it must be called after
the values have been merged, the bug had been introduced in r3218
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 29 Oct 2009 15:53:50 +0000 |
parents | f649453396f5 |
children | 118169a8ec92 |
comparison
equal
deleted
inserted
replaced
3258:77db9440d970 | 3259:e9c0fae6be1e |
---|---|
2836 ngx_http_listen_opt_t lsopt; | 2836 ngx_http_listen_opt_t lsopt; |
2837 ngx_http_server_name_t *sn; | 2837 ngx_http_server_name_t *sn; |
2838 | 2838 |
2839 /* TODO: it does not merge, it inits only */ | 2839 /* TODO: it does not merge, it inits only */ |
2840 | 2840 |
2841 if (!conf->listen) { | |
2842 ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); | |
2843 | |
2844 sin = (struct sockaddr_in *) &lsopt.sockaddr; | |
2845 | |
2846 sin->sin_family = AF_INET; | |
2847 #if (NGX_WIN32) | |
2848 sin->sin_port = htons(80); | |
2849 #else | |
2850 sin->sin_port = htons((getuid() == 0) ? 80 : 8000); | |
2851 #endif | |
2852 sin->sin_addr.s_addr = INADDR_ANY; | |
2853 | |
2854 lsopt.socklen = sizeof(struct sockaddr_in); | |
2855 | |
2856 lsopt.backlog = NGX_LISTEN_BACKLOG; | |
2857 lsopt.rcvbuf = -1; | |
2858 lsopt.sndbuf = -1; | |
2859 lsopt.wildcard = 1; | |
2860 | |
2861 (void) ngx_sock_ntop((struct sockaddr *) &lsopt.sockaddr, lsopt.addr, | |
2862 NGX_SOCKADDR_STRLEN, 1); | |
2863 | |
2864 if (ngx_http_add_listen(cf, conf, &lsopt) == NGX_OK) { | |
2865 return NGX_CONF_OK; | |
2866 } | |
2867 } | |
2868 | |
2869 if (conf->server_name.data == NULL) { | |
2870 conf->server_name = cf->cycle->hostname; | |
2871 | |
2872 sn = ngx_array_push(&conf->server_names); | |
2873 if (sn == NULL) { | |
2874 return NGX_CONF_ERROR; | |
2875 } | |
2876 | |
2877 #if (NGX_PCRE) | |
2878 sn->regex = NULL; | |
2879 #endif | |
2880 sn->server = conf; | |
2881 sn->name.len = conf->server_name.len; | |
2882 sn->name.data = conf->server_name.data; | |
2883 } | |
2884 | |
2885 ngx_conf_merge_size_value(conf->connection_pool_size, | 2841 ngx_conf_merge_size_value(conf->connection_pool_size, |
2886 prev->connection_pool_size, 256); | 2842 prev->connection_pool_size, 256); |
2887 ngx_conf_merge_size_value(conf->request_pool_size, | 2843 ngx_conf_merge_size_value(conf->request_pool_size, |
2888 prev->request_pool_size, 4096); | 2844 prev->request_pool_size, 4096); |
2889 ngx_conf_merge_msec_value(conf->client_header_timeout, | 2845 ngx_conf_merge_msec_value(conf->client_header_timeout, |
2906 | 2862 |
2907 ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1); | 2863 ngx_conf_merge_value(conf->merge_slashes, prev->merge_slashes, 1); |
2908 | 2864 |
2909 ngx_conf_merge_value(conf->underscores_in_headers, | 2865 ngx_conf_merge_value(conf->underscores_in_headers, |
2910 prev->underscores_in_headers, 0); | 2866 prev->underscores_in_headers, 0); |
2867 | |
2868 if (!conf->listen) { | |
2869 ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); | |
2870 | |
2871 sin = (struct sockaddr_in *) &lsopt.sockaddr; | |
2872 | |
2873 sin->sin_family = AF_INET; | |
2874 #if (NGX_WIN32) | |
2875 sin->sin_port = htons(80); | |
2876 #else | |
2877 sin->sin_port = htons((getuid() == 0) ? 80 : 8000); | |
2878 #endif | |
2879 sin->sin_addr.s_addr = INADDR_ANY; | |
2880 | |
2881 lsopt.socklen = sizeof(struct sockaddr_in); | |
2882 | |
2883 lsopt.backlog = NGX_LISTEN_BACKLOG; | |
2884 lsopt.rcvbuf = -1; | |
2885 lsopt.sndbuf = -1; | |
2886 lsopt.wildcard = 1; | |
2887 | |
2888 (void) ngx_sock_ntop((struct sockaddr *) &lsopt.sockaddr, lsopt.addr, | |
2889 NGX_SOCKADDR_STRLEN, 1); | |
2890 | |
2891 if (ngx_http_add_listen(cf, conf, &lsopt) == NGX_OK) { | |
2892 return NGX_CONF_OK; | |
2893 } | |
2894 } | |
2895 | |
2896 if (conf->server_name.data == NULL) { | |
2897 conf->server_name = cf->cycle->hostname; | |
2898 | |
2899 sn = ngx_array_push(&conf->server_names); | |
2900 if (sn == NULL) { | |
2901 return NGX_CONF_ERROR; | |
2902 } | |
2903 | |
2904 #if (NGX_PCRE) | |
2905 sn->regex = NULL; | |
2906 #endif | |
2907 sn->server = conf; | |
2908 sn->name.len = conf->server_name.len; | |
2909 sn->name.data = conf->server_name.data; | |
2910 } | |
2911 | 2911 |
2912 return NGX_CONF_OK; | 2912 return NGX_CONF_OK; |
2913 } | 2913 } |
2914 | 2914 |
2915 | 2915 |