aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/rfkill.h1
-rw-r--r--net/rfkill/rfkill.c11
2 files changed, 9 insertions, 3 deletions
diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h
index e92d8e94bb88..4cd64b0d9825 100644
--- a/include/linux/rfkill.h
+++ b/include/linux/rfkill.h
@@ -49,6 +49,7 @@ enum rfkill_state {
49 RFKILL_STATE_SOFT_BLOCKED = 0, /* Radio output blocked */ 49 RFKILL_STATE_SOFT_BLOCKED = 0, /* Radio output blocked */
50 RFKILL_STATE_UNBLOCKED = 1, /* Radio output allowed */ 50 RFKILL_STATE_UNBLOCKED = 1, /* Radio output allowed */
51 RFKILL_STATE_HARD_BLOCKED = 2, /* Output blocked, non-overrideable */ 51 RFKILL_STATE_HARD_BLOCKED = 2, /* Output blocked, non-overrideable */
52 RFKILL_STATE_MAX, /* marker for last valid state */
52}; 53};
53 54
54/* 55/*
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
index fae7ffade9c9..47e0b2d232e3 100644
--- a/net/rfkill/rfkill.c
+++ b/net/rfkill/rfkill.c
@@ -201,6 +201,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
201 * BLOCK even a transmitter that is already in state 201 * BLOCK even a transmitter that is already in state
202 * RFKILL_STATE_HARD_BLOCKED */ 202 * RFKILL_STATE_HARD_BLOCKED */
203 break; 203 break;
204 default:
205 return -EINVAL;
204 } 206 }
205 207
206 if (force || state != rfkill->state) { 208 if (force || state != rfkill->state) {
@@ -234,6 +236,9 @@ static void __rfkill_switch_all(const enum rfkill_type type,
234{ 236{
235 struct rfkill *rfkill; 237 struct rfkill *rfkill;
236 238
239 if (unlikely(state >= RFKILL_STATE_MAX))
240 return;
241
237 rfkill_global_states[type].current_state = state; 242 rfkill_global_states[type].current_state = state;
238 list_for_each_entry(rfkill, &rfkill_list, node) { 243 list_for_each_entry(rfkill, &rfkill_list, node) {
239 if ((!rfkill->user_claim) && (rfkill->type == type)) { 244 if ((!rfkill->user_claim) && (rfkill->type == type)) {
@@ -329,9 +334,7 @@ int rfkill_force_state(struct rfkill *rfkill, enum rfkill_state state)
329{ 334{
330 enum rfkill_state oldstate; 335 enum rfkill_state oldstate;
331 336
332 if (state != RFKILL_STATE_SOFT_BLOCKED && 337 if (unlikely(state >= RFKILL_STATE_MAX))
333 state != RFKILL_STATE_UNBLOCKED &&
334 state != RFKILL_STATE_HARD_BLOCKED)
335 return -EINVAL; 338 return -EINVAL;
336 339
337 mutex_lock(&rfkill->mutex); 340 mutex_lock(&rfkill->mutex);
@@ -727,6 +730,8 @@ int __must_check rfkill_register(struct rfkill *rfkill)
727 return -EINVAL; 730 return -EINVAL;
728 if (rfkill->type >= RFKILL_TYPE_MAX) 731 if (rfkill->type >= RFKILL_TYPE_MAX)
729 return -EINVAL; 732 return -EINVAL;
733 if (rfkill->state >= RFKILL_STATE_MAX)
734 return -EINVAL;
730 735
731 snprintf(dev->bus_id, sizeof(dev->bus_id), 736 snprintf(dev->bus_id, sizeof(dev->bus_id),
732 "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); 737 "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1);