Kernel Protections/refcount t
Revision as of 12:19, 6 February 2017 by DavidWindsor (talk | contribs) (Change <tt> tags to <code>)
Summary
HARDENED_ATOMIC is a kernel self-protection mechanism that greatly helps with the mitigation of use-after-free bugs. It is based off of work done by the PaX Team, originally called PAX_REFCOUNT.
Reference Counting API
HARDENED_ATOMIC introduces a new data type: refcount_t. This type is to be used for all kernel reference counters.
The following is the kernel reference counting API. Please note that all operations are atomic, unless otherwise specified.
REFCOUNT_INIT(unsigned int)- Initialize a
refcount_tobject.
void refcount_set(refcount_t *, unsigned int)- Set a
refcount_tobject's internal value.
unsigned int refcount_read(refcount_t *)- Returns the
refcount_tobject's internal value.
bool refcount_add_not_zero(unsigned int v, refcount_t *r)- Add
vtor. Ifr + vcauses an overflow, the result of the addition operation is not saved tor. Returnstrueif the resulting value ofris non-zero,falseotherwise.
void refcount_add(unsigned int v, refcount_t *r)- Adds
vtorand stores the value inr.
bool refcount_inc_not_zero(refcount_t *r)- Increments
rand tests whetherr + 1causes an overflow. If an overflow does occur, the result of the increment operation is not saved tor. Will saturate atUINT_MAXandWARN. Returnstrueif the resulting value ofris non-zero,falseotherwise.
void refcount_inc(refcount_t *r)- Increment
r. Will saturate atUINT_MAXandWARN.
bool refcount_sub_and_test(unsigned int v, refcount_t *r)- Subtract
vfromrand tests whetherr - vcauses an underflow. If an underflow does occur, the result of the decrement operation is not saved tor. Will fail to decrement when saturated atUINT_MAX. Returnstrueif the resulting value ofris non-zero,falseotherwise.
void refcount_dec(refcount_t *r)- Decrement
r. Ifr - 1causes an underflow, the result of the decrement operation is not saved tor. Will fail to decrement when saturated atUINT_MAX.
bool refcount_dec_if_one(refcount_t *r)- Attempts to transition
rfrom 1 to 0. Ifris 1, decrement it to 0. Returnstrueifrwas decremented,falseotherwise.
bool refcount_dec_not_one(refcount_t *r)- Decrement
runless the value ofris 1. Returnstrueifrwas decremented, false otherwise.
bool refcount_dec_and_mutex_lock(refcount_t *r, struct mutex *lock)- Decrement
rand lock mutex ifrbecomes 0. WillWARNon underflow and fail to decrement ifris saturated atUINT_MAX. Returnstrueifris 0 and mutex is held,falseotherwise.
bool refcount_dec_and_lock(refcount_t *r, spinlock_t *s)- Decrement
rand lock spinlock ifrbecomes 0. WillWARNon underflow and fail to decrement ifris saturated atUINT_MAX. Returnstrueifris 0 and spinlock is held,falseotherwise.