fix accidental corrdump
Maxim Dounin
mdounin at mdounin.ru
Fri Sep 30 12:06:36 UTC 2022
Hello!
On Fri, Sep 30, 2022 at 12:07:47PM +0800, zjd wrote:
> If disturb everyone, I'm sorry.
>
> l->alloc itself address(&l->alloc) in the pool can be reused
> rather than l->alloc pointer to wild address, &l->alloc return
> to pool.
> And I try only use large memory with Maxim's way, but it's not
> coredump. Because coredump is accident, not coredump maybe be
> reasonable. if l->alloc is not setted NULL after free, the place
> where use ngx_palloc or ngx_array_push etc, need memzero to
> avoid wild pointer after use ngx_reset_pool.
The ngx_palloc() and ngx_array_push() are expected to return
allocated, but uninitialized memory, much like normal malloc().
The returned memory needs to be initialized before use.
If you need zeroed memory, you can either use ngx_calloc(), which
explicitly initializes all allocated bytes to zero, much like
calloc(), or clear the memory yourself with ngx_memzero().
Compiling nginx with NGX_DEBUG_PALLOC and using your OS malloc
options to debug memory should help to catch memory access bugs,
and using uninitialized memory in particular. When using Linux,
see [1], notably MALLOC_CHECK_ and MALLOC_PERTURB_ environment
variables (note that you may need to use env[2] to pass these to
worker processes).
Alternatively, you may consider using various tools, such as
Address Sanitizer, Memory Sanitizer, and Valgrind. These may
need some effort to make them work correctly, though should should
catch most of the possible bugs, including out-of-bounds accesses
and uninitialized memory accesses (see, for example, [3]).
Hope this helps.
[1] https://man7.org/linux/man-pages/man3/mallopt.3.html
[2] http://nginx.org/r/env
[3] https://developers.redhat.com/blog/2021/05/05/memory-error-checking-in-c-and-c-comparing-sanitizers-and-valgrind
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx
mailing list