Discussion:
[patch] staging: rtl8723au: incorrect use of ether_addr_copy()
Dan Carpenter
2014-10-08 10:40:14 UTC
Permalink
The return from myid() isn't aligned correctly for ether_addr_copy().

Signed-off-by: Dan Carpenter <***@oracle.com>

diff --git a/drivers/staging/rtl8723au/core/rtw_mlme_ext.c b/drivers/staging/rtl8723au/core/rtw_mlme_ext.c
index 3eb77de..c8f7890 100644
--- a/drivers/staging/rtl8723au/core/rtw_mlme_ext.c
+++ b/drivers/staging/rtl8723au/core/rtw_mlme_ext.c
@@ -2402,7 +2402,7 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
mgmt->seq_ctrl = 0;

ether_addr_copy(mgmt->da, bc_addr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(cur_network));

/* timestamp will be inserted by hardware */
@@ -2556,7 +2556,7 @@ static void issue_probersp(struct rtw_adapter *padapter, unsigned char *da,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);

ether_addr_copy(mgmt->da, da);
- ether_addr_copy(mgmt->sa, mac);
+ memcpy(mgmt->sa, mac, ETH_ALEN);
ether_addr_copy(mgmt->bssid, bssid);

mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -2718,7 +2718,7 @@ static int _issue_probereq(struct rtw_adapter *padapter,
ether_addr_copy(pwlanhdr->addr3, bc_addr);
}

- ether_addr_copy(pwlanhdr->addr2, mac);
+ memcpy(pwlanhdr->addr2, mac, ETH_ALEN);

pwlanhdr->seq_ctrl =
cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -2863,8 +2863,8 @@ static void issue_auth(struct rtw_adapter *padapter, struct sta_info *psta,
#ifdef CONFIG_8723AU_AP_MODE
unsigned short val16;
ether_addr_copy(mgmt->da, psta->hwaddr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
- ether_addr_copy(mgmt->bssid, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
+ memcpy(mgmt->bssid, myid(&padapter->eeprompriv), ETH_ALEN);

/* setting auth algo number */
val16 = (u16)psta->authalg;
@@ -2895,7 +2895,7 @@ static void issue_auth(struct rtw_adapter *padapter, struct sta_info *psta,
struct ieee80211_mgmt *iv_mgmt;

ether_addr_copy(mgmt->da, get_my_bssid23a(&pmlmeinfo->network));
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid,
get_my_bssid23a(&pmlmeinfo->network));

@@ -3006,7 +3006,7 @@ static void issue_assocrsp(struct rtw_adapter *padapter, unsigned short status,
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | pkt_type);

ether_addr_copy(mgmt->da, pstat->hwaddr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));

mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3129,7 +3129,7 @@ static void issue_assocreq(struct rtw_adapter *padapter)
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);

ether_addr_copy(mgmt->da, get_my_bssid23a(&pmlmeinfo->network));
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));

mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3400,7 +3400,7 @@ static int _issue_nulldata23a(struct rtw_adapter *padapter, unsigned char *da,
pwlanhdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);

ether_addr_copy(pwlanhdr->addr1, da);
- ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
+ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network));

pwlanhdr->seq_ctrl =
@@ -3528,7 +3528,7 @@ static int _issue_qos_nulldata23a(struct rtw_adapter *padapter,
pwlanhdr->qos_ctrl |= cpu_to_le16(IEEE80211_QOS_CTL_EOSP);

ether_addr_copy(pwlanhdr->addr1, da);
- ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
+ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network));

pwlanhdr->seq_ctrl =
@@ -3633,7 +3633,7 @@ static int _issue_deauth(struct rtw_adapter *padapter, unsigned char *da,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);

ether_addr_copy(mgmt->da, da);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));

mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3737,7 +3737,7 @@ void issue_action_spct_ch_switch23a(struct rtw_adapter *padapter,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);

ether_addr_copy(mgmt->da, ra); /* RA */
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv)); /* TA */
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN); /* TA */
ether_addr_copy(mgmt->bssid, ra); /* DA = RA */

mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3799,7 +3799,7 @@ void issue_action_BA23a(struct rtw_adapter *padapter,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);

ether_addr_copy(mgmt->da, raddr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));

mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
diff --git a/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c b/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
index 271c33d..976ec2c 100644
--- a/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
+++ b/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
@@ -219,7 +219,7 @@ ConstructBeacon(struct rtw_adapter *padapter, u8 *pframe, u32 *pLength)
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);

ether_addr_copy(mgmt->da, bc_addr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(cur_network));

/* A Beacon frame shouldn't have fragment bits set */
diff --git a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
index bd6953a..cb81e64 100644
--- a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
+++ b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
@@ -2414,7 +2414,7 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter,
mgmt.frame_control =
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);

- ether_addr_copy(mgmt.da, myid(&padapter->eeprompriv));
+ memcpy(mgmt.da, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt.sa, da);
ether_addr_copy(mgmt.bssid, get_my_bssid23a(&pmlmeinfo->network));
Joe Perches
2014-10-08 12:26:11 UTC
Permalink
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.

Actual evidence showing ether_addr_copy conversions
may not always be wise.

How did you find them?

Is there a new alignment capability in smatch?


--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Dan Carpenter
2014-10-08 12:46:31 UTC
Permalink
Post by Joe Perches
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.
Actual evidence showing ether_addr_copy conversions
may not always be wise.
How did you find them?
I was just trying to see how common these kinds of bugs are. It didn't
take long to find, but my impression is that they are rare and I got
lucky. These kinds of bugs are tricky to find and we don't have any
tools for it.

regards,
dan carpenter
Julia Lawall
2014-10-08 12:50:50 UTC
Permalink
Post by Dan Carpenter
Post by Joe Perches
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.
Actual evidence showing ether_addr_copy conversions
may not always be wise.
How did you find them?
I was just trying to see how common these kinds of bugs are. It didn't
take long to find, but my impression is that they are rare and I got
lucky. These kinds of bugs are tricky to find and we don't have any
tools for it.
Couldn't you just use your favorite matching tool, collect the file names,
compile them, run pahole, and process the output in some way? It doesn't
give a complete analysis (you don't find all problems), but if you find a
problem it is a real problem.

julia
--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Dan Carpenter
2014-10-08 13:17:39 UTC
Permalink
Post by Julia Lawall
Couldn't you just use your favorite matching tool, collect the file names,
compile them, run pahole, and process the output in some way? It doesn't
give a complete analysis (you don't find all problems), but if you find a
problem it is a real problem.
Well... You would be better off using Smatch than pahole. And
obviously I did try something like this, but it's fairly tricky.

regards,
dan carpenter
Joe Perches
2014-10-08 14:22:30 UTC
Permalink
Post by Dan Carpenter
Post by Joe Perches
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.
Actual evidence showing ether_addr_copy conversions
may not always be wise.
How did you find them?
I was just trying to see how common these kinds of bugs are. It didn't
take long to find, but my impression is that they are rare and I got
lucky. These kinds of bugs are tricky to find and we don't have any
tools for it.
As far as I know, that's true too.

Jes, was the mac_addr field in this struct
ever __aligned(2)?

struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
...
}

As far as I can tell from git history, it was
that way at the first check-in.

Dan, did you also look for any other alignment
defects in uses of any is_<foo>_ether_addr calls?


--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-***@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Jes Sorensen
2014-10-08 14:33:26 UTC
Permalink
Post by Joe Perches
Post by Dan Carpenter
Post by Joe Perches
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.
Actual evidence showing ether_addr_copy conversions
may not always be wise.
How did you find them?
I was just trying to see how common these kinds of bugs are. It didn't
take long to find, but my impression is that they are rare and I got
lucky. These kinds of bugs are tricky to find and we don't have any
tools for it.
As far as I know, that's true too.
Jes, was the mac_addr field in this struct
ever __aligned(2)?
struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
...
}
As far as I can tell from git history, it was
that way at the first check-in.
I may have removed other entries that were unused, and that caused it to
become mis-aligned. I can't say for sure - the fix is straight forward
though.

