The helper mac_pton() validates and converts MAC address from string format to a number. Originally code uses simple code to do that. With mac_pton() the driver now validates input as well. MEanwhile hex2bin() converts hexdecimal strings to its binary representation. As the other helper it validates the input. Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> --- drivers/staging/rtl8188eu/core/rtw_ieee80211.c | 33 +---- drivers/staging/rtl8188eu/include/wlan_bssdef.h | 4 - drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | 153 ++++++++++-------------- 3 files changed, 66 insertions(+), 124 deletions(-) diff --git a/drivers/staging/rtl8188eu/core/rtw_ieee80211.c b/drivers/staging/rtl8188eu/core/rtw_ieee80211.c index 0552019..c46e5ce 100644 --- a/drivers/staging/rtl8188eu/core/rtw_ieee80211.c +++ b/drivers/staging/rtl8188eu/core/rtw_ieee80211.c @@ -1067,41 +1067,18 @@ enum parse_res rtw_ieee802_11_parse_elems(u8 *start, uint len, return unknown ? ParseUnknown : ParseOK; } -u8 key_char2num(u8 ch) -{ - if ((ch >= '0') && (ch <= '9')) - return ch - '0'; - else if ((ch >= 'a') && (ch <= 'f')) - return ch - 'a' + 10; - else if ((ch >= 'A') && (ch <= 'F')) - return ch - 'A' + 10; - else - return 0xff; -} - -u8 str_2char2num(u8 hch, u8 lch) -{ - return (key_char2num(hch) * 10) + key_char2num(lch); -} - -u8 key_2char2num(u8 hch, u8 lch) -{ - return (key_char2num(hch) << 4) | key_char2num(lch); -} - void rtw_macaddr_cfg(u8 *mac_addr) { u8 mac[ETH_ALEN]; + if (mac_addr == NULL) return; - if (rtw_initmac) { /* Users specify the mac address */ - int jj, kk; - - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - mac[jj] = key_2char2num(rtw_initmac[kk], rtw_initmac[kk + 1]); + if (rtw_initmac && mac_pton(rtw_initmac, mac)) { + /* Users specify the mac address */ memcpy(mac_addr, mac, ETH_ALEN); - } else { /* Use the mac address stored in the Efuse */ + } else { + /* Use the mac address stored in the Efuse */ memcpy(mac, mac_addr, ETH_ALEN); } diff --git a/drivers/staging/rtl8188eu/include/wlan_bssdef.h b/drivers/staging/rtl8188eu/include/wlan_bssdef.h index e70075d..53b1bd8 100644 --- a/drivers/staging/rtl8188eu/include/wlan_bssdef.h +++ b/drivers/staging/rtl8188eu/include/wlan_bssdef.h @@ -340,8 +340,4 @@ struct ndis_802_11_cap { struct ndis_802_11_auth_encrypt AuthenticationEncryptionSupported[1]; }; -u8 key_2char2num(u8 hch, u8 lch); -u8 key_char2num(u8 ch); -u8 str_2char2num(u8 hch, u8 lch); - #endif /* ifndef WLAN_BSSDEF_H_ */ diff --git a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c index 56e24fa..f9b8ad4 100644 --- a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c +++ b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c @@ -106,44 +106,6 @@ static const char * const iw_operation_mode[] = { "Secondary", "Monitor" }; -static int hex2num_i(char c) -{ - if (c >= '0' && c <= '9') - return c - '0'; - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - if (c >= 'A' && c <= 'F') - return c - 'A' + 10; - return -1; -} - -/** - * hwaddr_aton - Convert ASCII string to MAC address - * @txt: MAC address as a string (e.g., "00:11:22:33:44:55") - * @addr: Buffer for the MAC address (ETH_ALEN = 6 bytes) - * Returns: 0 on success, -1 on failure (e.g., string not a MAC address) - */ -static int hwaddr_aton_i(const char *txt, u8 *addr) -{ - int i; - - for (i = 0; i < 6; i++) { - int a, b; - - a = hex2num_i(*txt++); - if (a < 0) - return -1; - b = hex2num_i(*txt++); - if (b < 0) - return -1; - *addr++ = (a << 4) | b; - if (i < 5 && *txt++ != ':') - return -1; - } - - return 0; -} - void indicate_wx_scan_complete_event(struct adapter *padapter) { union iwreq_data wrqu; @@ -2570,7 +2532,7 @@ static int rtw_get_ap_info(struct net_device *dev, pnetwork = container_of(plist, struct wlan_network, list); - if (hwaddr_aton_i(data, bssid)) { + if (!mac_pton(data, bssid)) { DBG_88E("Invalid BSSID '%s'.\n", (u8 *)data); spin_unlock_bh(&pmlmepriv->scanned_queue.lock); return -EINVAL; @@ -2752,7 +2714,7 @@ static int rtw_p2p_set_intent(struct net_device *dev, intent = extra[0] - '0'; break; case 2: - intent = str_2char2num(extra[0], extra[1]); + intent = hex_to_bin(extra[0]) * 10 + hex_to_bin(extra[1]); break; } if (intent <= 15) @@ -2777,7 +2739,7 @@ static int rtw_p2p_set_listen_ch(struct net_device *dev, listen_ch = extra[0] - '0'; break; case 2: - listen_ch = str_2char2num(extra[0], extra[1]); + listen_ch = hex_to_bin(extra[0]) * 10 + hex_to_bin(extra[1]); break; } @@ -2810,7 +2772,7 @@ static int rtw_p2p_set_op_ch(struct net_device *dev, op_ch = extra[0] - '0'; break; case 2: - op_ch = str_2char2num(extra[0], extra[1]); + op_ch = hex_to_bin(extra[0]) * 10 + hex_to_bin(extra[1]); break; } @@ -2854,12 +2816,11 @@ static int rtw_p2p_profilefound(struct net_device *dev, if (pwdinfo->profileindex >= P2P_MAX_PERSISTENT_GROUP_NUM) { ret = -1; } else { - int jj, kk; - /* Add this profile information into pwdinfo->profileinfo */ /* Ex: 1XX:XX:XX:XX:XX:XXYYSSID */ - for (jj = 0, kk = 1; jj < ETH_ALEN; jj++, kk += 3) - pwdinfo->profileinfo[pwdinfo->profileindex].peermac[jj] = key_2char2num(extra[kk], extra[kk + 1]); + if (!mac_pton(extra + 1, + pwdinfo->profileinfo[pwdinfo->profileindex].peermac)) + return -EINVAL; pwdinfo->profileinfo[pwdinfo->profileindex].ssidlen = (extra[18] - '0') * 10 + (extra[19] - '0'); memcpy(pwdinfo->profileinfo[pwdinfo->profileindex].ssid, &extra[20], pwdinfo->profileinfo[pwdinfo->profileindex].ssidlen); @@ -3038,8 +2999,7 @@ static int rtw_p2p_get_wps_configmethod(struct net_device *dev, int ret = 0; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; - u8 peerMACStr[17] = {0x00}; + u8 peerMACStr[18] = {0x00}; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3059,8 +3019,8 @@ static int rtw_p2p_get_wps_configmethod(struct net_device *dev, if (copy_from_user(peerMACStr, wrqu->data.pointer + 6, 17)) return -EFAULT; - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); + if (!mac_pton(peerMACStr, peerMAC)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3109,8 +3069,7 @@ static int rtw_p2p_get_go_device_address(struct net_device *dev, int ret = 0; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; - u8 peerMACStr[17] = {0x00}; + u8 peerMACStr[18] = {0x00}; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3129,8 +3088,8 @@ static int rtw_p2p_get_go_device_address(struct net_device *dev, if (copy_from_user(peerMACStr, wrqu->data.pointer + 10, 17)) return -EFAULT; - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); + if (!mac_pton(peerMACStr, peerMAC)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3193,8 +3152,7 @@ static int rtw_p2p_get_device_type(struct net_device *dev, int ret = 0; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; - u8 peerMACStr[17] = {0x00}; + u8 peerMACStr[18] = {0x00}; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3213,8 +3171,8 @@ static int rtw_p2p_get_device_type(struct net_device *dev, if (copy_from_user(peerMACStr, wrqu->data.pointer + 9, 17)) return -EFAULT; - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); + if (!mac_pton(peerMACStr, peerMAC)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3272,8 +3230,7 @@ static int rtw_p2p_get_device_name(struct net_device *dev, int ret = 0; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; - u8 peerMACStr[17] = {0x00}; + u8 peerMACStr[18] = {0x00}; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3292,8 +3249,8 @@ static int rtw_p2p_get_device_name(struct net_device *dev, if (copy_from_user(peerMACStr, wrqu->data.pointer + 5, 17)) return -EFAULT; - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); + if (!mac_pton(peerMACStr, peerMAC)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3341,8 +3298,7 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev, int ret = 0; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; - u8 peerMACStr[17] = {0x00}; + u8 peerMACStr[18] = {0x00}; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3363,8 +3319,8 @@ static int rtw_p2p_get_invitation_procedure(struct net_device *dev, if (copy_from_user(peerMACStr, wrqu->data.pointer + 8, 17)) return -EFAULT; - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(peerMACStr[kk], peerMACStr[kk + 1]); + if (!mac_pton(peerMACStr, peerMAC)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3421,7 +3377,6 @@ static int rtw_p2p_connect(struct net_device *dev, struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); struct wifidirect_info *pwdinfo = &(padapter->wdinfo); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3445,8 +3400,8 @@ static int rtw_p2p_connect(struct net_device *dev, if (pwdinfo->ui_got_wps_info == P2P_NO_WPSINFO) return -1; - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(extra[kk], extra[kk + 1]); + if (!mac_pton(extra, peerMAC)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3502,7 +3457,6 @@ static int rtw_p2p_invite_req(struct net_device *dev, int ret = 0; struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); struct wifidirect_info *pwdinfo = &(padapter->wdinfo); - int jj, kk; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3540,8 +3494,8 @@ static int rtw_p2p_invite_req(struct net_device *dev, pinvite_req_info->token = 3; } - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - pinvite_req_info->peer_macaddr[jj] = key_2char2num(extra[kk], extra[kk + 1]); + if (!mac_pton(extra, pinvite_req_info->peer_macaddr)) + return -EINVAL; spin_lock_bh(&(pmlmepriv->scanned_queue.lock)); @@ -3584,8 +3538,8 @@ static int rtw_p2p_invite_req(struct net_device *dev, if (uintPeerChannel) { /* Store the GO's bssid */ - for (jj = 0, kk = 18; jj < ETH_ALEN; jj++, kk += 3) - pinvite_req_info->go_bssid[jj] = key_2char2num(extra[kk], extra[kk + 1]); + if (!mac_pton(extra + 18, pinvite_req_info->go_bssid)) + return -EINVAL; /* Store the GO's ssid */ pinvite_req_info->ssidlen = wrqu->data.length - 36; @@ -3644,7 +3598,6 @@ static int rtw_p2p_prov_disc(struct net_device *dev, struct adapter *padapter = (struct adapter *)rtw_netdev_priv(dev); struct wifidirect_info *pwdinfo = &(padapter->wdinfo); u8 peerMAC[ETH_ALEN] = {0x00}; - int jj, kk; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct list_head *plist, *phead; struct __queue *queue = &(pmlmepriv->scanned_queue); @@ -3677,8 +3630,8 @@ static int rtw_p2p_prov_disc(struct net_device *dev, pwdinfo->tx_prov_disc_info.benable = false; } - for (jj = 0, kk = 0; jj < ETH_ALEN; jj++, kk += 3) - peerMAC[jj] = key_2char2num(extra[kk], extra[kk + 1]); + if (!mac_pton(extra, peerMAC)) + return -EINVAL; if (!memcmp(&extra[18], "display", 7)) { pwdinfo->tx_prov_disc_info.wps_config_method_request = WPS_CM_DISPLYA; @@ -5942,7 +5895,7 @@ static int rtw_mp_efuse_set(struct net_device *dev, struct efuse_hal *pEfuseHal; u8 ips_mode = 0, lps_mode = 0; - u32 i, jj, kk; + u32 i; u8 *setdata = NULL; u8 *ShadowMapBT = NULL; u8 *ShadowMapWiFi = NULL; @@ -6020,8 +5973,11 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: map data =%s\n", __func__, tmp[2]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); + if (hex2bin(setdata, tmp[2], cnts) < 0) { + err = -EINVAL; + goto exit; + } + /* Change to check TYPE_EFUSE_MAP_LEN, because 8188E raw 256, logic map over 256. */ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&max_available_size); if ((addr+cnts) > max_available_size) { @@ -6059,8 +6015,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: raw data =%s\n", __func__, tmp[2]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - setrawdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); + if (hex2bin(setrawdata, tmp[2], cnts) < 0) { + err = -EINVAL; + goto exit; + } if (rtw_efuse_access(padapter, true, addr, cnts, setrawdata) == _FAIL) { DBG_88E("%s: rtw_efuse_access error!!\n", __func__); @@ -6095,8 +6053,11 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: MAC address =%s\n", __func__, tmp[1]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]); + if (hex2bin(setdata, tmp[1], cnts) < 0) { + err = -EINVAL; + goto exit; + } + /* Change to check TYPE_EFUSE_MAP_LEN, because 8188E raw 256, logic map over 256. */ EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&max_available_size); if ((addr+cnts) > max_available_size) { @@ -6133,8 +6094,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: VID/PID =%s\n", __func__, tmp[1]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - setdata[jj] = key_2char2num(tmp[1][kk], tmp[1][kk + 1]); + if (hex2bin(setdata, tmp[1], cnts) < 0) { + err = -EINVAL; + goto exit; + } EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size); if ((addr+cnts) > max_available_size) { @@ -6172,8 +6135,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: BT data =%s\n", __func__, tmp[2]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - setdata[jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); + if (hex2bin(setdata, tmp[2], cnts) < 0) { + err = -EINVAL; + goto exit; + } EFUSE_GetEfuseDefinition(padapter, EFUSE_BT, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (void *)&max_available_size); if ((addr+cnts) > max_available_size) { @@ -6206,8 +6171,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: BT tmp data =%s\n", __func__, tmp[2]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - pEfuseHal->fakeBTEfuseModifiedMap[addr+jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); + if (hex2bin(pEfuseHal->fakeBTEfuseModifiedMap + addr, tmp[2], cnts) < 0) { + err = -EINVAL; + goto exit; + } } else if (strcmp(tmp[0], "wldumpfake") == 0) { if (rtw_efuse_map_read(padapter, 0, EFUSE_BT_MAX_MAP_LEN, pEfuseHal->fakeEfuseModifiedMap) == _SUCCESS) { DBG_88E("%s: BT read all map success\n", __func__); @@ -6260,8 +6227,10 @@ static int rtw_mp_efuse_set(struct net_device *dev, DBG_88E("%s: cnts =%d\n", __func__, cnts); DBG_88E("%s: map tmp data =%s\n", __func__, tmp[2]); - for (jj = 0, kk = 0; jj < cnts; jj++, kk += 2) - pEfuseHal->fakeEfuseModifiedMap[addr+jj] = key_2char2num(tmp[2][kk], tmp[2][kk + 1]); + if (hex2bin(pEfuseHal->fakeEfuseModifiedMap + addr, tmp[2], cnts) < 0) { + err = -EINVAL; + goto exit; + } } exit: -- 2.0.0 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel