Merge 4.19.139 into android-4.19-stable

Changes in 4.19.139
	USB: serial: qcserial: add EM7305 QDL product ID
	USB: iowarrior: fix up report size handling for some devices
	usb: xhci: define IDs for various ASMedia host controllers
	usb: xhci: Fix ASMedia ASM1142 DMA addressing
	Revert "ALSA: hda: call runtime_allow() for all hda controllers"
	ALSA: seq: oss: Serialize ioctls
	staging: android: ashmem: Fix lockdep warning for write operation
	Bluetooth: Fix slab-out-of-bounds read in hci_extended_inquiry_result_evt()
	Bluetooth: Prevent out-of-bounds read in hci_inquiry_result_evt()
	Bluetooth: Prevent out-of-bounds read in hci_inquiry_result_with_rssi_evt()
	omapfb: dss: Fix max fclk divider for omap36xx
	binder: Prevent context manager from incrementing ref 0
	vgacon: Fix for missing check in scrollback handling
	mtd: properly check all write ioctls for permissions
	leds: wm831x-status: fix use-after-free on unbind
	leds: da903x: fix use-after-free on unbind
	leds: lm3533: fix use-after-free on unbind
	leds: 88pm860x: fix use-after-free on unbind
	net/9p: validate fds in p9_fd_open
	drm/nouveau/fbcon: fix module unload when fbcon init has failed for some reason
	drm/nouveau/fbcon: zero-initialise the mode_cmd2 structure
	i2c: slave: improve sanity check when registering
	i2c: slave: add sanity check when unregistering
	usb: hso: check for return value in hso_serial_common_create()
	firmware: Fix a reference count leak.
	cfg80211: check vendor command doit pointer before use
	igb: reinit_locked() should be called with rtnl_lock
	atm: fix atm_dev refcnt leaks in atmtcp_remove_persistent
	tools lib traceevent: Fix memory leak in process_dynamic_array_len
	Drivers: hv: vmbus: Ignore CHANNELMSG_TL_CONNECT_RESULT(23)
	xattr: break delegations in {set,remove}xattr
	ipv4: Silence suspicious RCU usage warning
	ipv6: fix memory leaks on IPV6_ADDRFORM path
	net: ethernet: mtk_eth_soc: fix MTU warnings
	vxlan: Ensure FDB dump is performed under RCU
	net: lan78xx: replace bogus endpoint lookup
	hv_netvsc: do not use VF device if link is down
	net: gre: recompute gre csum for sctp over gre tunnels
	net: thunderx: use spin_lock_bh in nicvf_set_rx_mode_task()
	openvswitch: Prevent kernel-infoleak in ovs_ct_put_key()
	Revert "vxlan: fix tos value before xmit"
	selftests/net: relax cpu affinity requirement in msg_zerocopy test
	rxrpc: Fix race between recvmsg and sendmsg on immediate call failure
	i40e: add num_vectors checker in iwarp handler
	i40e: Wrong truncation from u16 to u8
	i40e: Fix of memory leak and integer truncation in i40e_virtchnl.c
	i40e: Memory leak in i40e_config_iwarp_qvlist
	Smack: fix use-after-free in smk_write_relabel_self()
	Linux 4.19.139

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: If64996b6bc365365c5f06165ed8c7648336731bf
This commit is contained in:
Greg Kroah-Hartman
2020-08-11 17:03:22 +02:00
48 changed files with 487 additions and 230 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 4 VERSION = 4
PATCHLEVEL = 19 PATCHLEVEL = 19
SUBLEVEL = 138 SUBLEVEL = 139
EXTRAVERSION = EXTRAVERSION =
NAME = "People's Front" NAME = "People's Front"

View File

@@ -3081,6 +3081,12 @@ static void binder_transaction(struct binder_proc *proc,
goto err_dead_binder; goto err_dead_binder;
} }
e->to_node = target_node->debug_id; e->to_node = target_node->debug_id;
if (WARN_ON(proc == target_proc)) {
return_error = BR_FAILED_REPLY;
return_error_param = -EINVAL;
return_error_line = __LINE__;
goto err_invalid_target_handle;
}
if (security_binder_transaction(proc->tsk, if (security_binder_transaction(proc->tsk,
target_proc->tsk) < 0) { target_proc->tsk) < 0) {
return_error = BR_FAILED_REPLY; return_error = BR_FAILED_REPLY;
@@ -3683,10 +3689,17 @@ static int binder_thread_write(struct binder_proc *proc,
struct binder_node *ctx_mgr_node; struct binder_node *ctx_mgr_node;
mutex_lock(&context->context_mgr_node_lock); mutex_lock(&context->context_mgr_node_lock);
ctx_mgr_node = context->binder_context_mgr_node; ctx_mgr_node = context->binder_context_mgr_node;
if (ctx_mgr_node) if (ctx_mgr_node) {
if (ctx_mgr_node->proc == proc) {
binder_user_error("%d:%d context manager tried to acquire desc 0\n",
proc->pid, thread->pid);
mutex_unlock(&context->context_mgr_node_lock);
return -EINVAL;
}
ret = binder_inc_ref_for_node( ret = binder_inc_ref_for_node(
proc, ctx_mgr_node, proc, ctx_mgr_node,
strong, NULL, &rdata); strong, NULL, &rdata);
}
mutex_unlock(&context->context_mgr_node_lock); mutex_unlock(&context->context_mgr_node_lock);
} }
if (ret) if (ret)

View File

@@ -432,9 +432,15 @@ static int atmtcp_remove_persistent(int itf)
return -EMEDIUMTYPE; return -EMEDIUMTYPE;
} }
dev_data = PRIV(dev); dev_data = PRIV(dev);
if (!dev_data->persist) return 0; if (!dev_data->persist) {
atm_dev_put(dev);
return 0;
}
dev_data->persist = 0; dev_data->persist = 0;
if (PRIV(dev)->vcc) return 0; if (PRIV(dev)->vcc) {
atm_dev_put(dev);
return 0;
}
kfree(dev_data); kfree(dev_data);
atm_dev_put(dev); atm_dev_put(dev);
atm_dev_deregister(dev); atm_dev_deregister(dev);

View File

@@ -605,8 +605,10 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
/* register entry under "/sys/firmware/qemu_fw_cfg/by_key/" */ /* register entry under "/sys/firmware/qemu_fw_cfg/by_key/" */
err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype, err = kobject_init_and_add(&entry->kobj, &fw_cfg_sysfs_entry_ktype,
fw_cfg_sel_ko, "%d", entry->select); fw_cfg_sel_ko, "%d", entry->select);
if (err) if (err) {
goto err_register; kobject_put(&entry->kobj);
return err;
}
/* add raw binary content access */ /* add raw binary content access */
err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw); err = sysfs_create_bin_file(&entry->kobj, &fw_cfg_sysfs_attr_raw);
@@ -622,7 +624,6 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)
err_add_raw: err_add_raw:
kobject_del(&entry->kobj); kobject_del(&entry->kobj);
err_register:
kfree(entry); kfree(entry);
return err; return err;
} }

View File

@@ -315,7 +315,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
struct nouveau_framebuffer *fb; struct nouveau_framebuffer *fb;
struct nouveau_channel *chan; struct nouveau_channel *chan;
struct nouveau_bo *nvbo; struct nouveau_bo *nvbo;
struct drm_mode_fb_cmd2 mode_cmd; struct drm_mode_fb_cmd2 mode_cmd = {};
int ret; int ret;
mode_cmd.width = sizes->surface_width; mode_cmd.width = sizes->surface_width;
@@ -599,6 +599,7 @@ nouveau_fbcon_init(struct drm_device *dev)
drm_fb_helper_fini(&fbcon->helper); drm_fb_helper_fini(&fbcon->helper);
free: free:
kfree(fbcon); kfree(fbcon);
drm->fbcon = NULL;
return ret; return ret;
} }

View File

@@ -1249,6 +1249,8 @@ channel_message_table[CHANNELMSG_COUNT] = {
{ CHANNELMSG_19, 0, NULL }, { CHANNELMSG_19, 0, NULL },
{ CHANNELMSG_20, 0, NULL }, { CHANNELMSG_20, 0, NULL },
{ CHANNELMSG_TL_CONNECT_REQUEST, 0, NULL }, { CHANNELMSG_TL_CONNECT_REQUEST, 0, NULL },
{ CHANNELMSG_22, 0, NULL },
{ CHANNELMSG_TL_CONNECT_RESULT, 0, NULL },
}; };
/* /*
@@ -1260,25 +1262,16 @@ void vmbus_onmessage(void *context)
{ {
struct hv_message *msg = context; struct hv_message *msg = context;
struct vmbus_channel_message_header *hdr; struct vmbus_channel_message_header *hdr;
int size;
hdr = (struct vmbus_channel_message_header *)msg->u.payload; hdr = (struct vmbus_channel_message_header *)msg->u.payload;
size = msg->header.payload_size;
trace_vmbus_on_message(hdr); trace_vmbus_on_message(hdr);
if (hdr->msgtype >= CHANNELMSG_COUNT) { /*
pr_err("Received invalid channel message type %d size %d\n", * vmbus_on_msg_dpc() makes sure the hdr->msgtype here can not go
hdr->msgtype, size); * out of bound and the message_handler pointer can not be NULL.
print_hex_dump_bytes("", DUMP_PREFIX_NONE, */
(unsigned char *)msg->u.payload, size); channel_message_table[hdr->msgtype].message_handler(hdr);
return;
}
if (channel_message_table[hdr->msgtype].message_handler)
channel_message_table[hdr->msgtype].message_handler(hdr);
else
pr_err("Unhandled channel message type %d\n", hdr->msgtype);
} }
/* /*

View File

@@ -939,6 +939,10 @@ void vmbus_on_msg_dpc(unsigned long data)
} }
entry = &channel_message_table[hdr->msgtype]; entry = &channel_message_table[hdr->msgtype];
if (!entry->message_handler)
goto msg_handled;
if (entry->handler_type == VMHT_BLOCKING) { if (entry->handler_type == VMHT_BLOCKING) {
ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC); ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
if (ctx == NULL) if (ctx == NULL)

View File

@@ -22,10 +22,8 @@ int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
{ {
int ret; int ret;
if (!client || !slave_cb) { if (WARN(IS_ERR_OR_NULL(client) || !slave_cb, "insufficient data\n"))
WARN(1, "insufficient data\n");
return -EINVAL; return -EINVAL;
}
if (!(client->flags & I2C_CLIENT_SLAVE)) if (!(client->flags & I2C_CLIENT_SLAVE))
dev_warn(&client->dev, "%s: client slave flag not set. You might see address collisions\n", dev_warn(&client->dev, "%s: client slave flag not set. You might see address collisions\n",
@@ -64,6 +62,9 @@ int i2c_slave_unregister(struct i2c_client *client)
{ {
int ret; int ret;
if (IS_ERR_OR_NULL(client))
return -EINVAL;
if (!client->adapter->algo->unreg_slave) { if (!client->adapter->algo->unreg_slave) {
dev_err(&client->dev, "%s: not supported by adapter\n", __func__); dev_err(&client->dev, "%s: not supported by adapter\n", __func__);
return -EOPNOTSUPP; return -EOPNOTSUPP;

View File

@@ -207,21 +207,33 @@ static int pm860x_led_probe(struct platform_device *pdev)
data->cdev.brightness_set_blocking = pm860x_led_set; data->cdev.brightness_set_blocking = pm860x_led_set;
mutex_init(&data->lock); mutex_init(&data->lock);
ret = devm_led_classdev_register(chip->dev, &data->cdev); ret = led_classdev_register(chip->dev, &data->cdev);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret); dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
return ret; return ret;
} }
pm860x_led_set(&data->cdev, 0); pm860x_led_set(&data->cdev, 0);
platform_set_drvdata(pdev, data);
return 0; return 0;
} }
static int pm860x_led_remove(struct platform_device *pdev)
{
struct pm860x_led *data = platform_get_drvdata(pdev);
led_classdev_unregister(&data->cdev);
return 0;
}
static struct platform_driver pm860x_led_driver = { static struct platform_driver pm860x_led_driver = {
.driver = { .driver = {
.name = "88pm860x-led", .name = "88pm860x-led",
}, },
.probe = pm860x_led_probe, .probe = pm860x_led_probe,
.remove = pm860x_led_remove,
}; };
module_platform_driver(pm860x_led_driver); module_platform_driver(pm860x_led_driver);

View File

@@ -113,12 +113,23 @@ static int da903x_led_probe(struct platform_device *pdev)
led->flags = pdata->flags; led->flags = pdata->flags;
led->master = pdev->dev.parent; led->master = pdev->dev.parent;
ret = devm_led_classdev_register(led->master, &led->cdev); ret = led_classdev_register(led->master, &led->cdev);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register LED %d\n", id); dev_err(&pdev->dev, "failed to register LED %d\n", id);
return ret; return ret;
} }
platform_set_drvdata(pdev, led);
return 0;
}
static int da903x_led_remove(struct platform_device *pdev)
{
struct da903x_led *led = platform_get_drvdata(pdev);
led_classdev_unregister(&led->cdev);
return 0; return 0;
} }
@@ -127,6 +138,7 @@ static struct platform_driver da903x_led_driver = {
.name = "da903x-led", .name = "da903x-led",
}, },
.probe = da903x_led_probe, .probe = da903x_led_probe,
.remove = da903x_led_remove,
}; };
module_platform_driver(da903x_led_driver); module_platform_driver(da903x_led_driver);

View File

@@ -698,7 +698,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, led); platform_set_drvdata(pdev, led);
ret = devm_led_classdev_register(pdev->dev.parent, &led->cdev); ret = led_classdev_register(pdev->dev.parent, &led->cdev);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id); dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
return ret; return ret;
@@ -708,13 +708,18 @@ static int lm3533_led_probe(struct platform_device *pdev)
ret = lm3533_led_setup(led, pdata); ret = lm3533_led_setup(led, pdata);
if (ret) if (ret)
return ret; goto err_deregister;
ret = lm3533_ctrlbank_enable(&led->cb); ret = lm3533_ctrlbank_enable(&led->cb);
if (ret) if (ret)
return ret; goto err_deregister;
return 0; return 0;
err_deregister:
led_classdev_unregister(&led->cdev);
return ret;
} }
static int lm3533_led_remove(struct platform_device *pdev) static int lm3533_led_remove(struct platform_device *pdev)
@@ -724,6 +729,7 @@ static int lm3533_led_remove(struct platform_device *pdev)
dev_dbg(&pdev->dev, "%s\n", __func__); dev_dbg(&pdev->dev, "%s\n", __func__);
lm3533_ctrlbank_disable(&led->cb); lm3533_ctrlbank_disable(&led->cb);
led_classdev_unregister(&led->cdev);
return 0; return 0;
} }

View File

@@ -273,12 +273,23 @@ static int wm831x_status_probe(struct platform_device *pdev)
drvdata->cdev.blink_set = wm831x_status_blink_set; drvdata->cdev.blink_set = wm831x_status_blink_set;
drvdata->cdev.groups = wm831x_status_groups; drvdata->cdev.groups = wm831x_status_groups;
ret = devm_led_classdev_register(wm831x->dev, &drvdata->cdev); ret = led_classdev_register(wm831x->dev, &drvdata->cdev);
if (ret < 0) { if (ret < 0) {
dev_err(&pdev->dev, "Failed to register LED: %d\n", ret); dev_err(&pdev->dev, "Failed to register LED: %d\n", ret);
return ret; return ret;
} }
platform_set_drvdata(pdev, drvdata);
return 0;
}
static int wm831x_status_remove(struct platform_device *pdev)
{
struct wm831x_status *drvdata = platform_get_drvdata(pdev);
led_classdev_unregister(&drvdata->cdev);
return 0; return 0;
} }
@@ -287,6 +298,7 @@ static struct platform_driver wm831x_status_driver = {
.name = "wm831x-status", .name = "wm831x-status",
}, },
.probe = wm831x_status_probe, .probe = wm831x_status_probe,
.remove = wm831x_status_remove,
}; };
module_platform_driver(wm831x_status_driver); module_platform_driver(wm831x_status_driver);

View File

@@ -368,9 +368,6 @@ static int mtdchar_writeoob(struct file *file, struct mtd_info *mtd,
uint32_t retlen; uint32_t retlen;
int ret = 0; int ret = 0;
if (!(file->f_mode & FMODE_WRITE))
return -EPERM;
if (length > 4096) if (length > 4096)
return -EINVAL; return -EINVAL;
@@ -655,6 +652,48 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
pr_debug("MTD_ioctl\n"); pr_debug("MTD_ioctl\n");
/*
* Check the file mode to require "dangerous" commands to have write
* permissions.
*/
switch (cmd) {
/* "safe" commands */
case MEMGETREGIONCOUNT:
case MEMGETREGIONINFO:
case MEMGETINFO:
case MEMREADOOB:
case MEMREADOOB64:
case MEMLOCK:
case MEMUNLOCK:
case MEMISLOCKED:
case MEMGETOOBSEL:
case MEMGETBADBLOCK:
case MEMSETBADBLOCK:
case OTPSELECT:
case OTPGETREGIONCOUNT:
case OTPGETREGIONINFO:
case OTPLOCK:
case ECCGETLAYOUT:
case ECCGETSTATS:
case MTDFILEMODE:
case BLKPG:
case BLKRRPART:
break;
/* "dangerous" commands */
case MEMERASE:
case MEMERASE64:
case MEMWRITEOOB:
case MEMWRITEOOB64:
case MEMWRITE:
if (!(file->f_mode & FMODE_WRITE))
return -EPERM;
break;
default:
return -ENOTTY;
}
switch (cmd) { switch (cmd) {
case MEMGETREGIONCOUNT: case MEMGETREGIONCOUNT:
if (copy_to_user(argp, &(mtd->numeraseregions), sizeof(int))) if (copy_to_user(argp, &(mtd->numeraseregions), sizeof(int)))
@@ -702,9 +741,6 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
{ {
struct erase_info *erase; struct erase_info *erase;
if(!(file->f_mode & FMODE_WRITE))
return -EPERM;
erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL); erase=kzalloc(sizeof(struct erase_info),GFP_KERNEL);
if (!erase) if (!erase)
ret = -ENOMEM; ret = -ENOMEM;
@@ -997,9 +1033,6 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
ret = 0; ret = 0;
break; break;
} }
default:
ret = -ENOTTY;
} }
return ret; return ret;
@@ -1043,6 +1076,11 @@ static long mtdchar_compat_ioctl(struct file *file, unsigned int cmd,
struct mtd_oob_buf32 buf; struct mtd_oob_buf32 buf;
struct mtd_oob_buf32 __user *buf_user = argp; struct mtd_oob_buf32 __user *buf_user = argp;
if (!(file->f_mode & FMODE_WRITE)) {
ret = -EPERM;
break;
}
if (copy_from_user(&buf, argp, sizeof(buf))) if (copy_from_user(&buf, argp, sizeof(buf)))
ret = -EFAULT; ret = -EFAULT;
else else

View File

@@ -2015,11 +2015,11 @@ static void nicvf_set_rx_mode_task(struct work_struct *work_arg)
/* Save message data locally to prevent them from /* Save message data locally to prevent them from
* being overwritten by next ndo_set_rx_mode call(). * being overwritten by next ndo_set_rx_mode call().
*/ */
spin_lock(&nic->rx_mode_wq_lock); spin_lock_bh(&nic->rx_mode_wq_lock);
mode = vf_work->mode; mode = vf_work->mode;
mc = vf_work->mc; mc = vf_work->mc;
vf_work->mc = NULL; vf_work->mc = NULL;
spin_unlock(&nic->rx_mode_wq_lock); spin_unlock_bh(&nic->rx_mode_wq_lock);
__nicvf_set_rx_mode_task(mode, mc, nic); __nicvf_set_rx_mode_task(mode, mc, nic);
} }