Jes
Joe Perches
2014-10-08 14:51:02 UTC
Permalink
Post by Jes Sorensen
Post by Joe Perches
Post by Dan Carpenter
Post by Joe Perches
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.
Actual evidence showing ether_addr_copy conversions
may not always be wise.
How did you find them?
I was just trying to see how common these kinds of bugs are. It didn't
take long to find, but my impression is that they are rare and I got
lucky. These kinds of bugs are tricky to find and we don't have any
tools for it.
As far as I know, that's true too.
Jes, was the mac_addr field in this struct
ever __aligned(2)?
struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
...
}
As far as I can tell from git history, it was
that way at the first check-in.
I may have removed other entries that were unused, and that caused it to
become mis-aligned. I can't say for sure - the fix is straight forward
though.
One option is to add __aligned(2) to the mac_addr field
and make no other change.


--
To unsubscribe from this list: send the line "unsubscribe kernel-janitors" in
the body of a message to ***@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Jes Sorensen
2014-10-08 15:09:04 UTC
Permalink
Post by Joe Perches
Post by Jes Sorensen
Post by Joe Perches
Post by Dan Carpenter
Post by Joe Perches
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Hey Dan.
Actual evidence showing ether_addr_copy conversions
may not always be wise.
How did you find them?
I was just trying to see how common these kinds of bugs are. It didn't
take long to find, but my impression is that they are rare and I got
lucky. These kinds of bugs are tricky to find and we don't have any
tools for it.
As far as I know, that's true too.
Jes, was the mac_addr field in this struct
ever __aligned(2)?
struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
...
}
As far as I can tell from git history, it was
that way at the first check-in.
I may have removed other entries that were unused, and that caused it to
become mis-aligned. I can't say for sure - the fix is straight forward
though.
One option is to add __aligned(2) to the mac_addr field
and make no other change.
As I said in another mail, just move it to the front of the struct and
be done with it. No point in wasting alignment bytes if we don't have
to.

Jes

Jes Sorensen
2014-10-08 13:59:33 UTC
Permalink
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Sorry, this makes no sense, just fix it properly!

drivers/staging/rtl8723au/include/rtw_eeprom.h:

struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
/* u8 config0; */

Move mac_addr[6] to the top of the struct and be done with it.

NACK

