mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (27 commits) ipv6: Don't pass invalid dst_entry pointer to dst_release(). mlx4: fix kfree on error path in new_steering_entry() tcp: len check is unnecessarily devastating, change to WARN_ON sctp: malloc enough room for asconf-ack chunk sctp: fix auth_hmacs field's length of struct sctp_cookie net: Fix dev dev_ethtool_get_rx_csum() for forced NETIF_F_RXCSUM usbnet: use eth%d name for known ethernet devices starfire: clean up dma_addr_t size test iwlegacy: fix bugs in change_interface carl9170: Fix tx aggregation problems with some clients iwl3945: disable hw scan by default wireless: rt2x00: rt2800usb.c add and identify ids iwl3945: do not deprecate software scan mac80211: fix aggregation frame release during timeout cfg80211: fix BSS double-unlinking (continued) cfg80211:: fix possible NULL pointer dereference mac80211: fix possible NULL pointer dereference mac80211: fix NULL pointer dereference in ieee80211_key_alloc() ath9k: fix a chip wakeup related crash in ath9k_start mac80211: fix a crash in minstrel_ht in HT mode with no supported MCS rates ...
This commit is contained in:
commit
d14f5b810b
36 changed files with 138 additions and 60 deletions
|
|
@ -186,6 +186,7 @@ static void hci_reset_req(struct hci_dev *hdev, unsigned long opt)
|
|||
BT_DBG("%s %ld", hdev->name, opt);
|
||||
|
||||
/* Reset device */
|
||||
set_bit(HCI_RESET, &hdev->flags);
|
||||
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
|
||||
}
|
||||
|
||||
|
|
@ -213,8 +214,10 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
|
|||
/* Mandatory initialization */
|
||||
|
||||
/* Reset */
|
||||
if (!test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks))
|
||||
if (!test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks)) {
|
||||
set_bit(HCI_RESET, &hdev->flags);
|
||||
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
|
||||
}
|
||||
|
||||
/* Read Local Supported Features */
|
||||
hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
|
||||
|
|
@ -584,6 +587,9 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
|||
hci_req_cancel(hdev, ENODEV);
|
||||
hci_req_lock(hdev);
|
||||
|
||||
/* Stop timer, it might be running */
|
||||
del_timer_sync(&hdev->cmd_timer);
|
||||
|
||||
if (!test_and_clear_bit(HCI_UP, &hdev->flags)) {
|
||||
hci_req_unlock(hdev);
|
||||
return 0;
|
||||
|
|
@ -623,7 +629,6 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
|||
|
||||
/* Drop last sent command */
|
||||
if (hdev->sent_cmd) {
|
||||
del_timer_sync(&hdev->cmd_timer);
|
||||
kfree_skb(hdev->sent_cmd);
|
||||
hdev->sent_cmd = NULL;
|
||||
}
|
||||
|
|
@ -1074,6 +1079,7 @@ static void hci_cmd_timer(unsigned long arg)
|
|||
|
||||
BT_ERR("%s command tx timeout", hdev->name);
|
||||
atomic_set(&hdev->cmd_cnt, 1);
|
||||
clear_bit(HCI_RESET, &hdev->flags);
|
||||
tasklet_schedule(&hdev->cmd_task);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -183,6 +183,8 @@ static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
|
||||
BT_DBG("%s status 0x%x", hdev->name, status);
|
||||
|
||||
clear_bit(HCI_RESET, &hdev->flags);
|
||||
|
||||
hci_req_complete(hdev, HCI_OP_RESET, status);
|
||||
}
|
||||
|
||||
|
|
@ -1847,7 +1849,7 @@ static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|||
if (ev->opcode != HCI_OP_NOP)
|
||||
del_timer(&hdev->cmd_timer);
|
||||
|
||||
if (ev->ncmd) {
|
||||
if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) {
|
||||
atomic_set(&hdev->cmd_cnt, 1);
|
||||
if (!skb_queue_empty(&hdev->cmd_q))
|
||||
tasklet_schedule(&hdev->cmd_task);
|
||||
|
|
|
|||
|
|
@ -1116,7 +1116,9 @@ int l2cap_ertm_send(struct sock *sk)
|
|||
bt_cb(skb)->tx_seq = pi->next_tx_seq;
|
||||
pi->next_tx_seq = (pi->next_tx_seq + 1) % 64;
|
||||
|
||||
pi->unacked_frames++;
|
||||
if (bt_cb(skb)->retries == 1)
|
||||
pi->unacked_frames++;
|
||||
|
||||
pi->frames_sent++;
|
||||
|
||||
if (skb_queue_is_last(TX_QUEUE(sk), skb))
|
||||
|
|
|
|||
|
|
@ -923,8 +923,9 @@ void __l2cap_sock_close(struct sock *sk, int reason)
|
|||
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
||||
l2cap_send_cmd(conn, l2cap_pi(sk)->ident,
|
||||
L2CAP_CONN_RSP, sizeof(rsp), &rsp);
|
||||
} else
|
||||
l2cap_chan_del(sk, reason);
|
||||
}
|
||||
|
||||
l2cap_chan_del(sk, reason);
|
||||
break;
|
||||
|
||||
case BT_CONNECT:
|
||||
|
|
|
|||
|
|
@ -1230,6 +1230,8 @@ static int user_confirm_reply(struct sock *sk, u16 index, unsigned char *data,
|
|||
if (!hdev)
|
||||
return cmd_status(sk, index, mgmt_op, ENODEV);
|
||||
|
||||
hci_dev_lock_bh(hdev);
|
||||
|
||||
if (!test_bit(HCI_UP, &hdev->flags)) {
|
||||
err = cmd_status(sk, index, mgmt_op, ENETDOWN);
|
||||
goto failed;
|
||||
|
|
|
|||
|
|
@ -1003,7 +1003,8 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len,
|
|||
int nlen;
|
||||
u8 flags;
|
||||
|
||||
BUG_ON(len > skb->len);
|
||||
if (WARN_ON(len > skb->len))
|
||||
return -EINVAL;
|
||||
|
||||
nsize = skb_headlen(skb) - len;
|
||||
if (nsize < 0)
|
||||
|
|
|
|||
|
|
@ -503,6 +503,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
|
|||
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false);
|
||||
if (IS_ERR(dst)) {
|
||||
err = PTR_ERR(dst);
|
||||
dst = NULL;
|
||||
goto done;
|
||||
}
|
||||
skb = tcp_make_synack(sk, dst, req, rvp);
|
||||
|
|
|
|||
|
|
@ -342,7 +342,7 @@ struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
|||
if (IS_ERR(key->u.ccmp.tfm)) {
|
||||
err = PTR_ERR(key->u.ccmp.tfm);
|
||||
kfree(key);
|
||||
key = ERR_PTR(err);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
|
|
@ -360,7 +360,7 @@ struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
|||
if (IS_ERR(key->u.aes_cmac.tfm)) {
|
||||
err = PTR_ERR(key->u.aes_cmac.tfm);
|
||||
kfree(key);
|
||||
key = ERR_PTR(err);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
@ -400,11 +400,12 @@ int ieee80211_key_link(struct ieee80211_key *key,
|
|||
{
|
||||
struct ieee80211_key *old_key;
|
||||
int idx, ret;
|
||||
bool pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
|
||||
bool pairwise;
|
||||
|
||||
BUG_ON(!sdata);
|
||||
BUG_ON(!key);
|
||||
|
||||
pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE;
|
||||
idx = key->conf.keyidx;
|
||||
key->local = sdata->local;
|
||||
key->sdata = sdata;
|
||||
|
|
|
|||
|
|
@ -659,18 +659,14 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
|||
struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
|
||||
struct ieee80211_local *local = hw_to_local(mp->hw);
|
||||
u16 sta_cap = sta->ht_cap.cap;
|
||||
int n_supported = 0;
|
||||
int ack_dur;
|
||||
int stbc;
|
||||
int i;
|
||||
|
||||
/* fall back to the old minstrel for legacy stations */
|
||||
if (!sta->ht_cap.ht_supported) {
|
||||
msp->is_ht = false;
|
||||
memset(&msp->legacy, 0, sizeof(msp->legacy));
|
||||
msp->legacy.r = msp->ratelist;
|
||||
msp->legacy.sample_table = msp->sample_table;
|
||||
return mac80211_minstrel.rate_init(priv, sband, sta, &msp->legacy);
|
||||
}
|
||||
if (!sta->ht_cap.ht_supported)
|
||||
goto use_legacy;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(minstrel_mcs_groups) !=
|
||||
MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS);
|
||||
|
|
@ -725,7 +721,22 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
|
|||
|
||||
mi->groups[i].supported =
|
||||
mcs->rx_mask[minstrel_mcs_groups[i].streams - 1];
|
||||
|
||||
if (mi->groups[i].supported)
|
||||
n_supported++;
|
||||
}
|
||||
|
||||
if (!n_supported)
|
||||
goto use_legacy;
|
||||
|
||||
return;
|
||||
|
||||
use_legacy:
|
||||
msp->is_ht = false;
|
||||
memset(&msp->legacy, 0, sizeof(msp->legacy));
|
||||
msp->legacy.r = msp->ratelist;
|
||||
msp->legacy.sample_table = msp->sample_table;
|
||||
return mac80211_minstrel.rate_init(priv, sband, sta, &msp->legacy);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -612,7 +612,8 @@ static void ieee80211_sta_reorder_release(struct ieee80211_hw *hw,
|
|||
skipped++;
|
||||
continue;
|
||||
}
|
||||
if (!time_after(jiffies, tid_agg_rx->reorder_time[j] +
|
||||
if (skipped &&
|
||||
!time_after(jiffies, tid_agg_rx->reorder_time[j] +
|
||||
HT_RX_REORDER_BUF_TIMEOUT))
|
||||
goto set_release_timer;
|
||||
|
||||
|
|
|
|||
|
|
@ -3106,10 +3106,10 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
|
|||
|
||||
/* create an ASCONF_ACK chunk.
|
||||
* Based on the definitions of parameters, we know that the size of
|
||||
* ASCONF_ACK parameters are less than or equal to the twice of ASCONF
|
||||
* ASCONF_ACK parameters are less than or equal to the fourfold of ASCONF
|
||||
* parameters.
|
||||
*/
|
||||
asconf_ack = sctp_make_asconf_ack(asoc, serial, chunk_len * 2);
|
||||
asconf_ack = sctp_make_asconf_ack(asoc, serial, chunk_len * 4);
|
||||
if (!asconf_ack)
|
||||
goto done;
|
||||
|
||||
|
|
|
|||
|
|
@ -123,6 +123,15 @@ void cfg80211_bss_age(struct cfg80211_registered_device *dev,
|
|||
}
|
||||
}
|
||||
|
||||
/* must hold dev->bss_lock! */
|
||||
static void __cfg80211_unlink_bss(struct cfg80211_registered_device *dev,
|
||||
struct cfg80211_internal_bss *bss)
|
||||
{
|
||||
list_del_init(&bss->list);
|
||||
rb_erase(&bss->rbn, &dev->bss_tree);
|
||||
kref_put(&bss->ref, bss_release);
|
||||
}
|
||||
|
||||
/* must hold dev->bss_lock! */
|
||||
void cfg80211_bss_expire(struct cfg80211_registered_device *dev)
|
||||
{
|
||||
|
|
@ -134,9 +143,7 @@ void cfg80211_bss_expire(struct cfg80211_registered_device *dev)
|
|||
continue;
|
||||
if (!time_after(jiffies, bss->ts + IEEE80211_SCAN_RESULT_EXPIRE))
|
||||
continue;
|
||||
list_del(&bss->list);
|
||||
rb_erase(&bss->rbn, &dev->bss_tree);
|
||||
kref_put(&bss->ref, bss_release);
|
||||
__cfg80211_unlink_bss(dev, bss);
|
||||
expired = true;
|
||||
}
|
||||
|
||||
|
|
@ -585,16 +592,23 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
|||
struct cfg80211_internal_bss *res;
|
||||
size_t ielen = len - offsetof(struct ieee80211_mgmt,
|
||||
u.probe_resp.variable);
|
||||
size_t privsz = wiphy->bss_priv_size;
|
||||
size_t privsz;
|
||||
|
||||
if (WARN_ON(!mgmt))
|
||||
return NULL;
|
||||
|
||||
if (WARN_ON(!wiphy))
|
||||
return NULL;
|
||||
|
||||
if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
|
||||
(signal < 0 || signal > 100)))
|
||||
return NULL;
|
||||
|
||||
if (WARN_ON(!mgmt || !wiphy ||
|
||||
len < offsetof(struct ieee80211_mgmt, u.probe_resp.variable)))
|
||||
if (WARN_ON(len < offsetof(struct ieee80211_mgmt, u.probe_resp.variable)))
|
||||
return NULL;
|
||||
|
||||
privsz = wiphy->bss_priv_size;
|
||||
|
||||
res = kzalloc(sizeof(*res) + privsz + ielen, gfp);
|
||||
if (!res)
|
||||
return NULL;
|
||||
|
|
@ -662,11 +676,8 @@ void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
|
|||
|
||||
spin_lock_bh(&dev->bss_lock);
|
||||
if (!list_empty(&bss->list)) {
|
||||
list_del_init(&bss->list);
|
||||
__cfg80211_unlink_bss(dev, bss);
|
||||
dev->bss_generation++;
|
||||
rb_erase(&bss->rbn, &dev->bss_tree);
|
||||
|
||||
kref_put(&bss->ref, bss_release);
|
||||
}
|
||||
spin_unlock_bh(&dev->bss_lock);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue