summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2024-11-15 09:38:23 -0500
committerJonathan Bradley <jcb@pikum.xyz>2024-11-15 09:39:22 -0500
commita9eb78c53613aa9836e4968843eb1a93c9a5bff2 (patch)
tree7de3710396f505b2158f321a943fbd346bb04b00
parent41ce960b60bbcf2c3d1a91828bd8ea7bc50a4f2d (diff)
pkev: enforce uint8_t size limits
-rw-r--r--pkev.h20
-rw-r--r--test/pkev.cpp36
2 files changed, 53 insertions, 3 deletions
diff --git a/pkev.h b/pkev.h
index c5cac08..3e01d83 100644
--- a/pkev.h
+++ b/pkev.h
@@ -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;
diff --git a/test/pkev.cpp b/test/pkev.cpp
index 5842b94..a1a3036 100644
--- a/test/pkev.cpp
+++ b/test/pkev.cpp
@@ -94,7 +94,7 @@ int main(int argc, char *argv[])
if (ev_one.handled == false || ev_two.handled == false) exit(1);
}
- // overload cbs and evs
+ // overload cbs and evs (grow once)
{
const uint64_t cb_count = PK_EV_INIT_CB_COUNT + 2;
const uint64_t ev_count = PK_EV_INIT_EV_COUNT + 2;
@@ -126,5 +126,39 @@ int main(int argc, char *argv[])
if (any_false == true) exit(1);
}
+ // overload cbs and evs (test limits)
+ {
+ const uint64_t cb_count = 255;
+ const uint64_t ev_count = 255;
+ struct ev evs[ev_count] = {{0}};
+ const pk_ev_mgr_id_T evmgr = test_setup();
+ for (i = 0; i < ev_count; ++i) {
+ evs[i].evmgr = evmgr;
+ evs[i].evid = pk_ev_register_ev(evmgr, NULL);
+ for (ii = 0; ii < cb_count; ++ii) {
+ pk_ev_register_cb(evmgr, evs[i].evid, &stress_cb, NULL);
+ }
+ }
+
+ for (i = 0; i < ev_count; ++i) {
+ struct cb_data *d = new struct cb_data{};
+ d->ev = evs;
+ d->i = i;
+ pk_ev_emit(evs[i].evmgr, evs[i].evid, d);
+ }
+
+ bool any_false = false;
+ uint64_t valid_count = 0;
+ for (i = 0; i < ev_count; ++i) {
+ if (evs[i].handled == true && evs[i].count == 0xFF) valid_count += 1;
+ any_false = any_false || !evs[i].handled;
+ }
+ PK_LOGV_INF("%s: #valid: %lu, called count: %i\n", __FILE__, valid_count, evs[0].count);
+ pk_ev_teardown();
+ fflush(stdout);
+ fflush(stderr);
+ if (any_false == true) exit(1);
+ }
+
return 0;
}