Jes
Post by Dan Carpenter
diff --git a/drivers/staging/rtl8723au/core/rtw_mlme_ext.c b/drivers/staging/rtl8723au/core/rtw_mlme_ext.c
index 3eb77de..c8f7890 100644
--- a/drivers/staging/rtl8723au/core/rtw_mlme_ext.c
+++ b/drivers/staging/rtl8723au/core/rtw_mlme_ext.c
@@ -2402,7 +2402,7 @@ void issue_beacon23a(struct rtw_adapter *padapter, int timeout_ms)
mgmt->seq_ctrl = 0;
ether_addr_copy(mgmt->da, bc_addr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(cur_network));
/* timestamp will be inserted by hardware */
@@ -2556,7 +2556,7 @@ static void issue_probersp(struct rtw_adapter *padapter, unsigned char *da,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_RESP);
ether_addr_copy(mgmt->da, da);
- ether_addr_copy(mgmt->sa, mac);
+ memcpy(mgmt->sa, mac, ETH_ALEN);
ether_addr_copy(mgmt->bssid, bssid);
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -2718,7 +2718,7 @@ static int _issue_probereq(struct rtw_adapter *padapter,
ether_addr_copy(pwlanhdr->addr3, bc_addr);
}
- ether_addr_copy(pwlanhdr->addr2, mac);
+ memcpy(pwlanhdr->addr2, mac, ETH_ALEN);
pwlanhdr->seq_ctrl =
cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -2863,8 +2863,8 @@ static void issue_auth(struct rtw_adapter *padapter, struct sta_info *psta,
#ifdef CONFIG_8723AU_AP_MODE
unsigned short val16;
ether_addr_copy(mgmt->da, psta->hwaddr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
- ether_addr_copy(mgmt->bssid, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
+ memcpy(mgmt->bssid, myid(&padapter->eeprompriv), ETH_ALEN);
/* setting auth algo number */
val16 = (u16)psta->authalg;
@@ -2895,7 +2895,7 @@ static void issue_auth(struct rtw_adapter *padapter, struct sta_info *psta,
struct ieee80211_mgmt *iv_mgmt;
ether_addr_copy(mgmt->da, get_my_bssid23a(&pmlmeinfo->network));
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid,
get_my_bssid23a(&pmlmeinfo->network));
@@ -3006,7 +3006,7 @@ static void issue_assocrsp(struct rtw_adapter *padapter, unsigned short status,
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | pkt_type);
ether_addr_copy(mgmt->da, pstat->hwaddr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3129,7 +3129,7 @@ static void issue_assocreq(struct rtw_adapter *padapter)
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ASSOC_REQ);
ether_addr_copy(mgmt->da, get_my_bssid23a(&pmlmeinfo->network));
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3400,7 +3400,7 @@ static int _issue_nulldata23a(struct rtw_adapter *padapter, unsigned char *da,
pwlanhdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
ether_addr_copy(pwlanhdr->addr1, da);
- ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
+ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network));
pwlanhdr->seq_ctrl =
@@ -3528,7 +3528,7 @@ static int _issue_qos_nulldata23a(struct rtw_adapter *padapter,
pwlanhdr->qos_ctrl |= cpu_to_le16(IEEE80211_QOS_CTL_EOSP);
ether_addr_copy(pwlanhdr->addr1, da);
- ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
+ memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network));
pwlanhdr->seq_ctrl =
@@ -3633,7 +3633,7 @@ static int _issue_deauth(struct rtw_adapter *padapter, unsigned char *da,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
ether_addr_copy(mgmt->da, da);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3737,7 +3737,7 @@ void issue_action_spct_ch_switch23a(struct rtw_adapter *padapter,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
ether_addr_copy(mgmt->da, ra); /* RA */
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv)); /* TA */
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN); /* TA */
ether_addr_copy(mgmt->bssid, ra); /* DA = RA */
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
@@ -3799,7 +3799,7 @@ void issue_action_BA23a(struct rtw_adapter *padapter,
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_ACTION);
ether_addr_copy(mgmt->da, raddr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(&pmlmeinfo->network));
mgmt->seq_ctrl = cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq));
diff --git a/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c b/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
index 271c33d..976ec2c 100644
--- a/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
+++ b/drivers/staging/rtl8723au/hal/rtl8723a_cmd.c
@@ -219,7 +219,7 @@ ConstructBeacon(struct rtw_adapter *padapter, u8 *pframe, u32 *pLength)
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
ether_addr_copy(mgmt->da, bc_addr);
- ether_addr_copy(mgmt->sa, myid(&padapter->eeprompriv));
+ memcpy(mgmt->sa, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt->bssid, get_my_bssid23a(cur_network));
/* A Beacon frame shouldn't have fragment bits set */
diff --git a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
index bd6953a..cb81e64 100644
--- a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
+++ b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c
@@ -2414,7 +2414,7 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter,
mgmt.frame_control =
cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH);
- ether_addr_copy(mgmt.da, myid(&padapter->eeprompriv));
+ memcpy(mgmt.da, myid(&padapter->eeprompriv), ETH_ALEN);
ether_addr_copy(mgmt.sa, da);
ether_addr_copy(mgmt.bssid, get_my_bssid23a(&pmlmeinfo->network));
Dan Carpenter
2014-10-08 14:24:51 UTC
Permalink
Post by Jes Sorensen
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Sorry, this makes no sense, just fix it properly!
struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
/* u8 config0; */
Move mac_addr[6] to the top of the struct and be done with it.
NACK
Oops. I thought it was something from the hardware. Actually can you
fix it and give me a reported-by tag?

regards,
dan carpenter
Jes Sorensen
2014-10-08 14:32:37 UTC
Permalink
Post by Dan Carpenter
Post by Jes Sorensen
Post by Dan Carpenter
The return from myid() isn't aligned correctly for ether_addr_copy().
Sorry, this makes no sense, just fix it properly!
struct eeprom_priv {
u8 bautoload_fail_flag;
u8 bloadfile_fail_flag;
u8 bloadmac_fail_flag;
/* u8 bempty; */
/* u8 sys_config; */
u8 mac_addr[6]; /* PermanentAddress */
/* u8 config0; */
Move mac_addr[6] to the top of the struct and be done with it.
NACK
Oops. I thought it was something from the hardware. Actually can you
fix it and give me a reported-by tag?
That stuff is just copied into memory from the eeprom, so we can pretty
much do with it as we like.

I'll put it on my list.

Jes
Loading...