From 46141941e58419b3325e50eebac683baeede2c19 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sun, 24 Mar 2024 21:10:43 +0000 Subject: khashl: use ruby_xrealloc2 to avoid overflow While no user is likely to have enough listeners to trigger an overflow, just use ruby_xrealloc2 to be safe since it's already provided by Ruby (and AFAIK reallocarray(3) isn't standardized). --- ext/raindrops/khashl.h | 8 ++++---- ext/raindrops/linux_inet_diag.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'ext/raindrops') diff --git a/ext/raindrops/khashl.h b/ext/raindrops/khashl.h index df97c7f..425d95e 100644 --- a/ext/raindrops/khashl.h +++ b/ext/raindrops/khashl.h @@ -164,9 +164,8 @@ static kh_inline khint_t __kh_h2b(khint_t hash, khint_t bits) { return hash * 26 if (!new_used) return -1; /* not enough memory */ \ n_buckets = h->keys? (khint_t)1U<bits : 0U; \ if (n_buckets < new_n_buckets) { /* expand */ \ - khkey_t *new_keys = (khkey_t*)krealloc((void*)h->keys, new_n_buckets * sizeof(khkey_t)); \ - if (!new_keys) { kfree(new_used); return -1; } \ - h->keys = new_keys; \ + h->keys = ruby_xrealloc2(h->keys, new_n_buckets, \ + sizeof(khkey_t)); \ } /* otherwise shrink */ \ new_mask = new_n_buckets - 1; \ for (j = 0; j != n_buckets; ++j) { \ @@ -189,7 +188,8 @@ static kh_inline khint_t __kh_h2b(khint_t hash, khint_t bits) { return hash * 26 } \ } \ if (n_buckets > new_n_buckets) /* shrink the hash table */ \ - h->keys = (khkey_t*)krealloc((void *)h->keys, new_n_buckets * sizeof(khkey_t)); \ + h->keys = ruby_xrealloc2(h->keys, new_n_buckets, \ + sizeof(khkey_t)); \ kfree(h->used); /* free the working space */ \ h->used = new_used, h->bits = new_bits; \ return 0; \ diff --git a/ext/raindrops/linux_inet_diag.c b/ext/raindrops/linux_inet_diag.c index d0638d7..2fd158a 100644 --- a/ext/raindrops/linux_inet_diag.c +++ b/ext/raindrops/linux_inet_diag.c @@ -53,10 +53,10 @@ struct listen_stats { uint32_t listener_p; }; -/* override khashl.h defaults */ +/* override khashl.h defaults, these run w/o GVL */ #define kcalloc(N,Z) xcalloc(N,Z) #define kmalloc(Z) xmalloc(Z) -#define krealloc(P,Z) xrealloc(P,Z) +#define krealloc(P,Z) abort() /* never called, we use ruby_xrealloc2 */ #define kfree(P) xfree(P) #include "khashl.h" -- cgit v1.2.3-24-ge0c7