#include <linux/refcount.h>
#ifdef CONFIG_REFCOUNT_FULL
#define REFCOUNT_MAX (UINT_MAX - 1)
#define REFCOUNT_SATURATED UINT_MAX
#define REFCOUNT_MAX INT_MAX
#define REFCOUNT_SATURATED (INT_MIN / 2)
static void overflow_check(refcount_t *ref)
switch (refcount_read(ref)) {
pr_info("Overflow detected: saturated\n");
pr_warn("Overflow detected: unsafely reset to max\n");
pr_err("Fail: refcount wrapped to %d\n", refcount_read(ref));
void lkdtm_REFCOUNT_INC_OVERFLOW(void)
refcount_t over = REFCOUNT_INIT(REFCOUNT_MAX - 1);
pr_info("attempting good refcount_inc() without overflow\n");
pr_info("attempting bad refcount_inc() overflow\n");
void lkdtm_REFCOUNT_ADD_OVERFLOW(void)
refcount_t over = REFCOUNT_INIT(REFCOUNT_MAX - 1);
pr_info("attempting good refcount_add() without overflow\n");
pr_info("attempting bad refcount_add() overflow\n");
void lkdtm_REFCOUNT_INC_NOT_ZERO_OVERFLOW(void)
refcount_t over = REFCOUNT_INIT(REFCOUNT_MAX);
pr_info("attempting bad refcount_inc_not_zero() overflow\n");
if (!refcount_inc_not_zero(&over))
pr_warn("Weird: refcount_inc_not_zero() reported zero\n");
void lkdtm_REFCOUNT_ADD_NOT_ZERO_OVERFLOW(void)
refcount_t over = REFCOUNT_INIT(REFCOUNT_MAX);
pr_info("attempting bad refcount_add_not_zero() overflow\n");
if (!refcount_add_not_zero(6, &over))
pr_warn("Weird: refcount_add_not_zero() reported zero\n");
static void check_zero(refcount_t *ref)