| From 2131d3c2f99b081806fdae7662c92fe6acda52af Mon Sep 17 00:00:00 2001 |
| From: Pontus Fuchs <pontus.fuchs@gmail.com> |
| Date: Tue, 18 Oct 2011 09:23:41 +0200 |
| Subject: wl12xx: Validate FEM index from ini file and FW |
| |
| From: Pontus Fuchs <pontus.fuchs@gmail.com> |
| |
| commit 2131d3c2f99b081806fdae7662c92fe6acda52af upstream. |
| |
| Check for out of bound FEM index to prevent reading beyond ini |
| memory end. |
| |
| Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com> |
| Reviewed-by: Luciano Coelho <coelho@ti.com> |
| Signed-off-by: Luciano Coelho <coelho@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/wireless/wl12xx/cmd.c | 22 ++++++++++++++++++++++ |
| 1 file changed, 22 insertions(+) |
| |
| --- a/drivers/net/wireless/wl12xx/cmd.c |
| +++ b/drivers/net/wireless/wl12xx/cmd.c |
| @@ -120,6 +120,11 @@ int wl1271_cmd_general_parms(struct wl12 |
| if (!wl->nvs) |
| return -ENODEV; |
| |
| + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { |
| + wl1271_warning("FEM index from INI out of bounds"); |
| + return -EINVAL; |
| + } |
| + |
| gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); |
| if (!gen_parms) |
| return -ENOMEM; |
| @@ -148,6 +153,12 @@ int wl1271_cmd_general_parms(struct wl12 |
| gp->tx_bip_fem_manufacturer = |
| gen_parms->general_params.tx_bip_fem_manufacturer; |
| |
| + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { |
| + wl1271_warning("FEM index from FW out of bounds"); |
| + ret = -EINVAL; |
| + goto out; |
| + } |
| + |
| wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n", |
| answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer); |
| |
| @@ -167,6 +178,11 @@ int wl128x_cmd_general_parms(struct wl12 |
| if (!wl->nvs) |
| return -ENODEV; |
| |
| + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { |
| + wl1271_warning("FEM index from ini out of bounds"); |
| + return -EINVAL; |
| + } |
| + |
| gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); |
| if (!gen_parms) |
| return -ENOMEM; |
| @@ -191,6 +207,12 @@ int wl128x_cmd_general_parms(struct wl12 |
| gp->tx_bip_fem_manufacturer = |
| gen_parms->general_params.tx_bip_fem_manufacturer; |
| |
| + if (gp->tx_bip_fem_manufacturer >= WL1271_INI_FEM_MODULE_COUNT) { |
| + wl1271_warning("FEM index from FW out of bounds"); |
| + ret = -EINVAL; |
| + goto out; |
| + } |
| + |
| wl1271_debug(DEBUG_CMD, "FEM autodetect: %s, manufacturer: %d\n", |
| answer ? "auto" : "manual", gp->tx_bip_fem_manufacturer); |
| |