mempool: check poison on destroy
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 9 Mar 2024 21:55:24 +0000 (16:55 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 9 Mar 2024 21:56:41 +0000 (16:56 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I40fe7d4179e42a392f3528cc9697552fe7c4ad09

src/rseq-mempool.c

index 583ba936d4f642a9d629bd98bb0288ad9f14b6ef..1562a75a4ea25b404d15707039046dc85792727d 100644 (file)
@@ -139,7 +139,7 @@ const char *get_pool_name(const struct rseq_mempool *pool)
 }
 
 static
-void *__rseq_pool_range_percpu_ptr(struct rseq_mempool_range *range, int cpu,
+void *__rseq_pool_range_percpu_ptr(const struct rseq_mempool_range *range, int cpu,
                uintptr_t item_offset, size_t stride)
 {
        return range->base + (stride * cpu) + item_offset;
@@ -177,8 +177,8 @@ void rseq_percpu_poison_item(struct rseq_mempool *pool,
 
 /* Always inline for __builtin_return_address(0). */
 static inline __attribute__((always_inline))
-void rseq_percpu_check_poison_item(struct rseq_mempool *pool,
-               struct rseq_mempool_range *range, uintptr_t item_offset)
+void rseq_percpu_check_poison_item(const struct rseq_mempool *pool,
+               const struct rseq_mempool_range *range, uintptr_t item_offset)
 {
        uintptr_t poison = pool->attr.poison;
        int i;
@@ -371,6 +371,30 @@ void check_free_list(const struct rseq_mempool *pool)
        }
 }
 
+/* Always inline for __builtin_return_address(0). */
+static inline __attribute__((always_inline))
+void check_range_poison(const struct rseq_mempool *pool,
+               const struct rseq_mempool_range *range)
+{
+       size_t item_offset;
+
+       for (item_offset = 0; item_offset < range->next_unused;
+                       item_offset += pool->item_len)
+               rseq_percpu_check_poison_item(pool, range, item_offset);
+}
+
+/* Always inline for __builtin_return_address(0). */
+static inline __attribute__((always_inline))
+void check_pool_poison(const struct rseq_mempool *pool)
+{
+       struct rseq_mempool_range *range;
+
+       if (!pool->attr.robust_set || !pool->attr.poison_set)
+               return;
+       for (range = pool->range_list; range; range = range->next)
+               check_range_poison(pool, range);
+}
+
 /* Always inline for __builtin_return_address(0). */
 static inline __attribute__((always_inline))
 void destroy_alloc_bitmap(struct rseq_mempool *pool, struct rseq_mempool_range *range)
@@ -557,6 +581,7 @@ int rseq_mempool_destroy(struct rseq_mempool *pool)
        if (!pool)
                return 0;
        check_free_list(pool);
+       check_pool_poison(pool);
        /* Iteration safe against removal. */
        for (range = pool->range_list; range && (next_range = range->next, 1); range = next_range) {
                if (rseq_mempool_range_destroy(pool, range))
This page took 0.027284 seconds and 4 git commands to generate.