This is the 4.19.212 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmFr3K0ACgkQONu9yGCS aT6WGRAAvOPbpWe3jSFFO8QspkoNpzKTZq3Gk2b5FDPAL1v99pvp6rPTPpvoaA9s RwNzA8W3HWAlTSJ9O68KhnOMCfV2ZBFko2TubRwkbDlEFCtCnmPo65o1SepdtCMl LAULNni/5z0PeDWEAED7CBUhR3kenBrVFzLaDUEEhpjgjvDSy+eOEIW5mPokmBq6 iSj7aatV6fg2SVjCbsjGX0anTNQIOgTuoPHTszk8hvEJPJz6oopINsn6yEhwhrLc 7Y8NdSgqU/hzj1suQtImUJi3+skzMpMvSMbptCZqzy9TxGZCnaOimltyzqa04ona 0pQi9TXJ/Em4C1Zad/gYn1JjiEMt3LZWevgJyiAKGtTm37L+XjMTTdgEt9JXqcNC Qa4NZ4u9/GQ+oAXDW2qMY6hRdkred1+rRAv6JKbTzM8nEUp3c+UoFUbDfBDmqLhM iVGO3ChULcGtwi3Li37E7Ptwrjy6CF7is35WF6qmQZSuk1O/jiTpnqIVHCB0CG5q DnS4LTxQ6sWT+SViRASZQlq102LOV7zcZ6EIYKObMlg2cKVYvTvdQwh8a+oA6inc 1zI04oNAEE6BtgS3A6HgW3CCe5NchcEYCTlBrm/vgAf/fS+I2gdLh0EPJT3W/9wC aCbfUDxnnY/MIt2swO3weve2SzJMb47Q/Y0ZHns+N1na4qFg7tY= =tf5U -----END PGP SIGNATURE----- Merge 4.19.212 into android-4.19-stable Changes in 4.19.212 net: phy: bcm7xxx: Fixed indirect MMD operations HID: apple: Fix logical maximum and usage maximum of Magic Keyboard JIS netfilter: ip6_tables: zero-initialize fragment offset mac80211: Drop frames from invalid MAC address in ad-hoc mode m68k: Handle arrivals of multiple signals correctly net: prevent user from passing illegal stab size mac80211: check return value of rhashtable_init net: sun: SUNVNET_COMMON should depend on INET scsi: ses: Fix unsigned comparison with less than zero scsi: virtio_scsi: Fix spelling mistake "Unsupport" -> "Unsupported" perf/x86: Reset destroy callback on event init failure sched: Always inline is_percpu_thread() Linux 4.19.212 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I153ab17ac9e874c80b7b22b8bd8b7fa84bc12169
This commit is contained in:
commit
de7d52e084
14 changed files with 164 additions and 53 deletions
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 211
|
||||
SUBLEVEL = 212
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -448,7 +448,7 @@ static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
|
|||
|
||||
if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
|
||||
fpu_version = sc->sc_fpstate[0];
|
||||
if (CPU_IS_020_OR_030 &&
|
||||
if (CPU_IS_020_OR_030 && !regs->stkadj &&
|
||||
regs->vector >= (VEC_FPBRUC * 4) &&
|
||||
regs->vector <= (VEC_FPNAN * 4)) {
|
||||
/* Clear pending exception in 68882 idle frame */
|
||||
|
@ -511,7 +511,7 @@ static inline int rt_save_fpu_state(struct ucontext __user *uc, struct pt_regs *
|
|||
if (!(CPU_IS_060 || CPU_IS_COLDFIRE))
|
||||
context_size = fpstate[1];
|
||||
fpu_version = fpstate[0];
|
||||
if (CPU_IS_020_OR_030 &&
|
||||
if (CPU_IS_020_OR_030 && !regs->stkadj &&
|
||||
regs->vector >= (VEC_FPBRUC * 4) &&
|
||||
regs->vector <= (VEC_FPNAN * 4)) {
|
||||
/* Clear pending exception in 68882 idle frame */
|
||||
|
@ -828,18 +828,24 @@ badframe:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline struct pt_regs *rte_regs(struct pt_regs *regs)
|
||||
{
|
||||
return (void *)regs + regs->stkadj;
|
||||
}
|
||||
|
||||
static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
|
||||
unsigned long mask)
|
||||
{
|
||||
struct pt_regs *tregs = rte_regs(regs);
|
||||
sc->sc_mask = mask;
|
||||
sc->sc_usp = rdusp();
|
||||
sc->sc_d0 = regs->d0;
|
||||
sc->sc_d1 = regs->d1;
|
||||
sc->sc_a0 = regs->a0;
|
||||
sc->sc_a1 = regs->a1;
|
||||
sc->sc_sr = regs->sr;
|
||||
sc->sc_pc = regs->pc;
|
||||
sc->sc_formatvec = regs->format << 12 | regs->vector;
|
||||
sc->sc_sr = tregs->sr;
|
||||
sc->sc_pc = tregs->pc;
|
||||
sc->sc_formatvec = tregs->format << 12 | tregs->vector;
|
||||
save_a5_state(sc, regs);
|
||||
save_fpu_state(sc, regs);
|
||||
}
|
||||
|
@ -847,6 +853,7 @@ static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
|
|||
static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *regs)
|
||||
{
|
||||
struct switch_stack *sw = (struct switch_stack *)regs - 1;
|
||||
struct pt_regs *tregs = rte_regs(regs);
|
||||
greg_t __user *gregs = uc->uc_mcontext.gregs;
|
||||
int err = 0;
|
||||
|
||||
|
@ -867,9 +874,9 @@ static inline int rt_setup_ucontext(struct ucontext __user *uc, struct pt_regs *
|
|||
err |= __put_user(sw->a5, &gregs[13]);
|
||||
err |= __put_user(sw->a6, &gregs[14]);
|
||||
err |= __put_user(rdusp(), &gregs[15]);
|
||||
err |= __put_user(regs->pc, &gregs[16]);
|
||||
err |= __put_user(regs->sr, &gregs[17]);
|
||||
err |= __put_user((regs->format << 12) | regs->vector, &uc->uc_formatvec);
|
||||
err |= __put_user(tregs->pc, &gregs[16]);
|
||||
err |= __put_user(tregs->sr, &gregs[17]);
|
||||
err |= __put_user((tregs->format << 12) | tregs->vector, &uc->uc_formatvec);
|
||||
err |= rt_save_fpu_state(uc, regs);
|
||||
return err;
|
||||
}
|
||||
|
@ -886,13 +893,14 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||
struct pt_regs *regs)
|
||||
{
|
||||
struct sigframe __user *frame;
|
||||
int fsize = frame_extra_sizes(regs->format);
|
||||
struct pt_regs *tregs = rte_regs(regs);
|
||||
int fsize = frame_extra_sizes(tregs->format);
|
||||
struct sigcontext context;
|
||||
int err = 0, sig = ksig->sig;
|
||||
|
||||
if (fsize < 0) {
|
||||
pr_debug("setup_frame: Unknown frame format %#x\n",
|
||||
regs->format);
|
||||
tregs->format);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
@ -903,7 +911,7 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||
|
||||
err |= __put_user(sig, &frame->sig);
|
||||
|
||||
err |= __put_user(regs->vector, &frame->code);
|
||||
err |= __put_user(tregs->vector, &frame->code);
|
||||
err |= __put_user(&frame->sc, &frame->psc);
|
||||
|
||||
if (_NSIG_WORDS > 1)
|
||||
|
@ -928,34 +936,28 @@ static int setup_frame(struct ksignal *ksig, sigset_t *set,
|
|||
|
||||
push_cache ((unsigned long) &frame->retcode);
|
||||
|
||||
/*
|
||||
* Set up registers for signal handler. All the state we are about
|
||||
* to destroy is successfully copied to sigframe.
|
||||
*/
|
||||
wrusp ((unsigned long) frame);
|
||||
regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
||||
adjustformat(regs);
|
||||
|
||||
/*
|
||||
* This is subtle; if we build more than one sigframe, all but the
|
||||
* first one will see frame format 0 and have fsize == 0, so we won't
|
||||
* screw stkadj.
|
||||
*/
|
||||
if (fsize)
|
||||
if (fsize) {
|
||||
regs->stkadj = fsize;
|
||||
|
||||
/* Prepare to skip over the extra stuff in the exception frame. */
|
||||
if (regs->stkadj) {
|
||||
struct pt_regs *tregs =
|
||||
(struct pt_regs *)((ulong)regs + regs->stkadj);
|
||||
tregs = rte_regs(regs);
|
||||
pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
|
||||
/* This must be copied with decreasing addresses to
|
||||
handle overlaps. */
|
||||
tregs->vector = 0;
|
||||
tregs->format = 0;
|
||||
tregs->pc = regs->pc;
|
||||
tregs->sr = regs->sr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up registers for signal handler. All the state we are about
|
||||
* to destroy is successfully copied to sigframe.
|
||||
*/
|
||||
wrusp ((unsigned long) frame);
|
||||
tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
||||
adjustformat(regs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -963,7 +965,8 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||
struct pt_regs *regs)
|
||||
{
|
||||
struct rt_sigframe __user *frame;
|
||||
int fsize = frame_extra_sizes(regs->format);
|
||||
struct pt_regs *tregs = rte_regs(regs);
|
||||
int fsize = frame_extra_sizes(tregs->format);
|
||||
int err = 0, sig = ksig->sig;
|
||||
|
||||
if (fsize < 0) {
|
||||
|
@ -1012,34 +1015,27 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
|
|||
|
||||
push_cache ((unsigned long) &frame->retcode);
|
||||
|
||||
/*
|
||||
* Set up registers for signal handler. All the state we are about
|
||||
* to destroy is successfully copied to sigframe.
|
||||
*/
|
||||
wrusp ((unsigned long) frame);
|
||||
regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
||||
adjustformat(regs);
|
||||
|
||||
/*
|
||||
* This is subtle; if we build more than one sigframe, all but the
|
||||
* first one will see frame format 0 and have fsize == 0, so we won't
|
||||
* screw stkadj.
|
||||
*/
|
||||
if (fsize)
|
||||
if (fsize) {
|
||||
regs->stkadj = fsize;
|
||||
|
||||
/* Prepare to skip over the extra stuff in the exception frame. */
|
||||
if (regs->stkadj) {
|
||||
struct pt_regs *tregs =
|
||||
(struct pt_regs *)((ulong)regs + regs->stkadj);
|
||||
tregs = rte_regs(regs);
|
||||
pr_debug("Performing stackadjust=%04lx\n", regs->stkadj);
|
||||
/* This must be copied with decreasing addresses to
|
||||
handle overlaps. */
|
||||
tregs->vector = 0;
|
||||
tregs->format = 0;
|
||||
tregs->pc = regs->pc;
|
||||
tregs->sr = regs->sr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up registers for signal handler. All the state we are about
|
||||
* to destroy is successfully copied to sigframe.
|
||||
*/
|
||||
wrusp ((unsigned long) frame);
|
||||
tregs->pc = (unsigned long) ksig->ka.sa.sa_handler;
|
||||
adjustformat(regs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2096,6 +2096,7 @@ static int x86_pmu_event_init(struct perf_event *event)
|
|||
if (err) {
|
||||
if (event->destroy)
|
||||
event->destroy(event);
|
||||
event->destroy = NULL;
|
||||
}
|
||||
|
||||
if (READ_ONCE(x86_pmu.attr_rdpmc) &&
|
||||
|
|
|
@ -304,12 +304,19 @@ static int apple_event(struct hid_device *hdev, struct hid_field *field,
|
|||
|
||||
/*
|
||||
* MacBook JIS keyboard has wrong logical maximum
|
||||
* Magic Keyboard JIS has wrong logical maximum
|
||||
*/
|
||||
static __u8 *apple_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
unsigned int *rsize)
|
||||
{
|
||||
struct apple_sc *asc = hid_get_drvdata(hdev);
|
||||
|
||||
if(*rsize >=71 && rdesc[70] == 0x65 && rdesc[64] == 0x65) {
|
||||
hid_info(hdev,
|
||||
"fixing up Magic Keyboard JIS report descriptor\n");
|
||||
rdesc[64] = rdesc[70] = 0xe7;
|
||||
}
|
||||
|
||||
if ((asc->quirks & APPLE_RDESC_JIS) && *rsize >= 60 &&
|
||||
rdesc[53] == 0x65 && rdesc[59] == 0x65) {
|
||||
hid_info(hdev,
|
||||
|
|
|
@ -73,6 +73,7 @@ config CASSINI
|
|||
config SUNVNET_COMMON
|
||||
tristate "Common routines to support Sun Virtual Networking"
|
||||
depends on SUN_LDOMS
|
||||
depends on INET
|
||||
default m
|
||||
|
||||
config SUNVNET
|
||||
|
|
|
@ -30,7 +30,12 @@
|
|||
#define MII_BCM7XXX_SHD_2_ADDR_CTRL 0xe
|
||||
#define MII_BCM7XXX_SHD_2_CTRL_STAT 0xf
|
||||
#define MII_BCM7XXX_SHD_2_BIAS_TRIM 0x1a
|
||||
#define MII_BCM7XXX_SHD_3_PCS_CTRL 0x0
|
||||
#define MII_BCM7XXX_SHD_3_PCS_STATUS 0x1
|
||||
#define MII_BCM7XXX_SHD_3_EEE_CAP 0x2
|
||||
#define MII_BCM7XXX_SHD_3_AN_EEE_ADV 0x3
|
||||
#define MII_BCM7XXX_SHD_3_EEE_LP 0x4
|
||||
#define MII_BCM7XXX_SHD_3_EEE_WK_ERR 0x5
|
||||
#define MII_BCM7XXX_SHD_3_PCS_CTRL_2 0x6
|
||||
#define MII_BCM7XXX_PCS_CTRL_2_DEF 0x4400
|
||||
#define MII_BCM7XXX_SHD_3_AN_STAT 0xb
|
||||
|
@ -463,6 +468,93 @@ static int bcm7xxx_28nm_ephy_config_init(struct phy_device *phydev)
|
|||
return bcm7xxx_28nm_ephy_apd_enable(phydev);
|
||||
}
|
||||
|
||||
#define MII_BCM7XXX_REG_INVALID 0xff
|
||||
|
||||
static u8 bcm7xxx_28nm_ephy_regnum_to_shd(u16 regnum)
|
||||
{
|
||||
switch (regnum) {
|
||||
case MDIO_CTRL1:
|
||||
return MII_BCM7XXX_SHD_3_PCS_CTRL;
|
||||
case MDIO_STAT1:
|
||||
return MII_BCM7XXX_SHD_3_PCS_STATUS;
|
||||
case MDIO_PCS_EEE_ABLE:
|
||||
return MII_BCM7XXX_SHD_3_EEE_CAP;
|
||||
case MDIO_AN_EEE_ADV:
|
||||
return MII_BCM7XXX_SHD_3_AN_EEE_ADV;
|
||||
case MDIO_AN_EEE_LPABLE:
|
||||
return MII_BCM7XXX_SHD_3_EEE_LP;
|
||||
case MDIO_PCS_EEE_WK_ERR:
|
||||
return MII_BCM7XXX_SHD_3_EEE_WK_ERR;
|
||||
default:
|
||||
return MII_BCM7XXX_REG_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
static bool bcm7xxx_28nm_ephy_dev_valid(int devnum)
|
||||
{
|
||||
return devnum == MDIO_MMD_AN || devnum == MDIO_MMD_PCS;
|
||||
}
|
||||
|
||||
static int bcm7xxx_28nm_ephy_read_mmd(struct phy_device *phydev,
|
||||
int devnum, u16 regnum)
|
||||
{
|
||||
u8 shd = bcm7xxx_28nm_ephy_regnum_to_shd(regnum);
|
||||
int ret;
|
||||
|
||||
if (!bcm7xxx_28nm_ephy_dev_valid(devnum) ||
|
||||
shd == MII_BCM7XXX_REG_INVALID)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* set shadow mode 2 */
|
||||
ret = phy_set_clr_bits(phydev, MII_BCM7XXX_TEST,
|
||||
MII_BCM7XXX_SHD_MODE_2, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Access the desired shadow register address */
|
||||
ret = phy_write(phydev, MII_BCM7XXX_SHD_2_ADDR_CTRL, shd);
|
||||
if (ret < 0)
|
||||
goto reset_shadow_mode;
|
||||
|
||||
ret = phy_read(phydev, MII_BCM7XXX_SHD_2_CTRL_STAT);
|
||||
|
||||
reset_shadow_mode:
|
||||
/* reset shadow mode 2 */
|
||||
phy_set_clr_bits(phydev, MII_BCM7XXX_TEST, 0,
|
||||
MII_BCM7XXX_SHD_MODE_2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bcm7xxx_28nm_ephy_write_mmd(struct phy_device *phydev,
|
||||
int devnum, u16 regnum, u16 val)
|
||||
{
|
||||
u8 shd = bcm7xxx_28nm_ephy_regnum_to_shd(regnum);
|
||||
int ret;
|
||||
|
||||
if (!bcm7xxx_28nm_ephy_dev_valid(devnum) ||
|
||||
shd == MII_BCM7XXX_REG_INVALID)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* set shadow mode 2 */
|
||||
ret = phy_set_clr_bits(phydev, MII_BCM7XXX_TEST,
|
||||
MII_BCM7XXX_SHD_MODE_2, 0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Access the desired shadow register address */
|
||||
ret = phy_write(phydev, MII_BCM7XXX_SHD_2_ADDR_CTRL, shd);
|
||||
if (ret < 0)
|
||||
goto reset_shadow_mode;
|
||||
|
||||
/* Write the desired value in the shadow register */
|
||||
phy_write(phydev, MII_BCM7XXX_SHD_2_CTRL_STAT, val);
|
||||
|
||||
reset_shadow_mode:
|
||||
/* reset shadow mode 2 */
|
||||
return phy_set_clr_bits(phydev, MII_BCM7XXX_TEST, 0,
|
||||
MII_BCM7XXX_SHD_MODE_2);
|
||||
}
|
||||
|
||||
static int bcm7xxx_28nm_ephy_resume(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
@ -634,6 +726,8 @@ static int bcm7xxx_28nm_probe(struct phy_device *phydev)
|
|||
.get_strings = bcm_phy_get_strings, \
|
||||
.get_stats = bcm7xxx_28nm_get_phy_stats, \
|
||||
.probe = bcm7xxx_28nm_probe, \
|
||||
.read_mmd = bcm7xxx_28nm_ephy_read_mmd, \
|
||||
.write_mmd = bcm7xxx_28nm_ephy_write_mmd, \
|
||||
}
|
||||
|
||||
#define BCM7XXX_40NM_EPHY(_oui, _name) \
|
||||
|
|
|
@ -134,7 +134,7 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
|
|||
static int ses_send_diag(struct scsi_device *sdev, int page_code,
|
||||
void *buf, int bufflen)
|
||||
{
|
||||
u32 result;
|
||||
int result;
|
||||
|
||||
unsigned char cmd[] = {
|
||||
SEND_DIAGNOSTIC,
|
||||
|
|
|
@ -336,7 +336,7 @@ static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi,
|
|||
}
|
||||
break;
|
||||
default:
|
||||
pr_info("Unsupport virtio scsi event reason %x\n", event->reason);
|
||||
pr_info("Unsupported virtio scsi event reason %x\n", event->reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -389,7 +389,7 @@ static void virtscsi_handle_event(struct work_struct *work)
|
|||
virtscsi_handle_param_change(vscsi, event);
|
||||
break;
|
||||
default:
|
||||
pr_err("Unsupport virtio scsi event %x\n", event->event);
|
||||
pr_err("Unsupported virtio scsi event %x\n", event->event);
|
||||
}
|
||||
virtscsi_kick_event(vscsi, event_node);
|
||||
}
|
||||
|
|
|
@ -1547,7 +1547,7 @@ extern struct pid *cad_pid;
|
|||
#define tsk_used_math(p) ((p)->flags & PF_USED_MATH)
|
||||
#define used_math() tsk_used_math(current)
|
||||
|
||||
static inline bool is_percpu_thread(void)
|
||||
static __always_inline bool is_percpu_thread(void)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
return (current->flags & PF_NO_SETAFFINITY) &&
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <uapi/linux/pkt_sched.h>
|
||||
|
||||
#define DEFAULT_TX_QUEUE_LEN 1000
|
||||
#define STAB_SIZE_LOG_MAX 30
|
||||
|
||||
struct qdisc_walker {
|
||||
int stop;
|
||||
|
|
|
@ -276,6 +276,7 @@ ip6t_do_table(struct sk_buff *skb,
|
|||
* things we don't know, ie. tcp syn flag or ports). If the
|
||||
* rule is also a fragment-specific rule, non-fragments won't
|
||||
* match it. */
|
||||
acpar.fragoff = 0;
|
||||
acpar.hotdrop = false;
|
||||
acpar.state = state;
|
||||
|
||||
|
|
|
@ -63,7 +63,10 @@ static struct mesh_table *mesh_table_alloc(void)
|
|||
atomic_set(&newtbl->entries, 0);
|
||||
spin_lock_init(&newtbl->gates_lock);
|
||||
spin_lock_init(&newtbl->walk_lock);
|
||||
rhashtable_init(&newtbl->rhead, &mesh_rht_params);
|
||||
if (rhashtable_init(&newtbl->rhead, &mesh_rht_params)) {
|
||||
kfree(newtbl);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return newtbl;
|
||||
}
|
||||
|
|
|
@ -3875,7 +3875,8 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx)
|
|||
if (!bssid)
|
||||
return false;
|
||||
if (ether_addr_equal(sdata->vif.addr, hdr->addr2) ||
|
||||
ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2))
|
||||
ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2) ||
|
||||
!is_valid_ether_addr(hdr->addr2))
|
||||
return false;
|
||||
if (ieee80211_is_beacon(hdr->frame_control))
|
||||
return true;
|
||||
|
|
|
@ -498,6 +498,12 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt,
|
|||
return stab;
|
||||
}
|
||||
|
||||
if (s->size_log > STAB_SIZE_LOG_MAX ||
|
||||
s->cell_log > STAB_SIZE_LOG_MAX) {
|
||||
NL_SET_ERR_MSG(extack, "Invalid logarithmic size of size table");
|
||||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL);
|
||||
if (!stab)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
|
Loading…
Reference in a new issue