nginx regex module screws up pcre
Nick Kew
niq at apache.org
Sat Dec 29 19:47:21 UTC 2012
I've just spent a long debug session figuring this out!
nginx's regex module sets pcre_malloc and pcre_free globally:
void
ngx_regex_init(void)
{
pcre_malloc = ngx_regex_malloc;
pcre_free = ngx_regex_free;
}
So any other module or library using pcre inherits nginx's
functions. But those functions rely on an nginx pool, which
gets set and unset in ngx_regex_module_init and in
ngx_regex_compile. So anything else calling pcre_compile
gets a NULL pool, and allocation fails.
Another module may be able to work around that by using
ngx_regex_compile in place of pcre_compile. For a third-
party library that's not an option: we're basically screwed!
If nginx is setting pcre_malloc and pcre_free, it should set
them to functions that will work at any time a third-party
might call them.
The outline of a scheme might be for ngx_regex_init to set
ngx_pcre_pool to the cycle pool, and thereafter each pool
creation/cleanup event gets a callback that may push/pop
the new/old pool. I guess that still needs care to limit it to
connection and request pools, and not automatically trigger
on inappropriate special-purpose pools.
Does that make sense?
--
Nick Kew
More information about the nginx-devel
mailing list