diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2024-11-15 09:38:23 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2024-11-15 09:39:22 -0500 |
| commit | a9eb78c53613aa9836e4968843eb1a93c9a5bff2 (patch) | |
| tree | 7de3710396f505b2158f321a943fbd346bb04b00 /pkev.h | |
| parent | 41ce960b60bbcf2c3d1a91828bd8ea7bc50a4f2d (diff) | |
pkev: enforce uint8_t size limits
Diffstat (limited to 'pkev.h')
| -rw-r--r-- | pkev.h | 20 |
1 files changed, 18 insertions, 2 deletions
@@ -24,6 +24,8 @@ void pk_ev_emit(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, void *user_emit_data); #ifdef PK_IMPL_EV +#include "pkmacros.h" /* deleteme */ + #include <assert.h> #include <stdatomic.h> #include <stdio.h> @@ -111,6 +113,8 @@ pk_ev_teardown() static struct pk_ev_mgr* pk_ev_inner_ev_mgr_create(uint64_t ev_count, uint64_t cb_count) { + assert(ev_count < 0x100); + assert(cb_count < 0x100); int i; struct pk_ev *ev; size_t sz = sizeof(struct pk_ev_mgr) + ((sizeof(struct pk_ev) * ev_count)) + (sizeof (struct pk_ev_cb) * ev_count * cb_count); @@ -197,11 +201,17 @@ const pk_ev_id_T pk_ev_register_ev(pk_ev_mgr_id_T evmgr, void *user_ev_data) { assert(evmgr < 64); + uint64_t new_size; pk_ev_id_T id; struct pk_ev_mgr *mgr; mtx_lock(&pk_ev_mstr.mtxs[evmgr]); if (pk_ev_mstr.mgrs[evmgr]->n_ev == pk_ev_mstr.mgrs[evmgr]->rn_ev) { - mgr = pk_ev_inner_ev_mgr_create(pk_ev_mstr.mgrs[evmgr]->rn_ev * PK_EV_GROW_RATIO, pk_ev_mstr.mgrs[evmgr]->rn_cb); + new_size = PK_MAX(2, PK_MIN(255, pk_ev_mstr.mgrs[evmgr]->rn_ev * PK_EV_GROW_RATIO)); + if (new_size == pk_ev_mstr.mgrs[evmgr]->rn_ev) { + PK_LOG_ERR("[pkev.h] need more room, but failed to grow ev count.\n"); + exit(1); + } + mgr = pk_ev_inner_ev_mgr_create(new_size, pk_ev_mstr.mgrs[evmgr]->rn_cb); pk_ev_inner_ev_mgr_clone(pk_ev_mstr.mgrs[evmgr], mgr); free(pk_ev_mstr.mgrs[evmgr]); pk_ev_mstr.mgrs[evmgr] = mgr; @@ -216,11 +226,17 @@ bool pk_ev_register_cb(pk_ev_mgr_id_T evmgr, pk_ev_id_T evid, pk_ev_cb_fn *cb, void *user_cb_data) { assert(evmgr < 64); + uint64_t new_size; struct pk_ev_mgr *mgr; uint8_t cb_index; mtx_lock(&pk_ev_mstr.mtxs[evmgr]); if (pk_ev_mstr.mgrs[evmgr]->ev[evid].n_ev_cbs == pk_ev_mstr.mgrs[evmgr]->rn_cb) { - mgr = pk_ev_inner_ev_mgr_create(pk_ev_mstr.mgrs[evmgr]->rn_ev, pk_ev_mstr.mgrs[evmgr]->rn_cb * PK_EV_GROW_RATIO); + new_size = PK_MAX(2, PK_MIN(255, pk_ev_mstr.mgrs[evmgr]->rn_cb * PK_EV_GROW_RATIO)); + if (new_size == pk_ev_mstr.mgrs[evmgr]->rn_cb) { + PK_LOG_ERR("[pkev.h] need more room, but failed to grow cb count.\n"); + exit(1); + } + mgr = pk_ev_inner_ev_mgr_create(pk_ev_mstr.mgrs[evmgr]->rn_ev, new_size); pk_ev_inner_ev_mgr_clone(pk_ev_mstr.mgrs[evmgr], mgr); free(pk_ev_mstr.mgrs[evmgr]); pk_ev_mstr.mgrs[evmgr] = mgr; |