View File

@@ -181,7 +181,7 @@ static inline bool i40e_vc_isvalid_vsi_id(struct i40e_vf *vf, u16 vsi_id)
* check for the valid queue id * check for the valid queue id
**/ **/
static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_id, static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_id,
u8 qid) u16 qid)
{ {
struct i40e_pf *pf = vf->pf; struct i40e_pf *pf = vf->pf;
struct i40e_vsi *vsi = i40e_find_vsi_from_id(pf, vsi_id); struct i40e_vsi *vsi = i40e_find_vsi_from_id(pf, vsi_id);
@@ -196,7 +196,7 @@ static inline bool i40e_vc_isvalid_queue_id(struct i40e_vf *vf, u16 vsi_id,
* *
* check for the valid vector id * check for the valid vector id
**/ **/
static inline bool i40e_vc_isvalid_vector_id(struct i40e_vf *vf, u8 vector_id) static inline bool i40e_vc_isvalid_vector_id(struct i40e_vf *vf, u32 vector_id)
{ {
struct i40e_pf *pf = vf->pf; struct i40e_pf *pf = vf->pf;
@@ -441,14 +441,28 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
u32 v_idx, i, reg_idx, reg; u32 v_idx, i, reg_idx, reg;
u32 next_q_idx, next_q_type; u32 next_q_idx, next_q_type;
u32 msix_vf, size; u32 msix_vf, size;
int ret = 0;
msix_vf = pf->hw.func_caps.num_msix_vectors_vf;
if (qvlist_info->num_vectors > msix_vf) {
dev_warn(&pf->pdev->dev,
"Incorrect number of iwarp vectors %u. Maximum %u allowed.\n",
qvlist_info->num_vectors,
msix_vf);
ret = -EINVAL;
goto err_out;
}
size = sizeof(struct virtchnl_iwarp_qvlist_info) + size = sizeof(struct virtchnl_iwarp_qvlist_info) +
(sizeof(struct virtchnl_iwarp_qv_info) * (sizeof(struct virtchnl_iwarp_qv_info) *
(qvlist_info->num_vectors - 1)); (qvlist_info->num_vectors - 1));
kfree(vf->qvlist_info);
vf->qvlist_info = kzalloc(size, GFP_KERNEL); vf->qvlist_info = kzalloc(size, GFP_KERNEL);
if (!vf->qvlist_info) if (!vf->qvlist_info) {
return -ENOMEM; ret = -ENOMEM;
goto err_out;
}
vf->qvlist_info->num_vectors = qvlist_info->num_vectors; vf->qvlist_info->num_vectors = qvlist_info->num_vectors;
msix_vf = pf->hw.func_caps.num_msix_vectors_vf; msix_vf = pf->hw.func_caps.num_msix_vectors_vf;
@@ -459,8 +473,10 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
v_idx = qv_info->v_idx; v_idx = qv_info->v_idx;
/* Validate vector id belongs to this vf */ /* Validate vector id belongs to this vf */
if (!i40e_vc_isvalid_vector_id(vf, v_idx)) if (!i40e_vc_isvalid_vector_id(vf, v_idx)) {
goto err; ret = -EINVAL;
goto err_free;
}
vf->qvlist_info->qv_info[i] = *qv_info; vf->qvlist_info->qv_info[i] = *qv_info;
@@ -502,10 +518,11 @@ static int i40e_config_iwarp_qvlist(struct i40e_vf *vf,
} }
return 0; return 0;
err: err_free:
kfree(vf->qvlist_info); kfree(vf->qvlist_info);
vf->qvlist_info = NULL; vf->qvlist_info = NULL;
return -EINVAL; err_out:
return ret;
} }
/** /**
@@ -3335,7 +3352,7 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) { if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states)) {
aq_ret = I40E_ERR_PARAM; aq_ret = I40E_ERR_PARAM;
goto err; goto err_out;
} }
if (!vf->adq_enabled) { if (!vf->adq_enabled) {
@@ -3343,15 +3360,15 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
"VF %d: ADq is not enabled, can't apply cloud filter\n", "VF %d: ADq is not enabled, can't apply cloud filter\n",
vf->vf_id); vf->vf_id);
aq_ret = I40E_ERR_PARAM; aq_ret = I40E_ERR_PARAM;
goto err; goto err_out;
} }
if (i40e_validate_cloud_filter(vf, vcf)) { if (i40e_validate_cloud_filter(vf, vcf)) {
dev_info(&pf->pdev->dev, dev_info(&pf->pdev->dev,
"VF %d: Invalid input/s, can't apply cloud filter\n", "VF %d: Invalid input/s, can't apply cloud filter\n",
vf->vf_id); vf->vf_id);
aq_ret = I40E_ERR_PARAM; aq_ret = I40E_ERR_PARAM;
goto err; goto err_out;
} }
cfilter = kzalloc(sizeof(*cfilter), GFP_KERNEL); cfilter = kzalloc(sizeof(*cfilter), GFP_KERNEL);
@@ -3412,13 +3429,17 @@ static int i40e_vc_add_cloud_filter(struct i40e_vf *vf, u8 *msg)
"VF %d: Failed to add cloud filter, err %s aq_err %s\n", "VF %d: Failed to add cloud filter, err %s aq_err %s\n",
vf->vf_id, i40e_stat_str(&pf->hw, ret), vf->vf_id, i40e_stat_str(&pf->hw, ret),
i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status));
goto err; goto err_free;
} }
INIT_HLIST_NODE(&cfilter->cloud_node); INIT_HLIST_NODE(&cfilter->cloud_node);
hlist_add_head(&cfilter->cloud_node, &vf->cloud_filter_list); hlist_add_head(&cfilter->cloud_node, &vf->cloud_filter_list);
/* release the pointer passing it to the collection */
cfilter = NULL;
vf->num_cloud_filters++; vf->num_cloud_filters++;
err: err_free:
kfree(cfilter);
err_out:
return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_ADD_CLOUD_FILTER, return i40e_vc_send_resp_to_vf(vf, VIRTCHNL_OP_ADD_CLOUD_FILTER,
aq_ret); aq_ret);
} }

