diff options
author | Henrique de Moraes Holschuh <hmh@hmh.eng.br> | 2008-08-02 14:11:00 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-08-22 16:29:57 -0400 |
commit | 96c87607ac8f9b0e641d11ba6e57f8ec0214ea1c (patch) | |
tree | d8a7d538b2bd05b5ee2957828563b31cf7db8540 /net/rfkill | |
parent | 77fba13ccc3a2a3db100892a4a6cc5e2f8290cc7 (diff) |
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: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
Acked-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/rfkill')
-rw-r--r-- | net/rfkill/rfkill.c | 11 |
1 files changed, 8 insertions, 3 deletions
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); |