From ecfec3e9bf9178299cb0fe64bd530a81e10b1142 Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Sun, 3 Apr 2022 10:45:11 +0100 Subject: buflib: add handle_to_block_end Change-Id: I598cf32bc8cd08ab4bca3827645e0a38b284468f --- firmware/buflib.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'firmware/buflib.c') diff --git a/firmware/buflib.c b/firmware/buflib.c index 52d52459a4..2a4b4b4f14 100644 --- a/firmware/buflib.c +++ b/firmware/buflib.c @@ -317,6 +317,20 @@ void handle_free(struct buflib_context *ctx, union buflib_data *handle) ctx->compact = false; } +static inline +union buflib_data* handle_to_block_end(struct buflib_context *ctx, int handle) +{ + void *ptr = buflib_get_data(ctx, handle); + + /* this is a valid case for shrinking if handle + * was freed by the shrink callback */ + if (!ptr) + return NULL; + + union buflib_data *data = ALIGN_DOWN(ptr, sizeof(*data)); + return data; +} + /* Get the start block of an allocation */ static inline union buflib_data* handle_to_block(struct buflib_context* ctx, int handle) @@ -1038,7 +1052,7 @@ buflib_shrink(struct buflib_context* ctx, int handle, void* new_start, size_t ne const char* buflib_get_name(struct buflib_context *ctx, int handle) { - union buflib_data *data = ALIGN_DOWN(buflib_get_data(ctx, handle), sizeof (*data)); + union buflib_data *data = handle_to_block_end(ctx, handle); size_t len = data[-bidx_BSIZE].val; if (len <= BUFLIB_NUM_FIELDS) return NULL; -- cgit