View File

@@ -6226,9 +6226,18 @@ static void igb_reset_task(struct work_struct *work)
struct igb_adapter *adapter; struct igb_adapter *adapter;
adapter = container_of(work, struct igb_adapter, reset_task); adapter = container_of(work, struct igb_adapter, reset_task);
rtnl_lock();
/* If we're already down or resetting, just bail */
if (test_bit(__IGB_DOWN, &adapter->state) ||
test_bit(__IGB_RESETTING, &adapter->state)) {
rtnl_unlock();
return;
}
igb_dump(adapter); igb_dump(adapter);
netdev_err(adapter->netdev, "Reset adapter\n"); netdev_err(adapter->netdev, "Reset adapter\n");
igb_reinit_locked(adapter); igb_reinit_locked(adapter);
rtnl_unlock();
} }
/** /**

View File

@@ -2452,6 +2452,8 @@ static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
eth->netdev[id]->irq = eth->irq[0]; eth->netdev[id]->irq = eth->irq[0];
eth->netdev[id]->dev.of_node = np; eth->netdev[id]->dev.of_node = np;
eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN;
return 0; return 0;
free_netdev: free_netdev:

View File

@@ -543,12 +543,13 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
u32 hash; u32 hash;
struct hv_page_buffer pb[MAX_PAGE_BUFFER_COUNT]; struct hv_page_buffer pb[MAX_PAGE_BUFFER_COUNT];
/* if VF is present and up then redirect packets /* If VF is present and up then redirect packets to it.
* already called with rcu_read_lock_bh * Skip the VF if it is marked down or has no carrier.
* If netpoll is in uses, then VF can not be used either.
*/ */
vf_netdev = rcu_dereference_bh(net_device_ctx->vf_netdev); vf_netdev = rcu_dereference_bh(net_device_ctx->vf_netdev);
if (vf_netdev && netif_running(vf_netdev) && if (vf_netdev && netif_running(vf_netdev) &&
!netpoll_tx_running(net)) netif_carrier_ok(vf_netdev) && !netpoll_tx_running(net))
return netvsc_vf_xmit(net, vf_netdev, skb); return netvsc_vf_xmit(net, vf_netdev, skb);
/* We will atmost need two pages to describe the rndis /* We will atmost need two pages to describe the rndis

View File

@@ -2274,12 +2274,14 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
minor = get_free_serial_index(); minor = get_free_serial_index();
if (minor < 0) if (minor < 0)
goto exit; goto exit2;
/* register our minor number */ /* register our minor number */
serial->parent->dev = tty_port_register_device_attr(&serial->port, serial->parent->dev = tty_port_register_device_attr(&serial->port,
tty_drv, minor, &serial->parent->interface->dev, tty_drv, minor, &serial->parent->interface->dev,
serial->parent, hso_serial_dev_groups); serial->parent, hso_serial_dev_groups);
if (IS_ERR(serial->parent->dev))
goto exit2;
/* fill in specific data for later use */ /* fill in specific data for later use */
serial->minor = minor; serial->minor = minor;
@@ -2324,6 +2326,7 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
return 0; return 0;
exit: exit:
hso_serial_tty_unregister(serial); hso_serial_tty_unregister(serial);
exit2:
hso_serial_common_free(serial); hso_serial_common_free(serial);
return -1; return -1;
} }

View File

@@ -388,10 +388,6 @@ struct lan78xx_net {
struct tasklet_struct bh; struct tasklet_struct bh;
struct delayed_work wq; struct delayed_work wq;
struct usb_host_endpoint *ep_blkin;
struct usb_host_endpoint *ep_blkout;
struct usb_host_endpoint *ep_intr;
int msg_enable; int msg_enable;
struct urb *urb_intr; struct urb *urb_intr;
@@ -2883,78 +2879,12 @@ lan78xx_start_xmit(struct sk_buff *skb, struct net_device *net)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
static int
lan78xx_get_endpoints(struct lan78xx_net *dev, struct usb_interface *intf)
{
int tmp;
struct usb_host_interface *alt = NULL;
struct usb_host_endpoint *in = NULL, *out = NULL;
struct usb_host_endpoint *status = NULL;
for (tmp = 0; tmp < intf->num_altsetting; tmp++) {
unsigned ep;
in = NULL;
out = NULL;
status = NULL;
alt = intf->altsetting + tmp;
for (ep = 0; ep < alt->desc.bNumEndpoints; ep++) {
struct usb_host_endpoint *e;
int intr = 0;
e = alt->endpoint + ep;
switch (e->desc.bmAttributes) {
case USB_ENDPOINT_XFER_INT:
if (!usb_endpoint_dir_in(&e->desc))
continue;
intr = 1;
/* FALLTHROUGH */
case USB_ENDPOINT_XFER_BULK:
break;
default:
continue;
}
if (usb_endpoint_dir_in(&e->desc)) {
if (!intr && !in)
in = e;
else if (intr && !status)
status = e;
} else {
if (!out)
out = e;
}
}
if (in && out)
break;
}
if (!alt || !in || !out)
return -EINVAL;
dev->pipe_in = usb_rcvbulkpipe(dev->udev,
in->desc.bEndpointAddress &
USB_ENDPOINT_NUMBER_MASK);
dev->pipe_out = usb_sndbulkpipe(dev->udev,
out->desc.bEndpointAddress &
USB_ENDPOINT_NUMBER_MASK);
dev->ep_intr = status;
return 0;
}
static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf)
{ {
struct lan78xx_priv *pdata = NULL; struct lan78xx_priv *pdata = NULL;
int ret; int ret;
int i; int i;
ret = lan78xx_get_endpoints(dev, intf);
if (ret) {
netdev_warn(dev->net, "lan78xx_get_endpoints failed: %d\n",
ret);
return ret;
}
dev->data[0] = (unsigned long)kzalloc(sizeof(*pdata), GFP_KERNEL); dev->data[0] = (unsigned long)kzalloc(sizeof(*pdata), GFP_KERNEL);
pdata = (struct lan78xx_priv *)(dev->data[0]); pdata = (struct lan78xx_priv *)(dev->data[0]);
@@ -3726,6 +3656,7 @@ static void lan78xx_stat_monitor(struct timer_list *t)
static int lan78xx_probe(struct usb_interface *intf, static int lan78xx_probe(struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
struct usb_host_endpoint *ep_blkin, *ep_blkout, *ep_intr;
struct lan78xx_net *dev; struct lan78xx_net *dev;
struct net_device *netdev; struct net_device *netdev;
struct usb_device *udev; struct usb_device *udev;
@@ -3774,6 +3705,34 @@ static int lan78xx_probe(struct usb_interface *intf,
mutex_init(&dev->stats.access_lock); mutex_init(&dev->stats.access_lock);
if (intf->cur_altsetting->desc.bNumEndpoints < 3) {
ret = -ENODEV;
goto out2;
}
dev->pipe_in = usb_rcvbulkpipe(udev, BULK_IN_PIPE);
ep_blkin = usb_pipe_endpoint(udev, dev->pipe_in);
if (!ep_blkin || !usb_endpoint_is_bulk_in(&ep_blkin->desc)) {
ret = -ENODEV;
goto out2;
}
dev->pipe_out = usb_sndbulkpipe(udev, BULK_OUT_PIPE);
ep_blkout = usb_pipe_endpoint(udev, dev->pipe_out);
if (!ep_blkout || !usb_endpoint_is_bulk_out(&ep_blkout->desc)) {
ret = -ENODEV;
goto out2;
}
ep_intr = &intf->cur_altsetting->endpoint[2];
if (!usb_endpoint_is_int_in(&ep_intr->desc)) {
ret = -ENODEV;
goto out2;
}
dev->pipe_intr = usb_rcvintpipe(dev->udev,
usb_endpoint_num(&ep_intr->desc));
ret = lan78xx_bind(dev, intf); ret = lan78xx_bind(dev, intf);
if (ret < 0) if (ret < 0)
goto out2; goto out2;
@@ -3786,23 +3745,7 @@ static int lan78xx_probe(struct usb_interface *intf,
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE; netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER); netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
if (intf->cur_altsetting->desc.bNumEndpoints < 3) { period = ep_intr->desc.bInterval;
ret = -ENODEV;
goto out3;
}
dev->ep_blkin = (intf->cur_altsetting)->endpoint + 0;
dev->ep_blkout = (intf->cur_altsetting)->endpoint + 1;
dev->ep_intr = (intf->cur_altsetting)->endpoint + 2;
dev->pipe_in = usb_rcvbulkpipe(udev, BULK_IN_PIPE);
dev->pipe_out = usb_sndbulkpipe(udev, BULK_OUT_PIPE);
dev->pipe_intr = usb_rcvintpipe(dev->udev,
dev->ep_intr->desc.bEndpointAddress &
USB_ENDPOINT_NUMBER_MASK);
period = dev->ep_intr->desc.bInterval;
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0); maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
buf = kmalloc(maxp, GFP_KERNEL); buf = kmalloc(maxp, GFP_KERNEL);
if (buf) { if (buf) {

View File

@@ -975,6 +975,7 @@ static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
for (h = 0; h < FDB_HASH_SIZE; ++h) { for (h = 0; h < FDB_HASH_SIZE; ++h) {
struct vxlan_fdb *f; struct vxlan_fdb *f;
rcu_read_lock();
hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) { hlist_for_each_entry_rcu(f, &vxlan->fdb_head[h], hlist) {
struct vxlan_rdst *rd; struct vxlan_rdst *rd;
@@ -987,12 +988,15 @@ static int vxlan_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
cb->nlh->nlmsg_seq, cb->nlh->nlmsg_seq,
RTM_NEWNEIGH, RTM_NEWNEIGH,
NLM_F_MULTI, rd); NLM_F_MULTI, rd);
if (err < 0) if (err < 0) {
rcu_read_unlock();
goto out; goto out;
}
skip: skip:
*idx += 1; *idx += 1;
} }
} }
rcu_read_unlock();
} }
out: out:
return err; return err;
@@ -2219,7 +2223,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
ndst = &rt->dst; ndst = &rt->dst;
skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM); skb_tunnel_check_pmtu(skb, ndst, VXLAN_HEADROOM);
tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb); tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr), err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
vni, md, flags, udp_sum); vni, md, flags, udp_sum);
@@ -2256,7 +2260,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
skb_tunnel_check_pmtu(skb, ndst, VXLAN6_HEADROOM); skb_tunnel_check_pmtu(skb, ndst, VXLAN6_HEADROOM);
tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb); tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
ttl = ttl ? : ip6_dst_hoplimit(ndst); ttl = ttl ? : ip6_dst_hoplimit(ndst);
skb_scrub_packet(skb, xnet); skb_scrub_packet(skb, xnet);
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr), err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),

