nginx内存池损坏了吗?

时间:2015-10-01 03:10:02

标签: c nginx

我有一个库,在构造函数中需要const char *src。如下:

MYCLASS::MYCLASS(const char *src)

我试图从nginx模块中使用它来将cookie的值传递给这个库,并且我得到了一些内存损坏。

我无法弄清楚我此刻做错了什么。在“' cookie”的调试中报告的cookie值总是正确的,但是在u_cookie上报告的那个只在第一个请求上是正确的,在nginx提供其他请求并且池以某种方式被其他人使用之后,返回的值总是包含一个额外的字符。

ngx_str_t cookie = (ngx_str_t)ngx_string("THECOOKIE");
ngx_int_t location;
ngx_str_t cookie_value;
location = ngx_http_parse_multi_header_lines(&r->headers_in.cookies, &cookie, &cookie_value);

ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,"cookie: \"%V\"", &cookie_value);

u_char *u_cookie = (u_char *)ngx_pcalloc(r->pool, cookie_value.len);
ngx_copy(u_cookie, cookie_value.data, cookie_value.len);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,"u_cookie: \"%s\"", u_cookie);

MYCLASS myclass( (const char*)u_cookie );

日志中的输出看起来像这样..

  

2015/09/30 04:49:32 [debug] cookie:" 405JanIN9ztP / snEzyucny8KdgN"

     

2015/09/30 04:49:32 [debug] u_cookie:" 405JanIN9ztP / snEzyucny8KdgNo"

1 个答案:

答案 0 :(得分:0)

这是因为ngx_copy只能复制N个字符(其中N - 是cookie的长度)。但是你也需要设置空字符串终止符!像这样:

u_char *u_cookie = (u_char *)ngx_pcalloc(r->pool, cookie_value.len + 1); // +1 for null char
ngx_copy(u_cookie, cookie_value.data, cookie_value.len);
u_cookie[cookie_value.len] = 0