module develop --nginx segmentation fault

Delta Yeh delta.yeh at gmail.com
Thu Aug 21 15:44:24 MSD 2008


I want to refactor the ncache2.0  because it don't follow the "best
practice" module configuration.
I want to add a on/off flag like the gzip module .
I comment some call back function in module configuration when I 'm
debuging it .

the code segment is :


static ngx_command_t  ncache_http_get_cache_commands[] = {

	{ ngx_string("ncache_http_cache"),
	NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
	ncache_http_cache_enable,
	NGX_HTTP_MAIN_CONF_OFFSET,
	0,
	NULL },
.....
}

static ngx_http_module_t  ncache_http_get_cache_module_ctx = {
	NULL,                                  /* preconfiguration */
	NULL,//ncache_http_upstream_cache_init,	   /* postconfiguration */

	NULL,                                  /* create main configuration */
	NULL,                                  /* init main configuration */

	NULL,                                  /* create server configuration */
	NULL,                                  /* merge server configuration */

	ngx_http_ncache_create_conf,   /* create location configuration */
	ngx_http_ncache_merge_conf    /* merge location configuration */
};

ngx_module_t  ncache_http_get_cache_module = {
	NGX_MODULE_V1,
	&ncache_http_get_cache_module_ctx,		/* module context */
	ncache_http_get_cache_commands,		/* module directives */
	NGX_HTTP_MODULE,				/* module type */
	NULL,							/* init master */
	NULL,//ncache_http_proxy_module_init,	/* init module */
	NULL,//ncache_http_upstream_cache_process_init,/* init process */
	NULL,							/* init thread */
	NULL,							/* exit thread */
	NULL,							/* exit process */
	NULL,							/* exit master */
	NGX_MODULE_V1_PADDING
};

static void *
ngx_http_ncache_create_conf(ngx_conf_t *cf)
{
    ngx_http_ncache_conf_t  *conf;

ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                     "NCACHE CONF create");
    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ncache_conf_t));
    if (conf == NULL) {
        return NGX_CONF_ERROR;
    }

    conf->enable = 0;
    conf->ignore_client_no_cache=0;
    conf->max_hash_size=24;

    return conf;
}


static char *
ngx_http_ncache_merge_conf(ngx_conf_t *cf, void *parent, void *child)
{
    ngx_http_ncache_conf_t *prev = parent;
    ngx_http_ncache_conf_t *conf = child;

	 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                     "NCACHE CONF MERGE ");

    ngx_conf_merge_value(conf->enable, prev->enable, 0);
    ngx_conf_merge_value(conf->ignore_client_no_cache,
prev->ignore_client_no_cache, 0);
    ngx_conf_merge_value(conf->max_hash_size, prev->max_hash_size, 24);
    if (conf->cache_dirs== NULL) {
        conf->cache_dirs = prev->cache_dirs;
	cache_dirs=conf->cache_dirs;
    }
	

    return NGX_CONF_OK;
}

static char *
ncache_http_cache_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{

	
	ngx_http_ncache_conf_t* ncachecf=conf;
	ngx_str_t   *value;

	value = cf->args->elts;
	
	ngx_strlow(value[1].data, value[1].data, value[1].len);


	if(ncachecf == NULL){
		ngx_conf_log_error(NGX_LOG_EMERG,cf,0,"NULL conf");
		return NGX_CONF_ERROR;
	}
      if (ngx_strcasecmp(value[1].data, (u_char *) "on") == 0) {
		
		ncachecf->enable=1;
		ngx_http_core_loc_conf_t  *clcf ;
		clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

		clcf->handler = ncache_http_get_cache_handler;
		
    	}else{
    	
    		ncachecf->enable=0;
    	}
     return NGX_CONF_OK;
}



when I run  test the config, the out put is :

# sbin/nginx -t -c conf/nginx.conf
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:14
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:83
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:89
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:94
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:101
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:112
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:120
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:123
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:126
2008/08/21 17:52:21 [emerg] 19056#0: NCACHE CONF create in conf/nginx.conf:130
2008/08/21 17:52:21 [emerg] 19056#0: value is 2 ,1.ncache_http_cache
2.off in conf/nginx.conf:132
2008/08/21 17:52:21 [emerg] 19056#0: NULL conf in conf/nginx.conf:132
2008/08/21 17:52:21 [emerg] 19056#0: the configuration file
conf/nginx.conf test failed


when i test the config file without the ncache_http_cache directive ,
the output is :



# sbin/nginx -t -c conf/nginx2.conf
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:14
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:83
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:89
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:94
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:101
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:110
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:118
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:121
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:124
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:128
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF create in conf/nginx2.conf:134
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [emerg] 19166#0: NCACHE CONF MERGE  in conf/nginx2.conf:150
2008/08/21 19:43:16 [info] 19166#0: the configuration file
conf/nginx2.conf syntax is ok
2008/08/21 19:43:16 [info] 19166#0: the configuration file
conf/nginx2.conf was tested successfully


2008/8/21 Delta Yeh <delta.yeh at gmail.com>:
> Hi,
>  ncache_http_xxxx_enable(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
>
> the conf is NULL.
>
>
>
> 2008/8/21 Sergey Bochenkov <bachan at j3qq4.org>:
>>
>> What 3rd parameter if you said, that directive can take only one?
>>
>> NGX_CONF_TAKE1 means, that:
>>
>> ngx_str_t *value = cf->args->elts;
>>
>> ngx_str_t *directive_name   = &value[0]; // name of the directive
>> ngx_str_t *directive_param1 = &value[1]; // first (and last) directive parameter
>>
>>> Hi ,
>>>    I developed a nginx module, and compile is ok.
>>>  When I test the config file without the module directive ,it's ok.
>>> But when I test the config file with the module directive , segmentationo fault.
>>> I add log in the command set function and found the 3rd parameter is  null .
>>> I have set the correct location create&merge conf function in the
>>> module ctx structure.
>>> The directive is  flag is
>>> "NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1"
>>>
>>> Any idea on the reason?
>>>
>>> BR,
>>> DeltaY
>>>
>>>
>>
>>
>>
>>
>





More information about the nginx mailing list