View File

@@ -95,6 +95,15 @@ static DEFINE_MUTEX(ashmem_mutex);
static struct kmem_cache *ashmem_area_cachep __read_mostly; static struct kmem_cache *ashmem_area_cachep __read_mostly;
static struct kmem_cache *ashmem_range_cachep __read_mostly; static struct kmem_cache *ashmem_range_cachep __read_mostly;
/*
* A separate lockdep class for the backing shmem inodes to resolve the lockdep
* warning about the race between kswapd taking fs_reclaim before inode_lock
* and write syscall taking inode_lock and then fs_reclaim.
* Note that such race is impossible because ashmem does not support write
* syscalls operating on the backing shmem.
*/
static struct lock_class_key backing_shmem_inode_class;
static inline unsigned long range_size(struct ashmem_range *range) static inline unsigned long range_size(struct ashmem_range *range)
{ {
return range->pgend - range->pgstart + 1; return range->pgend - range->pgstart + 1;
@@ -395,6 +404,7 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
if (!asma->file) { if (!asma->file) {
char *name = ASHMEM_NAME_DEF; char *name = ASHMEM_NAME_DEF;
struct file *vmfile; struct file *vmfile;
struct inode *inode;
if (asma->name[ASHMEM_NAME_PREFIX_LEN] != '\0') if (asma->name[ASHMEM_NAME_PREFIX_LEN] != '\0')
name = asma->name; name = asma->name;
@@ -406,6 +416,8 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
goto out; goto out;
} }
vmfile->f_mode |= FMODE_LSEEK; vmfile->f_mode |= FMODE_LSEEK;
inode = file_inode(vmfile);
lockdep_set_class(&inode->i_rwsem, &backing_shmem_inode_class);
asma->file = vmfile; asma->file = vmfile;
/* /*
* override mmap operation of the vmfile so that it can't be * override mmap operation of the vmfile so that it can't be

View File

@@ -47,7 +47,10 @@
#define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba
#define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb
#define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc
#define PCI_DEVICE_ID_ASMEDIA_1042_XHCI 0x1042
#define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142
#define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242
#define PCI_DEVICE_ID_ASMEDIA_2142_XHCI 0x2142
static const char hcd_name[] = "xhci_hcd"; static const char hcd_name[] = "xhci_hcd";
@@ -226,13 +229,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
xhci->quirks |= XHCI_BROKEN_STREAMS; xhci->quirks |= XHCI_BROKEN_STREAMS;
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
pdev->device == 0x1042) pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI)
xhci->quirks |= XHCI_BROKEN_STREAMS; xhci->quirks |= XHCI_BROKEN_STREAMS;
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
pdev->device == 0x1142) pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
xhci->quirks |= XHCI_TRUST_TX_LENGTH; xhci->quirks |= XHCI_TRUST_TX_LENGTH;
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
pdev->device == 0x2142) (pdev->device == PCI_DEVICE_ID_ASMEDIA_1142_XHCI ||
pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI))
xhci->quirks |= XHCI_NO_64BIT_SUPPORT; xhci->quirks |= XHCI_NO_64BIT_SUPPORT;
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&

View File

@@ -2,8 +2,9 @@
/* /*
* Native support for the I/O-Warrior USB devices * Native support for the I/O-Warrior USB devices
* *
* Copyright (c) 2003-2005 Code Mercenaries GmbH * Copyright (c) 2003-2005, 2020 Code Mercenaries GmbH
* written by Christian Lucht <lucht@codemercs.com> * written by Christian Lucht <lucht@codemercs.com> and
* Christoph Jung <jung@codemercs.com>
* *
* based on * based on
@@ -817,14 +818,28 @@ static int iowarrior_probe(struct usb_interface *interface,
/* we have to check the report_size often, so remember it in the endianness suitable for our machine */ /* we have to check the report_size often, so remember it in the endianness suitable for our machine */
dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint); dev->report_size = usb_endpoint_maxp(dev->int_in_endpoint);
if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) &&
((dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56) || /*
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW56AM) || * Some devices need the report size to be different than the
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28) || * endpoint size.
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW28L) || */
(dev->product_id == USB_DEVICE_ID_CODEMERCS_IOW100))) if (dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) {
/* IOWarrior56 has wMaxPacketSize different from report size */ switch (dev->product_id) {
dev->report_size = 7; case USB_DEVICE_ID_CODEMERCS_IOW56:
case USB_DEVICE_ID_CODEMERCS_IOW56AM:
dev->report_size = 7;
break;
case USB_DEVICE_ID_CODEMERCS_IOW28:
case USB_DEVICE_ID_CODEMERCS_IOW28L:
dev->report_size = 4;
break;
case USB_DEVICE_ID_CODEMERCS_IOW100:
dev->report_size = 13;
break;
}
}
/* create the urb and buffer for reading */ /* create the urb and buffer for reading */
dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL); dev->int_in_urb = usb_alloc_urb(0, GFP_KERNEL);

View File

@@ -155,6 +155,7 @@ static const struct usb_device_id id_table[] = {
{DEVICE_SWI(0x1199, 0x9056)}, /* Sierra Wireless Modem */ {DEVICE_SWI(0x1199, 0x9056)}, /* Sierra Wireless Modem */
{DEVICE_SWI(0x1199, 0x9060)}, /* Sierra Wireless Modem */ {DEVICE_SWI(0x1199, 0x9060)}, /* Sierra Wireless Modem */
{DEVICE_SWI(0x1199, 0x9061)}, /* Sierra Wireless Modem */ {DEVICE_SWI(0x1199, 0x9061)}, /* Sierra Wireless Modem */
{DEVICE_SWI(0x1199, 0x9062)}, /* Sierra Wireless EM7305 QDL */
{DEVICE_SWI(0x1199, 0x9063)}, /* Sierra Wireless EM7305 */ {DEVICE_SWI(0x1199, 0x9063)}, /* Sierra Wireless EM7305 */
{DEVICE_SWI(0x1199, 0x9070)}, /* Sierra Wireless MC74xx */ {DEVICE_SWI(0x1199, 0x9070)}, /* Sierra Wireless MC74xx */
{DEVICE_SWI(0x1199, 0x9071)}, /* Sierra Wireless MC74xx */ {DEVICE_SWI(0x1199, 0x9071)}, /* Sierra Wireless MC74xx */

View File

@@ -251,6 +251,10 @@ static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
p = (void *) (c->vc_origin + t * c->vc_size_row); p = (void *) (c->vc_origin + t * c->vc_size_row);
while (count--) { while (count--) {
if ((vgacon_scrollback_cur->tail + c->vc_size_row) >
vgacon_scrollback_cur->size)
vgacon_scrollback_cur->tail = 0;
scr_memcpyw(vgacon_scrollback_cur->data + scr_memcpyw(vgacon_scrollback_cur->data +
vgacon_scrollback_cur->tail, vgacon_scrollback_cur->tail,
p, c->vc_size_row); p, c->vc_size_row);

View File

@@ -844,7 +844,7 @@ static const struct dss_features omap34xx_dss_feats = {
}; };
static const struct dss_features omap3630_dss_feats = { static const struct dss_features omap3630_dss_feats = {
.fck_div_max = 32, .fck_div_max = 31,
.dss_fck_multiplier = 1, .dss_fck_multiplier = 1,
.parent_clk_name = "dpll4_ck", .parent_clk_name = "dpll4_ck",
.dpi_select_source = &dss_dpi_select_source_omap2_omap3, .dpi_select_source = &dss_dpi_select_source_omap2_omap3,

View File

@@ -203,10 +203,22 @@ int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
return error; return error;
} }
/**
* __vfs_setxattr_locked: set an extended attribute while holding the inode
* lock
*
* @dentry - object to perform setxattr on
* @name - xattr name to set
* @value - value to set @name to
* @size - size of @value
* @flags - flags to pass into filesystem operations
* @delegated_inode - on return, will contain an inode pointer that
* a delegation was broken on, NULL if none.
*/
int int
vfs_setxattr(struct dentry *dentry, const char *name, const void *value, __vfs_setxattr_locked(struct dentry *dentry, const char *name,
size_t size, int flags) const void *value, size_t size, int flags,
struct inode **delegated_inode)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
int error; int error;
@@ -215,15 +227,40 @@ vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
if (error) if (error)
return error; return error;
inode_lock(inode);
error = security_inode_setxattr(dentry, name, value, size, flags); error = security_inode_setxattr(dentry, name, value, size, flags);
if (error) if (error)
goto out; goto out;
error = try_break_deleg(inode, delegated_inode);
if (error)
goto out;
error = __vfs_setxattr_noperm(dentry, name, value, size, flags); error = __vfs_setxattr_noperm(dentry, name, value, size, flags);
out: out:
return error;
}
EXPORT_SYMBOL_GPL(__vfs_setxattr_locked);
int
vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
size_t size, int flags)
{
struct inode *inode = dentry->d_inode;
struct inode *delegated_inode = NULL;
int error;
retry_deleg:
inode_lock(inode);
error = __vfs_setxattr_locked(dentry, name, value, size, flags,
&delegated_inode);
inode_unlock(inode); inode_unlock(inode);
if (delegated_inode) {
error = break_deleg_wait(&delegated_inode);
if (!error)
goto retry_deleg;
}
return error; return error;
} }
EXPORT_SYMBOL_GPL(vfs_setxattr); EXPORT_SYMBOL_GPL(vfs_setxattr);
@@ -386,8 +423,18 @@ __vfs_removexattr(struct dentry *dentry, const char *name)
} }
EXPORT_SYMBOL(__vfs_removexattr); EXPORT_SYMBOL(__vfs_removexattr);
/**
* __vfs_removexattr_locked: set an extended attribute while holding the inode
* lock
*
* @dentry - object to perform setxattr on
* @name - name of xattr to remove
* @delegated_inode - on return, will contain an inode pointer that
* a delegation was broken on, NULL if none.
*/
int int
vfs_removexattr(struct dentry *dentry, const char *name) __vfs_removexattr_locked(struct dentry *dentry, const char *name,
struct inode **delegated_inode)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
int error; int error;
@@ -396,11 +443,14 @@ vfs_removexattr(struct dentry *dentry, const char *name)
if (error) if (error)
return error; return error;
inode_lock(inode);
error = security_inode_removexattr(dentry, name); error = security_inode_removexattr(dentry, name);
if (error) if (error)
goto out; goto out;
error = try_break_deleg(inode, delegated_inode);
if (error)
goto out;
error = __vfs_removexattr(dentry, name); error = __vfs_removexattr(dentry, name);
if (!error) { if (!error) {
@@ -409,12 +459,32 @@ vfs_removexattr(struct dentry *dentry, const char *name)
} }
out: out:
return error;
}
EXPORT_SYMBOL_GPL(__vfs_removexattr_locked);
int
vfs_removexattr(struct dentry *dentry, const char *name)
{
struct inode *inode = dentry->d_inode;
struct inode *delegated_inode = NULL;
int error;
retry_deleg:
inode_lock(inode);
error = __vfs_removexattr_locked(dentry, name, &delegated_inode);
inode_unlock(inode); inode_unlock(inode);
if (delegated_inode) {
error = break_deleg_wait(&delegated_inode);
if (!error)
goto retry_deleg;
}
return error; return error;
} }
EXPORT_SYMBOL_GPL(vfs_removexattr); EXPORT_SYMBOL_GPL(vfs_removexattr);
/* /*
* Extended attribute SET operations * Extended attribute SET operations
*/ */

View File

@@ -428,6 +428,8 @@ enum vmbus_channel_message_type {
CHANNELMSG_19 = 19, CHANNELMSG_19 = 19,
CHANNELMSG_20 = 20, CHANNELMSG_20 = 20,
CHANNELMSG_TL_CONNECT_REQUEST = 21, CHANNELMSG_TL_CONNECT_REQUEST = 21,
CHANNELMSG_22 = 22,
CHANNELMSG_TL_CONNECT_RESULT = 23,
CHANNELMSG_COUNT CHANNELMSG_COUNT
}; };

View File

@@ -54,8 +54,10 @@ ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t);
ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size); ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
int __vfs_setxattr(struct dentry *, struct inode *, const char *, const void *, size_t, int); int __vfs_setxattr(struct dentry *, struct inode *, const char *, const void *, size_t, int);
int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, int); int __vfs_setxattr_noperm(struct dentry *, const char *, const void *, size_t, int);
int __vfs_setxattr_locked(struct dentry *, const char *, const void *, size_t, int, struct inode **);
int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int); int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int);
int __vfs_removexattr(struct dentry *, const char *); int __vfs_removexattr(struct dentry *, const char *);
int __vfs_removexattr_locked(struct dentry *, const char *, struct inode **);
int vfs_removexattr(struct dentry *, const char *); int vfs_removexattr(struct dentry *, const char *);
ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size); ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);

View File

@@ -317,6 +317,7 @@ int ipv6_sock_ac_join(struct sock *sk, int ifindex,
const struct in6_addr *addr); const struct in6_addr *addr);
int ipv6_sock_ac_drop(struct sock *sk, int ifindex, int ipv6_sock_ac_drop(struct sock *sk, int ifindex,
const struct in6_addr *addr); const struct in6_addr *addr);
void __ipv6_sock_ac_close(struct sock *sk);
void ipv6_sock_ac_close(struct sock *sk); void ipv6_sock_ac_close(struct sock *sk);
int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr); int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr);

View File

@@ -831,20 +831,28 @@ static int p9_fd_open(struct p9_client *client, int rfd, int wfd)
return -ENOMEM; return -ENOMEM;
ts->rd = fget(rfd); ts->rd = fget(rfd);
if (!ts->rd)
goto out_free_ts;
if (!(ts->rd->f_mode & FMODE_READ))
goto out_put_rd;
ts->wr = fget(wfd); ts->wr = fget(wfd);
if (!ts->rd || !ts->wr) { if (!ts->wr)
if (ts->rd) goto out_put_rd;
fput(ts->rd); if (!(ts->wr->f_mode & FMODE_WRITE))
if (ts->wr) goto out_put_wr;
fput(ts->wr);
kfree(ts);
return -EIO;
}
client->trans = ts; client->trans = ts;
client->status = Connected; client->status = Connected;
return 0; return 0;
out_put_wr:
fput(ts->wr);
out_put_rd:
fput(ts->rd);
out_free_ts:
kfree(ts);
return -EIO;
} }
static int p9_socket_open(struct p9_client *client, struct socket *csocket) static int p9_socket_open(struct p9_client *client, struct socket *csocket)

