Forum: NGINX Segmentation fault - signal 11

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
dalspenguin (Guest)
on 2009-04-22 01:46
(Received via mailing list)
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
This topic is locked and can not be replied to.