summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/buflib.c16
1 files changed, 15 insertions, 1 deletions
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;