View File

@@ -2360,7 +2360,7 @@ static void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
BT_DBG("%s num_rsp %d", hdev->name, num_rsp); BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
if (!num_rsp) if (!num_rsp || skb->len < num_rsp * sizeof(*info) + 1)
return; return;
if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))
@@ -3948,6 +3948,9 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
struct inquiry_info_with_rssi_and_pscan_mode *info; struct inquiry_info_with_rssi_and_pscan_mode *info;
info = (void *) (skb->data + 1); info = (void *) (skb->data + 1);
if (skb->len < num_rsp * sizeof(*info) + 1)
goto unlock;
for (; num_rsp; num_rsp--, info++) { for (; num_rsp; num_rsp--, info++) {
u32 flags; u32 flags;
@@ -3969,6 +3972,9 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
} else { } else {
struct inquiry_info_with_rssi *info = (void *) (skb->data + 1); struct inquiry_info_with_rssi *info = (void *) (skb->data + 1);
if (skb->len < num_rsp * sizeof(*info) + 1)
goto unlock;
for (; num_rsp; num_rsp--, info++) { for (; num_rsp; num_rsp--, info++) {
u32 flags; u32 flags;
@@ -3989,6 +3995,7 @@ static void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev,
} }
} }
unlock:
hci_dev_unlock(hdev); hci_dev_unlock(hdev);
} }
@@ -4151,7 +4158,7 @@ static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
BT_DBG("%s num_rsp %d", hdev->name, num_rsp); BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
if (!num_rsp) if (!num_rsp || skb->len < num_rsp * sizeof(*info) + 1)
return; return;
if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ)) if (hci_dev_test_flag(hdev, HCI_PERIODIC_INQ))

View File

@@ -1749,7 +1749,7 @@ struct fib_table *fib_trie_unmerge(struct fib_table *oldtb)
while ((l = leaf_walk_rcu(&tp, key)) != NULL) { while ((l = leaf_walk_rcu(&tp, key)) != NULL) {
struct key_vector *local_l = NULL, *local_tp; struct key_vector *local_l = NULL, *local_tp;
hlist_for_each_entry_rcu(fa, &l->leaf, fa_list) { hlist_for_each_entry(fa, &l->leaf, fa_list) {
struct fib_alias *new_fa; struct fib_alias *new_fa;
if (local_tb->tb_id != fa->tb_id) if (local_tb->tb_id != fa->tb_id)

View File

@@ -19,12 +19,12 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
netdev_features_t features) netdev_features_t features)
{ {
int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb); int tnl_hlen = skb_inner_mac_header(skb) - skb_transport_header(skb);
bool need_csum, need_recompute_csum, gso_partial;
struct sk_buff *segs = ERR_PTR(-EINVAL); struct sk_buff *segs = ERR_PTR(-EINVAL);
u16 mac_offset = skb->mac_header; u16 mac_offset = skb->mac_header;
__be16 protocol = skb->protocol; __be16 protocol = skb->protocol;
u16 mac_len = skb->mac_len; u16 mac_len = skb->mac_len;
int gre_offset, outer_hlen; int gre_offset, outer_hlen;
bool need_csum, gso_partial;
if (!skb->encapsulation) if (!skb->encapsulation)
goto out; goto out;
@@ -45,6 +45,7 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
skb->protocol = skb->inner_protocol; skb->protocol = skb->inner_protocol;
need_csum = !!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE_CSUM); need_csum = !!(skb_shinfo(skb)->gso_type & SKB_GSO_GRE_CSUM);
need_recompute_csum = skb->csum_not_inet;
skb->encap_hdr_csum = need_csum; skb->encap_hdr_csum = need_csum;
features &= skb->dev->hw_enc_features; features &= skb->dev->hw_enc_features;
@@ -102,7 +103,15 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
} }
*(pcsum + 1) = 0; *(pcsum + 1) = 0;
*pcsum = gso_make_checksum(skb, 0); if (need_recompute_csum && !skb_is_gso(skb)) {
__wsum csum;
csum = skb_checksum(skb, gre_offset,
skb->len - gre_offset, 0);
*pcsum = csum_fold(csum);
} else {
*pcsum = gso_make_checksum(skb, 0);
}
} while ((skb = skb->next)); } while ((skb = skb->next));
out: out:
return segs; return segs;

View File

@@ -173,7 +173,7 @@ int ipv6_sock_ac_drop(struct sock *sk, int ifindex, const struct in6_addr *addr)
return 0; return 0;
} }
void ipv6_sock_ac_close(struct sock *sk) void __ipv6_sock_ac_close(struct sock *sk)
{ {
struct ipv6_pinfo *np = inet6_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk);
struct net_device *dev = NULL; struct net_device *dev = NULL;
@@ -181,10 +181,7 @@ void ipv6_sock_ac_close(struct sock *sk)
struct net *net = sock_net(sk); struct net *net = sock_net(sk);
int prev_index; int prev_index;
if (!np->ipv6_ac_list) ASSERT_RTNL();
return;
rtnl_lock();
pac = np->ipv6_ac_list; pac = np->ipv6_ac_list;
np->ipv6_ac_list = NULL; np->ipv6_ac_list = NULL;
@@ -201,6 +198,16 @@ void ipv6_sock_ac_close(struct sock *sk)
sock_kfree_s(sk, pac, sizeof(*pac)); sock_kfree_s(sk, pac, sizeof(*pac));
pac = next; pac = next;
} }
}
void ipv6_sock_ac_close(struct sock *sk)
{
struct ipv6_pinfo *np = inet6_sk(sk);
if (!np->ipv6_ac_list)
return;
rtnl_lock();
__ipv6_sock_ac_close(sk);
rtnl_unlock(); rtnl_unlock();
} }

View File

