details: https://hg.nginx.org/njs/rev/78c1ef3eeaa9 branches: changeset: 2195:78c1ef3eeaa9 user: Vadim Zhestikov <v.zhesti...@f5.com> date: Fri Sep 08 16:05:24 2023 -0700 description: Added flat hash overflow check.
diffstat: src/njs_flathsh.c | 26 ++++++++++++++++---------- 1 files changed, 16 insertions(+), 10 deletions(-) diffs (63 lines): diff -r f5428bc87159 -r 78c1ef3eeaa9 src/njs_flathsh.c --- a/src/njs_flathsh.c Thu Sep 07 16:12:40 2023 -0700 +++ b/src/njs_flathsh.c Fri Sep 08 16:05:24 2023 -0700 @@ -87,7 +87,7 @@ struct njs_flathsh_descr_s { static njs_flathsh_descr_t *njs_flathsh_alloc(njs_flathsh_query_t *fhq, size_t hash_size, size_t elts_size); static njs_flathsh_descr_t *njs_expand_elts(njs_flathsh_query_t *fhq, - njs_flathsh_descr_t *h, uint32_t count); + njs_flathsh_descr_t *h); njs_inline size_t @@ -204,8 +204,8 @@ njs_flathsh_add_elt(njs_flathsh_t *fh, n return NULL; } - if (njs_slow_path(h->elts_count >= h->elts_size)) { - h = njs_expand_elts(fhq, fh->slot, h->elts_count + 1); + if (njs_slow_path(h->elts_count == h->elts_size)) { + h = njs_expand_elts(fhq, h); if (njs_slow_path(h == NULL)) { return NULL; } @@ -228,26 +228,32 @@ njs_flathsh_add_elt(njs_flathsh_t *fh, n static njs_flathsh_descr_t * -njs_expand_elts(njs_flathsh_query_t *fhq, njs_flathsh_descr_t *h, - uint32_t count) +njs_expand_elts(njs_flathsh_query_t *fhq, njs_flathsh_descr_t *h) { void *chunk; - size_t size; - uint32_t new_elts_size, new_hash_size, new_hash_mask, i; + size_t size, new_elts_size, new_hash_size; + uint32_t new_hash_mask, i; njs_int_t cell_num; njs_flathsh_elt_t *elt; njs_flathsh_descr_t *h_src; - new_elts_size = h->elts_size * NJS_FLATHSH_ELTS_EXPAND_FACTOR_NUM / + new_elts_size = h->elts_size * (size_t) NJS_FLATHSH_ELTS_EXPAND_FACTOR_NUM / NJS_FLATHSH_ELTS_EXPAND_FACTOR_DENOM; - new_elts_size = njs_max(count, new_elts_size); - new_hash_size = h->hash_mask + 1; + new_elts_size = njs_max(h->elts_count + 1ul, new_elts_size); + + new_hash_size = h->hash_mask + 1ul; while (new_hash_size < new_elts_size) { new_hash_size = 2 * new_hash_size; } + /* Overflow check. */ + + if (njs_slow_path(new_hash_size > UINT32_MAX)) { + return NULL; + } + if (new_hash_size != (h->hash_mask + 1)) { /* Expand both hash table cells and its elts. */ _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel