Skip to content

Modules: fixed double-free in shared dict update with eviction.#1041

Draft
xeioex wants to merge 1 commit intonginx:masterfrom
xeioex:shared_dict_evict_crash
Draft

Modules: fixed double-free in shared dict update with eviction.#1041
xeioex wants to merge 1 commit intonginx:masterfrom
xeioex:shared_dict_evict_crash

Conversation

@xeioex
Copy link
Contributor

@xeioex xeioex commented Mar 26, 2026

When updating an existing key's string value in a shared dictionary with timeout and evict enabled, ngx_js_dict_alloc() could trigger ngx_js_dict_evict() if the zone was full. Since the node being updated was still in the expire tree, eviction could free it. The subsequent ngx_slab_free_locked() call in the update path then freed the already-freed string data, causing the "chunk is already free" alert followed by a segfault.

The issue was more likely to occur when the zone fills to capacity and eviction is triggered during the update path.

This closes #1036 issue on Github.

When updating an existing key's string value in a shared dictionary
with timeout and evict enabled, ngx_js_dict_alloc() could trigger
ngx_js_dict_evict() if the zone was full.  Since the node being
updated was still in the expire tree, eviction could free it.  The
subsequent ngx_slab_free_locked() call in the update path then freed
the already-freed string data, causing the "chunk is already free"
alert followed by a segfault.

The issue was more likely to occur when the zone fills to capacity
and eviction is triggered during the update path.

This closes nginx#1036 issue on Github.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Shared Memory "Already Free" Bug?

1 participant