Segmentation fault - signal 11

dalspenguin nginx-forum at nginx.us
Wed Apr 22 01:39:59 MSD 2009


hello, 

I have created module which contains the function set_crc32. 
You can find the source of it below:
I've tested it on the Ubuntu and the function set_crc32 returned the value without any errors:
You can find the invoking set_crc32 below. 
However when I tried to run it on the FreeBSD 7.1 x64
I got the error:
worker process 53751 exited on signal 11

Please, help me. Does anyone know what I need to do?
I read the documents about signal 11. It means segmentation fault.
Did I work incorrect with r->pool ?
How do I need to free the memory?
The documentation says I do not need to use ngx_free to free the memory.
What is the right way?

------ Configure file ------------------------
server {
    listen       80;
    
    server_name  localhost;
	
    # Check if our special is not already set 
    if ($http_cookie !~ ^.*crc32_value=\d+.*$ ) {
	set $crc2_num1 "127.0.1.2";	
        set_crc32 $crc32_num $crc2_num1 "55";
        set $crc32_value $crc32_num; # We will use that later to set the outgoing cookie
        set $crc32_cookie "crc32_value=$crc32_value; $http_cookie"; # This will be sent to the upstream - simulated cookie
    }
    
    
				    								      
    location / {
          proxy_set_header Cookie $crc32_cookie; # Make sure we have the correct cookie passed to the upstream
          add_header Set-Cookie "crc32_value=$crc32_value"; # Make it stick with the client
          root   html;
          index  index.html index.htm;
          if (!-f $request_filename) {
              proxy_pass http://localhost;
              break;
	  }
    }
}



------ Module source ---------------------

     #include 
       #include 
       #include 
       
       static char *ngx_http_crc32_set_crc32(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
       
       static ngx_int_t ngx_http_crc32_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); 
       static ngx_int_t ngx_http_crc32_set_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data);
       
       
       static ngx_command_t  ngx_http_set_crc32_commands[] = {
       
           { ngx_string("set_crc32"),
             NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE3,
	     ngx_http_crc32_set_crc32,
	     0, 
	     0,
	     NULL },
	     ngx_null_command
	   };
					       
					       
       static ngx_http_module_t  ngx_http_set_crc32_module_ctx = {
           NULL,  NULL, NULL, NULL,  NULL, NULL, NULL, NULL 
		   };
						   
						   
       ngx_module_t  ngx_http_set_crc32_module = {
	   NGX_MODULE_V1,
           &ngx_http_set_crc32_module_ctx,       /* module context */
           ngx_http_set_crc32_commands,          /* module directives */
           NGX_HTTP_MODULE,                       /* module type */
           NULL,                                  /* init master */
           NULL,                                  /* init module */
           NULL,                                  /* init process */
           NULL,                                  /* init thread */
           NULL,                                  /* exit thread */
           NULL,                                  /* exit process */
           NULL,                                  /* exit master */
           NGX_MODULE_V1_PADDING
       };

      static char * ngx_http_crc32_set_crc32(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
      {
	ngx_str_t *value;

        ngx_http_variable_t *vReturnValue;
        ngx_http_variable_t *vIpAddress;
		
	unsigned char       *buff;	 	 		
	
	// get command parameters		
        value = cf->args->elts;
	
	// read first parameter - returned value
        if (value[1].data[0] != '$') {
	    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid the first parameter(returned variable) name. It should begin with $ \"%V\"", &value[1]);	    
            return NGX_CONF_ERROR;
	}

	// read second parameter
        if (value[2].data[0] != '$') {
	    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid the secord parameter name. It should begin with $ \"%V\"", &value[2]);	    
            return NGX_CONF_ERROR;
	}

	// read second parameter
        if (value[3].data[0] == '$') {
	    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "invalid the third parameter name. It should not begin with $ \"%V\"", &value[3]);	    
            return NGX_CONF_ERROR;
	}	
	
	value[1].len--;
	value[1].data++;
	vReturnValue = ngx_http_add_variable(cf, &value[1], 0); 

	value[2].len--;
	value[2].data++;	
	vIpAddress = ngx_http_add_variable(cf, &value[2], 0); 

	
	if (vReturnValue == NULL) {	    
	    return NGX_CONF_ERROR;
	}

	if (vIpAddress == NULL) {	    
	    return NGX_CONF_ERROR;
	}
	
	if (vReturnValue->get_handler == NULL ){	
    	    vReturnValue->get_handler = ngx_http_crc32_variable;	    
	    // read third parameter 
    	    buff = ngx_palloc(cf->pool, value[3].len + 1);	    
    	    ngx_cpystrn(buff, value[3].data, value[3].len + 1);	    	    
    	    vReturnValue->data = (uintptr_t)buff;
	} 
	else { 	    
    	    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, "The value for Returned Variable already defined: \"%V\". Please, do not initialize returned variable before call set_crc32.", &value[1]);
    	    return NGX_CONF_ERROR;
	}
        return NGX_CONF_OK;
}
																									       
static ngx_int_t ngx_http_crc32_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) 
{   
	ngx_str_t ipAddress = {ngx_strlen(r->variables[1].data), (unsigned char *) r->variables[1].data };	
	ngx_str_t ext = { ngx_strlen(data), (unsigned char *)data };	
	char* buff = ngx_palloc(r->pool, ipAddress.len + ext.len + 1);
	sprintf(buff, "%s%s", ipAddress.data, ext.data);	
	ngx_uint_t   ucrc32;	    	
	ucrc32 = ngx_crc32_short((u_char*)buff, strlen(buff));			
	v->data=ngx_palloc(r->pool, 10);
	ngx_sprintf(v->data, "%d", ucrc32);
	v->data[9] = 0;
	v->len = 9;
        /* Set all required params */
	v->valid = 1;
        v->no_cacheable = 0;
        v->not_found = 0;	
	
        return NGX_OK;
}

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,1302,1302#msg-1302






More information about the nginx mailing list