@@ -207,6 +207,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
fl6_free_socklist(sk); fl6_free_socklist(sk);
__ipv6_sock_mc_close(sk); __ipv6_sock_mc_close(sk);
__ipv6_sock_ac_close(sk);
/* /*
* Sock is moving from IPv6 to IPv4 (sk_prot), so * Sock is moving from IPv6 to IPv4 (sk_prot), so

View File

@@ -283,10 +283,6 @@ void ovs_ct_fill_key(const struct sk_buff *skb, struct sw_flow_key *key)
ovs_ct_update_key(skb, NULL, key, false, false); ovs_ct_update_key(skb, NULL, key, false, false);
} }
#define IN6_ADDR_INITIALIZER(ADDR) \
{ (ADDR).s6_addr32[0], (ADDR).s6_addr32[1], \
(ADDR).s6_addr32[2], (ADDR).s6_addr32[3] }
int ovs_ct_put_key(const struct sw_flow_key *swkey, int ovs_ct_put_key(const struct sw_flow_key *swkey,
const struct sw_flow_key *output, struct sk_buff *skb) const struct sw_flow_key *output, struct sk_buff *skb)
{ {
@@ -308,24 +304,30 @@ int ovs_ct_put_key(const struct sw_flow_key *swkey,
if (swkey->ct_orig_proto) { if (swkey->ct_orig_proto) {
if (swkey->eth.type == htons(ETH_P_IP)) { if (swkey->eth.type == htons(ETH_P_IP)) {
struct ovs_key_ct_tuple_ipv4 orig = { struct ovs_key_ct_tuple_ipv4 orig;
output->ipv4.ct_orig.src,
output->ipv4.ct_orig.dst, memset(&orig, 0, sizeof(orig));
output->ct.orig_tp.src, orig.ipv4_src = output->ipv4.ct_orig.src;
output->ct.orig_tp.dst, orig.ipv4_dst = output->ipv4.ct_orig.dst;
output->ct_orig_proto, orig.src_port = output->ct.orig_tp.src;
}; orig.dst_port = output->ct.orig_tp.dst;
orig.ipv4_proto = output->ct_orig_proto;
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4, if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4,
sizeof(orig), &orig)) sizeof(orig), &orig))
return -EMSGSIZE; return -EMSGSIZE;
} else if (swkey->eth.type == htons(ETH_P_IPV6)) { } else if (swkey->eth.type == htons(ETH_P_IPV6)) {
struct ovs_key_ct_tuple_ipv6 orig = { struct ovs_key_ct_tuple_ipv6 orig;
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.src),
IN6_ADDR_INITIALIZER(output->ipv6.ct_orig.dst), memset(&orig, 0, sizeof(orig));
output->ct.orig_tp.src, memcpy(orig.ipv6_src, output->ipv6.ct_orig.src.s6_addr32,
output->ct.orig_tp.dst, sizeof(orig.ipv6_src));
output->ct_orig_proto, memcpy(orig.ipv6_dst, output->ipv6.ct_orig.dst.s6_addr32,
}; sizeof(orig.ipv6_dst));
orig.src_port = output->ct.orig_tp.src;
orig.dst_port = output->ct.orig_tp.dst;
orig.ipv6_proto = output->ct_orig_proto;
if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6, if (nla_put(skb, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV6,
sizeof(orig), &orig)) sizeof(orig), &orig))
return -EMSGSIZE; return -EMSGSIZE;

View File

@@ -290,7 +290,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
*/ */
ret = rxrpc_connect_call(rx, call, cp, srx, gfp); ret = rxrpc_connect_call(rx, call, cp, srx, gfp);
if (ret < 0) if (ret < 0)
goto error; goto error_attached_to_socket;
trace_rxrpc_call(call, rxrpc_call_connected, atomic_read(&call->usage), trace_rxrpc_call(call, rxrpc_call_connected, atomic_read(&call->usage),
here, NULL); here, NULL);
@@ -310,18 +310,29 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
error_dup_user_ID: error_dup_user_ID:
write_unlock(&rx->call_lock); write_unlock(&rx->call_lock);
release_sock(&rx->sk); release_sock(&rx->sk);
ret = -EEXIST;
error:
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR, __rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
RX_CALL_DEAD, ret); RX_CALL_DEAD, -EEXIST);
trace_rxrpc_call(call, rxrpc_call_error, atomic_read(&call->usage), trace_rxrpc_call(call, rxrpc_call_error, atomic_read(&call->usage),
here, ERR_PTR(ret)); here, ERR_PTR(-EEXIST));
rxrpc_release_call(rx, call); rxrpc_release_call(rx, call);
mutex_unlock(&call->user_mutex); mutex_unlock(&call->user_mutex);
rxrpc_put_call(call, rxrpc_call_put); rxrpc_put_call(call, rxrpc_call_put);
_leave(" = %d", ret); _leave(" = -EEXIST");
return ERR_PTR(ret); return ERR_PTR(-EEXIST);
/* We got an error, but the call is attached to the socket and is in
* need of release. However, we might now race with recvmsg() when
* completing the call queues it. Return 0 from sys_sendmsg() and
* leave the error to recvmsg() to deal with.
*/
error_attached_to_socket:
trace_rxrpc_call(call, rxrpc_call_error, atomic_read(&call->usage),
here, ERR_PTR(ret));
set_bit(RXRPC_CALL_DISCONNECTED, &call->flags);
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
RX_CALL_DEAD, ret);
_leave(" = c=%08x [err]", call->debug_id);
return call;
} }
/* /*

View File

@@ -215,9 +215,11 @@ void rxrpc_disconnect_call(struct rxrpc_call *call)
call->peer->cong_cwnd = call->cong_cwnd; call->peer->cong_cwnd = call->cong_cwnd;
spin_lock_bh(&conn->params.peer->lock); if (!hlist_unhashed(&call->error_link)) {
hlist_del_rcu(&call->error_link); spin_lock_bh(&call->peer->lock);
spin_unlock_bh(&conn->params.peer->lock); hlist_del_rcu(&call->error_link);
spin_unlock_bh(&call->peer->lock);
}
if (rxrpc_is_client_call(call)) if (rxrpc_is_client_call(call))
return rxrpc_disconnect_client_call(call); return rxrpc_disconnect_client_call(call);

View File

@@ -530,7 +530,7 @@ int rxrpc_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
goto error_unlock_call; goto error_unlock_call;
} }
if (msg->msg_name) { if (msg->msg_name && call->peer) {
struct sockaddr_rxrpc *srx = msg->msg_name; struct sockaddr_rxrpc *srx = msg->msg_name;
size_t len = sizeof(call->peer->srx); size_t len = sizeof(call->peer->srx);

View File

@@ -654,6 +654,9 @@ int rxrpc_do_sendmsg(struct rxrpc_sock *rx, struct msghdr *msg, size_t len)
if (IS_ERR(call)) if (IS_ERR(call))
return PTR_ERR(call); return PTR_ERR(call);
/* ... and we have the call lock. */ /* ... and we have the call lock. */
ret = 0;
if (READ_ONCE(call->state) == RXRPC_CALL_COMPLETE)
goto out_put_unlock;
} else { } else {
switch (READ_ONCE(call->state)) { switch (READ_ONCE(call->state)) {
case RXRPC_CALL_UNINITIALISED: case RXRPC_CALL_UNINITIALISED:

View File

@@ -12519,13 +12519,13 @@ static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
if (!wdev_running(wdev)) if (!wdev_running(wdev))
return -ENETDOWN; return -ENETDOWN;
} }
if (!vcmd->doit)
return -EOPNOTSUPP;
} else { } else {
wdev = NULL; wdev = NULL;
} }
if (!vcmd->doit)
return -EOPNOTSUPP;
if (info->attrs[NL80211_ATTR_VENDOR_DATA]) { if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]); data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]); len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);

View File

@@ -2746,7 +2746,6 @@ static int smk_open_relabel_self(struct inode *inode, struct file *file)
static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf, static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct task_smack *tsp = current_security();
char *data; char *data;
int rc; int rc;
LIST_HEAD(list_tmp); LIST_HEAD(list_tmp);
@@ -2771,11 +2770,21 @@ static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,
kfree(data); kfree(data);
if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) { if (!rc || (rc == -EINVAL && list_empty(&list_tmp))) {
struct cred *new;
struct task_smack *tsp;
new = prepare_creds();
if (!new) {
rc = -ENOMEM;
goto out;
}
tsp = new->security;
smk_destroy_label_list(&tsp->smk_relabel); smk_destroy_label_list(&tsp->smk_relabel);
list_splice(&list_tmp, &tsp->smk_relabel); list_splice(&list_tmp, &tsp->smk_relabel);
commit_creds(new);
return count; return count;
} }
out:
smk_destroy_label_list(&list_tmp); smk_destroy_label_list(&list_tmp);
return rc; return rc;
} }

View File

@@ -181,10 +181,16 @@ static long
odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{ {
struct seq_oss_devinfo *dp; struct seq_oss_devinfo *dp;
long rc;
dp = file->private_data; dp = file->private_data;
if (snd_BUG_ON(!dp)) if (snd_BUG_ON(!dp))
return -ENXIO; return -ENXIO;
return snd_seq_oss_ioctl(dp, cmd, arg);
mutex_lock(&register_mutex);
rc = snd_seq_oss_ioctl(dp, cmd, arg);
mutex_unlock(&register_mutex);
return rc;
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT

View File

@@ -2478,7 +2478,6 @@ static int azx_probe_continue(struct azx *chip)
if (azx_has_pm_runtime(chip)) { if (azx_has_pm_runtime(chip)) {
pm_runtime_use_autosuspend(&pci->dev); pm_runtime_use_autosuspend(&pci->dev);
pm_runtime_allow(&pci->dev);
pm_runtime_put_autosuspend(&pci->dev); pm_runtime_put_autosuspend(&pci->dev);
} }

View File

@@ -2766,6 +2766,7 @@ process_dynamic_array_len(struct event_format *event, struct print_arg *arg,
if (read_expected(EVENT_DELIM, ")") < 0) if (read_expected(EVENT_DELIM, ")") < 0)
goto out_err; goto out_err;
free_token(token);
type = read_token(&token); type = read_token(&token);
*tok = token; *tok = token;

View File

@@ -125,9 +125,8 @@ static int do_setcpu(int cpu)
CPU_ZERO(&mask); CPU_ZERO(&mask);
CPU_SET(cpu, &mask); CPU_SET(cpu, &mask);
if (sched_setaffinity(0, sizeof(mask), &mask)) if (sched_setaffinity(0, sizeof(mask), &mask))
error(1, 0, "setaffinity %d", cpu); fprintf(stderr, "cpu: unable to pin, may increase variance.\n");
else if (cfg_verbose)
if (cfg_verbose)
fprintf(stderr, "cpu: %u\n", cpu); fprintf(stderr, "cpu: %u\n", cpu);
return 0; return 0;