lkml.org 
[lkml]   [2019]   [Jul]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 004/158] ath6kl: add some bounds checking
    Date
    From: Dan Carpenter <dan.carpenter@oracle.com>

    [ Upstream commit 5d6751eaff672ea77642e74e92e6c0ac7f9709ab ]

    The "ev->traffic_class" and "reply->ac" variables come from the network
    and they're used as an offset into the wmi->stream_exist_for_ac[] array.
    Those variables are u8 so they can be 0-255 but the stream_exist_for_ac[]
    array only has WMM_NUM_AC (4) elements. We need to add a couple bounds
    checks to prevent array overflows.

    I also modified one existing check from "if (traffic_class > 3) {" to
    "if (traffic_class >= WMM_NUM_AC) {" just to make them all consistent.

    Fixes: bdcd81707973 (" Add ath6kl cleaned up driver")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/ath6kl/wmi.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c
    index 777acc564ac9..bc7916f2add0 100644
    --- a/drivers/net/wireless/ath/ath6kl/wmi.c
    +++ b/drivers/net/wireless/ath/ath6kl/wmi.c
    @@ -1178,6 +1178,10 @@ static int ath6kl_wmi_pstream_timeout_event_rx(struct wmi *wmi, u8 *datap,
    return -EINVAL;

    ev = (struct wmi_pstream_timeout_event *) datap;
    + if (ev->traffic_class >= WMM_NUM_AC) {
    + ath6kl_err("invalid traffic class: %d\n", ev->traffic_class);
    + return -EINVAL;
    + }

    /*
    * When the pstream (fat pipe == AC) timesout, it means there were
    @@ -1519,6 +1523,10 @@ static int ath6kl_wmi_cac_event_rx(struct wmi *wmi, u8 *datap, int len,
    return -EINVAL;

    reply = (struct wmi_cac_event *) datap;
    + if (reply->ac >= WMM_NUM_AC) {
    + ath6kl_err("invalid AC: %d\n", reply->ac);
    + return -EINVAL;
    + }

    if ((reply->cac_indication == CAC_INDICATION_ADMISSION_RESP) &&
    (reply->status_code != IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED)) {
    @@ -2635,7 +2643,7 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class,
    u16 active_tsids = 0;
    int ret;

    - if (traffic_class > 3) {
    + if (traffic_class >= WMM_NUM_AC) {
    ath6kl_err("invalid traffic class: %d\n", traffic_class);
    return -EINVAL;
    }
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-07-15 17:46    [W:4.713 / U:0.316 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site