Commit 96c87607 authored by Henrique de Moraes Holschuh's avatar Henrique de Moraes Holschuh Committed by John W. Linville

rfkill: introduce RFKILL_STATE_MAX

While it is interesting to not add last-enum-markers because it allows gcc
to warn us of switch() statements missing a valid state, we really should
be handling memory corruption on a rfkill state with default clauses,
anyway.

So add RFKILL_STATE_MAX and use it where applicable.  It makes for safer
code in the long run.
Signed-off-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Acked-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 77fba13c
...@@ -49,6 +49,7 @@ enum rfkill_state { ...@@ -49,6 +49,7 @@ enum rfkill_state {
RFKILL_STATE_SOFT_BLOCKED = 0, /* Radio output blocked */ RFKILL_STATE_SOFT_BLOCKED = 0, /* Radio output blocked */
RFKILL_STATE_UNBLOCKED = 1, /* Radio output allowed */ RFKILL_STATE_UNBLOCKED = 1, /* Radio output allowed */
RFKILL_STATE_HARD_BLOCKED = 2, /* Output blocked, non-overrideable */ RFKILL_STATE_HARD_BLOCKED = 2, /* Output blocked, non-overrideable */
RFKILL_STATE_MAX, /* marker for last valid state */
}; };
/* /*
......
...@@ -201,6 +201,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, ...@@ -201,6 +201,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
* BLOCK even a transmitter that is already in state * BLOCK even a transmitter that is already in state
* RFKILL_STATE_HARD_BLOCKED */ * RFKILL_STATE_HARD_BLOCKED */
break; break;
default:
return -EINVAL;
} }
if (force || state != rfkill->state) { if (force || state != rfkill->state) {
...@@ -234,6 +236,9 @@ static void __rfkill_switch_all(const enum rfkill_type type, ...@@ -234,6 +236,9 @@ static void __rfkill_switch_all(const enum rfkill_type type,
{ {
struct rfkill *rfkill; struct rfkill *rfkill;
if (unlikely(state >= RFKILL_STATE_MAX))
return;
rfkill_global_states[type].current_state = state; rfkill_global_states[type].current_state = state;
list_for_each_entry(rfkill, &rfkill_list, node) { list_for_each_entry(rfkill, &rfkill_list, node) {
if ((!rfkill->user_claim) && (rfkill->type == type)) { if ((!rfkill->user_claim) && (rfkill->type == type)) {
...@@ -329,9 +334,7 @@ int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state) ...@@ -329,9 +334,7 @@ int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state)
{ {
enum rfkill_state oldstate; enum rfkill_state oldstate;
if (state != RFKILL_STATE_SOFT_BLOCKED && if (unlikely(state >= RFKILL_STATE_MAX))
state != RFKILL_STATE_UNBLOCKED &&
state != RFKILL_STATE_HARD_BLOCKED)
return -EINVAL; return -EINVAL;
mutex_lock(&rfkill->mutex); mutex_lock(&rfkill->mutex);
...@@ -727,6 +730,8 @@ int __must_check rfkill_register(struct rfkill *rfkill) ...@@ -727,6 +730,8 @@ int __must_check rfkill_register(struct rfkill *rfkill)
return -EINVAL; return -EINVAL;
if (rfkill->type >= RFKILL_TYPE_MAX) if (rfkill->type >= RFKILL_TYPE_MAX)
return -EINVAL; return -EINVAL;
if (rfkill->state >= RFKILL_STATE_MAX)
return -EINVAL;
snprintf(dev->bus_id, sizeof(dev->bus_id), snprintf(dev->bus_id, sizeof(dev->bus_id),
"rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment