Linux 4.9.293
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.293 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 block/ioprio.c | 3 + drivers/android/binder.c | 21 +++---- drivers/ata/libata-core.c | 2 drivers/hid/Kconfig | 10 +-- drivers/hid/hid-chicony.c | 8 ++ drivers/hid/hid-corsair.c | 7 ++ drivers/hid/hid-elo.c | 3 + drivers/hid/hid-holtek-kbd.c | 9 ++- drivers/hid/hid-holtek-mouse.c | 9 +++ drivers/hid/hid-lg.c | 10 ++- drivers/hid/hid-prodikeys.c | 10 ++- drivers/hid/hid-roccat-arvo.c | 3 + drivers/hid/hid-roccat-isku.c | 3 + drivers/hid/hid-roccat-kone.c | 3 + drivers/hid/hid-roccat-koneplus.c | 3 + drivers/hid/hid-roccat-konepure.c | 3 + drivers/hid/hid-roccat-kovaplus.c | 3 + drivers/hid/hid-roccat-lua.c | 3 + drivers/hid/hid-roccat-pyra.c | 3 + drivers/hid/hid-roccat-ryos.c | 3 + drivers/hid/hid-roccat-savu.c | 3 + drivers/hid/hid-samsung.c | 3 + drivers/hid/hid-uclogic.c | 3 + drivers/hid/i2c-hid/i2c-hid-core.c | 3 - drivers/hid/uhid.c | 3 - drivers/hid/usbhid/hid-core.c | 3 - drivers/hid/wacom_sys.c | 17 ++++- drivers/iio/accel/kxcjk-1013.c | 5 - drivers/iio/accel/kxsd9.c | 6 +- drivers/iio/accel/mma8452.c | 2 drivers/iio/gyro/itg3200_buffer.c | 2 drivers/iio/light/ltr501.c | 2 drivers/iio/light/stk3310.c | 6 +- drivers/infiniband/hw/hfi1/init.c | 2 drivers/irqchip/irq-armada-370-xp.c | 16 ++--- drivers/irqchip/irq-gic-v3-its.c | 2 drivers/irqchip/irq-nvic.c | 2 drivers/net/can/pch_can.c | 2 drivers/net/can/sja1000/ems_pcmcia.c | 7 ++ drivers/net/ethernet/altera/altera_tse_main.c | 9 ++- drivers/net/ethernet/freescale/fec.h | 3 + drivers/net/ethernet/freescale/fec_main.c | 2 drivers/net/ethernet/qlogic/qla3xxx.c | 19 +++--- drivers/net/usb/cdc_ncm.c | 2 drivers/usb/core/config.c | 6 +- drivers/usb/gadget/composite.c | 14 ++++ drivers/usb/gadget/legacy/dbgp.c | 15 ++++- drivers/usb/gadget/legacy/inode.c | 16 +++++ fs/signalfd.c | 12 ---- fs/tracefs/inode.c | 76 ++++++++++++++++++++++++++ include/linux/hid.h | 16 +++++ include/linux/wait.h | 26 ++++++++ kernel/sched/wait.c | 8 ++ mm/backing-dev.c | 7 ++ net/bluetooth/hidp/core.c | 3 - net/core/neighbour.c | 2 net/nfc/netlink.c | 6 +- sound/core/control_compat.c | 3 + sound/core/oss/pcm_oss.c | 37 ++++++++---- 60 files changed, 383 insertions(+), 109 deletions(-)
Alan Young (1):
ALSA: ctl: Fix copy of updated id with element read/write
Dan Carpenter (3):
can: sja1000: fix use after free in ems_pcmcia_add_card()
net: altera: set a couple error code in probe() net/qla3xxx: fix an error code in ql_adapter_up()
Davidlohr Bueso (1):
block: fix ioprio_get(IOPRIO_WHO_PGRP) vs setuid(2)
Eric Biggers (3):
wait: add wake_up_pollfree()
binder: use wake_up_pollfree()
signalfd: use wake_up_pollfree()
Eric Dumazet (1):
net, neigh: clear whole pneigh_entry at alloc time
Greg Kroah-Hartman (9):
HID: add hid_is_usb() function to make it simpler for USB detection
HID: add USB_HID dependancy to hid-prodikeys
HID: add USB_HID dependancy to hid-chicony
HID: add USB_HID dependancy on some USB HID drivers
HID: wacom: fix problems when device is not a valid USB device
HID: check for valid USB device for many HID drivers
USB: gadget: detect too-big endpoint 0 requests
USB: gadget: zero allocate endpoint 0 buffers
Linux 4.9.293
Hannes Reinecke (1):
libata: add horkage for ASMedia 1092
Jason Gerecke (1):
HID: introduce hid_is_using_ll_driver
Joakim Zhang (1):
net: fec: only clear interrupt of handling queue in fec_enet_rx_queue()
Krzysztof Kozlowski (1):
nfc: fix potential NULL pointer deref in nfc_genl_dump_ses_done
Lars-Peter Clausen (5):
iio: stk3310: Don't return error code in interrupt handler
iio: mma8452: Fix trigger reference couting
iio: ltr501: Don't return error code in trigger handler
iio: kxsd9: Don't return error code in trigger handler
iio: itg3200: Call iio_trigger_notify_done() on error
Lee Jones (1):
net: cdc_ncm: Allow for dwNtbOutMaxSize to be unset or zero
Manjong Lee (1):
mm: bdi: initialize bdi_min_ratio when bdi is unregistered
Mike Marciniszyn (1):
IB/hfi1: Correct guard on eager buffer deallocation
Pali Rohár (2):
irqchip/armada-370-xp: Fix return value of armada_370_xp_msi_alloc() irqchip/armada-370-xp: Fix support for Multi-MSI interrupts
Pavel Hofman (2):
usb: core: config: fix validation of wMaxPacketValue entries
usb: core: config: using bit mask instead of individual bits
Steven Rostedt (VMware) (2):
tracefs: Have new files inherit the ownership of their parent
tracefs: Set all files to the same group ownership as the mount option
Takashi Iwai (3):
ALSA: pcm: oss: Fix negative period/buffer sizes
ALSA: pcm: oss: Limit the period size to 16MB
ALSA: pcm: oss: Handle missing errors in snd_pcm_oss_change_params*()
Vincent Mailhol (1):
can: pch_can: pch_can_rx_normal: fix use after free
Vladimir Murzin (1):
irqchip: nvic: Fix offset for Interrupt Priority Offsets
Wudi Wang (1):
irqchip/irq-gic-v3-its.c: Force synchronisation when issuing INVALL
Yang Yingliang (1):
iio: accel: kxcjk-1013: Fix possible memory leak in probe and remove
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 292 +SUBLEVEL = 293 EXTRAVERSION = NAME = Roaring Lionus
block/ioprio.c +3 -0
@@ -202,6 +202,7 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who) pgrp =task_pgrp (current); else pgrp =find_vpid (who); +read_lock (&tasklist_lock); do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { tmpio =get_task_ioprio (p);if (tmpio <0 )
@@ -211,6 +212,8 @@ SYSCALL_DEFINE2(ioprio_get, int, which, int, who)else ret =ioprio_best (ret, tmpio); }while_each_pid_thread (pgrp,PIDTYPE_PGID , p); +read_unlock (&tasklist_lock); +break ;case IOPRIO_WHO_USER : uid =make_kuid (current_user_ns (), who);
drivers/android/binder.c +9 -12
@@ -2641,21 +2641,18 @@ static int binder_free_thread(struct binder_proc *proc, }/* -* If this thread used poll, make sure we remove the waitqueue -* from any epoll data structures holding it with POLLFREE. -* waitqueue_active() is safe to use here because we're holding -* the global lock. +* If this thread used poll, make sure we remove the waitqueue from any +* poll data structures holding it. */ -if ((thread->looper &BINDER_LOOPER_STATE_POLL ) && -waitqueue_active (&thread->wait)) { -wake_up_poll (&thread->wait,POLLHUP |POLLFREE ); - } +if (thread->looper &BINDER_LOOPER_STATE_POLL ) +wake_up_pollfree (&thread->wait);/* -* This is needed to avoid races between wake_up_poll() above and -* and ep_remove_waitqueue() called for other reasons (eg the epoll file -* descriptor being closed); ep_remove_waitqueue() holds an RCU read -* lock, so we can be sure it's done after calling synchronize_rcu(). +* This is needed to avoid races between wake_up_pollfree() above and +* someone else removing the last entry from the queue for other reasons +* (e.g. ep_remove_wait_queue() being called due to an epoll file +* descriptor being closed). Such other users hold an RCU read lock, so +* we can be sure they're done after we call synchronize_rcu(). */ if (thread->looper &BINDER_LOOPER_STATE_POLL )synchronize_rcu ();
drivers/ata/libata-core.c +2 -0
@@ -4332,6 +4332,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { { "VRFDFC22048UCHC-TE*", NULL, ATA_HORKAGE_NODMA },/* Odd clown on sil3726/4726 PMPs */ { "Config Disk", NULL, ATA_HORKAGE_DISABLE }, +/* Similar story with ASMedia 1092 */ + { "ASMT109x- Config", NULL, ATA_HORKAGE_DISABLE },/* Weird ATAPI devices */ { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 },
drivers/hid/Kconfig +5 -5
@@ -176,14 +176,14 @@ config HID_CHERRY config HID_CHICONY tristate "Chicony devices" - depends on HID + depends on USB_HID default !EXPERT ---help--- Support for Chicony Tactical pad and special keys on Chicony keyboards. config HID_CORSAIR tristate "Corsair devices" - depends on HID && USB && LEDS_CLASS + depends on USB_HID && LEDS_CLASS ---help--- Support for Corsair devices that are not fully compliant with the HID standard.
@@ -194,7 +194,7 @@ config HID_CORSAIR config HID_PRODIKEYS tristate "Prodikeys PC-MIDI Keyboard support" - depends on HID && SND + depends on USB_HID && SND select SND_RAWMIDI ---help--- Support for Prodikeys PC-MIDI Keyboard device support.
@@ -421,7 +421,7 @@ config HID_LENOVO config HID_LOGITECH tristate "Logitech devices" - depends on HID + depends on USB_HID default !EXPERT ---help--- Support for Logitech devices that are not fully compliant with HID standard.
@@ -730,7 +730,7 @@ config HID_SAITEK config HID_SAMSUNG tristate "Samsung InfraRed remote control or keyboards" - depends on HID + depends on USB_HID ---help--- Support for Samsung InfraRed remote control or keyboards.
drivers/hid/hid-chicony.c +6 -2
@@ -61,8 +61,12 @@ static int ch_input_mapping(struct hid_device *hdev, struct hid_input *hi,static __u8 *ch_switch12_report_fixup (struct hid_device *hdev,__u8 *rdesc,unsigned int *rsize) { -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); - +struct usb_interface *intf; + +if (!hid_is_usb (hdev)) +return rdesc; + + intf =to_usb_interface (hdev->dev.parent);if (intf->cur_altsetting->desc.bInterfaceNumber ==1 ) {/* Change usage maximum and logical maximum from 0x7fff to * 0x2fff, so they don't exceed HID_MAX_USAGES */
drivers/hid/hid-corsair.c +6 -1
@@ -553,7 +553,12 @@ static int corsair_probe(struct hid_device *dev, const struct hid_device_id *id)int ret;unsigned long quirks = id->driver_data;struct corsair_drvdata *drvdata; -struct usb_interface *usbif =to_usb_interface (dev->dev.parent); +struct usb_interface *usbif; + +if (!hid_is_usb (dev)) +return -EINVAL ; + + usbif =to_usb_interface (dev->dev.parent); drvdata =devm_kzalloc (&dev->dev,sizeof (struct corsair_drvdata ),GFP_KERNEL );
drivers/hid/hid-elo.c +3 -0
@@ -230,6 +230,9 @@ static int elo_probe(struct hid_device *hdev, const struct hid_device_id *id)struct elo_priv *priv;int ret; +if (!hid_is_usb (hdev)) +return -EINVAL ; + priv =kzalloc (sizeof (*priv),GFP_KERNEL );if (!priv)return -ENOMEM ;
drivers/hid/hid-holtek-kbd.c +7 -2
@@ -143,12 +143,17 @@ static int holtek_kbd_input_event(struct input_dev *dev, unsigned int type,static int holtek_kbd_probe (struct hid_device *hdev,const struct hid_device_id *id) { -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); -int ret =hid_parse (hdev); +struct usb_interface *intf; +int ret; + +if (!hid_is_usb (hdev)) +return -EINVAL ; + ret =hid_parse (hdev);if (!ret) ret =hid_hw_start (hdev,HID_CONNECT_DEFAULT ); + intf =to_usb_interface (hdev->dev.parent);if (!ret && intf->cur_altsetting->desc.bInterfaceNumber ==1 ) {struct hid_input *hidinput;list_for_each_entry (hidinput, &hdev->inputs, list) {
drivers/hid/hid-holtek-mouse.c +9 -0
@@ -65,6 +65,14 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,return rdesc; } +static int holtek_mouse_probe (struct hid_device *hdev, +const struct hid_device_id *id) +{ +if (!hid_is_usb (hdev)) +return -EINVAL ; +return 0 ; +} +static const struct hid_device_id holtek_mouse_devices[] = { {HID_USB_DEVICE (USB_VENDOR_ID_HOLTEK_ALT ,USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067 ) },
@@ -86,6 +94,7 @@ static struct hid_driver holtek_mouse_driver = { .name = "holtek_mouse", .id_table = holtek_mouse_devices, .report_fixup = holtek_mouse_report_fixup, + .probe = holtek_mouse_probe, };module_hid_driver (holtek_mouse_driver);
drivers/hid/hid-lg.c +8 -2
@@ -714,12 +714,18 @@ static int lg_raw_event(struct hid_device *hdev, struct hid_report *report,static int lg_probe (struct hid_device *hdev,const struct hid_device_id *id) { -struct usb_interface *iface =to_usb_interface (hdev->dev.parent); -__u8 iface_num = iface->cur_altsetting->desc.bInterfaceNumber; +struct usb_interface *iface; +__u8 iface_num;unsigned int connect_mask =HID_CONNECT_DEFAULT ;struct lg_drv_data *drv_data;int ret; +if (!hid_is_usb (hdev)) +return -EINVAL ; + + iface =to_usb_interface (hdev->dev.parent); + iface_num = iface->cur_altsetting->desc.bInterfaceNumber; +/* G29 only work with the 1st interface */ if ((hdev->product ==USB_DEVICE_ID_LOGITECH_G29_WHEEL ) && (iface_num !=0 )) {
drivers/hid/hid-prodikeys.c +8 -2
@@ -803,12 +803,18 @@ static int pk_raw_event(struct hid_device *hdev, struct hid_report *report,static int pk_probe (struct hid_device *hdev,const struct hid_device_id *id) {int ret; -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); -unsigned short ifnum = intf->cur_altsetting->desc.bInterfaceNumber; +struct usb_interface *intf; +unsigned short ifnum;unsigned long quirks = id->driver_data;struct pk_device *pk;struct pcmidi_snd *pm =NULL ; +if (!hid_is_usb (hdev)) +return -EINVAL ; + + intf =to_usb_interface (hdev->dev.parent); + ifnum = intf->cur_altsetting->desc.bInterfaceNumber; + pk =kzalloc (sizeof (*pk),GFP_KERNEL );if (pk ==NULL ) {hid_err (hdev,"can't alloc descriptor\n" );
drivers/hid/hid-roccat-arvo.c +3 -0
@@ -347,6 +347,9 @@ static int arvo_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-isku.c +3 -0
@@ -327,6 +327,9 @@ static int isku_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-kone.c +3 -0
@@ -752,6 +752,9 @@ static int kone_probe(struct hid_device *hdev, const struct hid_device_id *id) {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-koneplus.c +3 -0
@@ -434,6 +434,9 @@ static int koneplus_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-konepure.c +3 -0
@@ -136,6 +136,9 @@ static int konepure_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-kovaplus.c +3 -0
@@ -504,6 +504,9 @@ static int kovaplus_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-lua.c +3 -0
@@ -163,6 +163,9 @@ static int lua_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-pyra.c +3 -0
@@ -452,6 +452,9 @@ static int pyra_probe(struct hid_device *hdev, const struct hid_device_id *id) {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-ryos.c +3 -0
@@ -144,6 +144,9 @@ static int ryos_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-roccat-savu.c +3 -0
@@ -116,6 +116,9 @@ static int savu_probe(struct hid_device *hdev, {int retval; +if (!hid_is_usb (hdev)) +return -EINVAL ; + retval =hid_parse (hdev);if (retval) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-samsung.c +3 -0
@@ -157,6 +157,9 @@ static int samsung_probe(struct hid_device *hdev,int ret;unsigned int cmask =HID_CONNECT_DEFAULT ; +if (!hid_is_usb (hdev)) +return -EINVAL ; + ret =hid_parse (hdev);if (ret) {hid_err (hdev,"parse failed\n" );
drivers/hid/hid-uclogic.c +3 -0
@@ -791,6 +791,9 @@ static int uclogic_tablet_enable(struct hid_device *hdev)__u8 *p;s32 v; +if (!hid_is_usb (hdev)) +return -EINVAL ; +/* * Read string descriptor containing tablet parameters. The specific * string descriptor and data were discovered by sniffing the Windows
drivers/hid/i2c-hid/i2c-hid-core.c +2 -1
@@ -875,7 +875,7 @@ static int i2c_hid_power(struct hid_device *hid, int lvl)return 0 ; } -static struct hid_ll_driver i2c_hid_ll_driver = { +struct hid_ll_driver i2c_hid_ll_driver = { .parse = i2c_hid_parse, .start = i2c_hid_start, .stop = i2c_hid_stop,
@@ -885,6 +885,7 @@ static struct hid_ll_driver i2c_hid_ll_driver = { .output_report = i2c_hid_output_report, .raw_request = i2c_hid_raw_request, }; +EXPORT_SYMBOL_GPL (i2c_hid_ll_driver);static int i2c_hid_init_irq (struct i2c_client *client) {
drivers/hid/uhid.c +2 -1
@@ -372,7 +372,7 @@ static int uhid_hid_output_report(struct hid_device *hid, __u8 *buf,return uhid_hid_output_raw (hid, buf, count,HID_OUTPUT_REPORT ); } -static struct hid_ll_driver uhid_hid_driver = { +struct hid_ll_driver uhid_hid_driver = { .start = uhid_hid_start, .stop = uhid_hid_stop, .open = uhid_hid_open,
@@ -381,6 +381,7 @@ static struct hid_ll_driver uhid_hid_driver = { .raw_request = uhid_hid_raw_request, .output_report = uhid_hid_output_report, }; +EXPORT_SYMBOL_GPL (uhid_hid_driver);#ifdef CONFIG_COMPAT
drivers/hid/usbhid/hid-core.c +2 -1
@@ -1272,7 +1272,7 @@ static int usbhid_idle(struct hid_device *hid, int report, int idle,return hid_set_idle (dev, ifnum, report, idle); } -static struct hid_ll_driver usb_hid_driver = { +struct hid_ll_driver usb_hid_driver = { .parse = usbhid_parse, .start = usbhid_start, .stop = usbhid_stop,
@@ -1285,6 +1285,7 @@ static struct hid_ll_driver usb_hid_driver = { .output_report = usbhid_output_report, .idle = usbhid_idle, }; +EXPORT_SYMBOL_GPL (usb_hid_driver);static int usbhid_probe (struct usb_interface *intf,const struct usb_device_id *id) {
drivers/hid/wacom_sys.c +12 -5
@@ -506,7 +506,7 @@ static void wacom_retrieve_hid_descriptor(struct hid_device *hdev,* Skip the query for this type and modify defaults based on * interface number. */ -if (features->type ==WIRELESS ) { +if (features->type ==WIRELESS && intf) {if (intf->cur_altsetting->desc.bInterfaceNumber ==0 ) features->device_type =WACOM_DEVICETYPE_WL_MONITOR ;else
@@ -2115,6 +2115,9 @@ static void wacom_wireless_work(struct work_struct *work)wacom_destroy_battery (wacom); +if (!usbdev) +return ; +/* Stylus interface */ hdev1 =usb_get_intfdata (usbdev->config->interface[1 ]); wacom1 =hid_get_drvdata (hdev1);
@@ -2354,8 +2357,6 @@ static void wacom_remote_work(struct work_struct *work)static int wacom_probe (struct hid_device *hdev,const struct hid_device_id *id) { -struct usb_interface *intf =to_usb_interface (hdev->dev.parent); -struct usb_device *dev =interface_to_usbdev (intf);struct wacom *wacom;struct wacom_wac *wacom_wac;struct wacom_features *features;
@@ -2388,8 +2389,14 @@ static int wacom_probe(struct hid_device *hdev, wacom_wac->hid_data.inputmode =-1 ; wacom_wac->mode_report =-1 ; - wacom->usbdev = dev; - wacom->intf = intf; +if (hid_is_usb (hdev)) { +struct usb_interface *intf =to_usb_interface (hdev->dev.parent); +struct usb_device *dev =interface_to_usbdev (intf); + + wacom->usbdev = dev; + wacom->intf = intf; + } +mutex_init (&wacom->lock);INIT_WORK (&wacom->wireless_work, wacom_wireless_work);INIT_WORK (&wacom->battery_work, wacom_battery_work);
drivers/iio/accel/kxcjk-1013.c +2 -3
@@ -1290,8 +1290,7 @@ static int kxcjk1013_probe(struct i2c_client *client,return 0 ; err_buffer_cleanup: -if (data->dready_trig) -iio_triggered_buffer_cleanup (indio_dev); +iio_triggered_buffer_cleanup (indio_dev); err_trigger_unregister:if (data->dready_trig)iio_trigger_unregister (data->dready_trig);
@@ -1314,8 +1313,8 @@ static int kxcjk1013_remove(struct i2c_client *client)pm_runtime_set_suspended (&client->dev);pm_runtime_put_noidle (&client->dev); +iio_triggered_buffer_cleanup (indio_dev);if (data->dready_trig) { -iio_triggered_buffer_cleanup (indio_dev);iio_trigger_unregister (data->dready_trig);iio_trigger_unregister (data->motion_trig); }
drivers/iio/accel/kxsd9.c +3 -3
@@ -227,14 +227,14 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p) hw_values.chan, sizeof(hw_values.chan));if (ret) { -dev_err (st->dev, -"error reading data\n" ); -return ret; +dev_err (st->dev,"error reading data: %d\n" , ret); + goto out; }iio_push_to_buffers_with_timestamp (indio_dev, &hw_values,iio_get_time_ns (indio_dev)); +out:iio_trigger_notify_done (indio_dev->trig);return IRQ_HANDLED ;
drivers/iio/accel/mma8452.c +1 -1
@@ -1389,7 +1389,7 @@ static int mma8452_trigger_setup(struct iio_dev *indio_dev)if (ret)return ret; - indio_dev->trig = trig; + indio_dev->trig =iio_trigger_get (trig);return 0 ; }
drivers/iio/gyro/itg3200_buffer.c +1 -1
@@ -64,9 +64,9 @@ static irqreturn_t itg3200_trigger_handler(int irq, void *p)iio_push_to_buffers_with_timestamp (indio_dev, &scan, pf->timestamp); +error_ret:iio_trigger_notify_done (indio_dev->trig); -error_ret:return IRQ_HANDLED ; }
drivers/iio/light/ltr501.c +1 -1
@@ -1248,7 +1248,7 @@ static irqreturn_t ltr501_trigger_handler(int irq, void *p) ret =regmap_bulk_read (data->regmap,LTR501_ALS_DATA1 , (u8 *)als_buf,sizeof (als_buf));if (ret <0 ) -return ret; + goto done;if (test_bit (0 , indio_dev->active_scan_mask)) scan.channels[j++] =le16_to_cpu (als_buf[1 ]);if (test_bit (1 , indio_dev->active_scan_mask))
drivers/iio/light/stk3310.c +3 -3
@@ -546,9 +546,8 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private)mutex_lock (&data->lock); ret =regmap_field_read (data->reg_flag_nf, &dir);if (ret <0 ) { -dev_err (&data->client->dev,"register read failed\n" ); -mutex_unlock (&data->lock); -return ret; +dev_err (&data->client->dev,"register read failed: %d\n" , ret); + goto out; } event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1, IIO_EV_TYPE_THRESH,
@@ -560,6 +559,7 @@ static irqreturn_t stk3310_irq_event_handler(int irq, void *private) ret =regmap_field_write (data->reg_flag_psint,0 );if (ret <0 )dev_err (&data->client->dev,"failed to reset interrupts\n" ); +out:mutex_unlock (&data->lock);return IRQ_HANDLED ;
drivers/infiniband/hw/hfi1/init.c +1 -1
@@ -955,7 +955,7 @@ void hfi1_free_ctxtdata(struct hfi1_devdata *dd, struct hfi1_ctxtdata *rcd)kfree (rcd->egrbufs.rcvtids);for (e =0 ; e < rcd->egrbufs.alloced; e++) { -if (rcd->egrbufs.buffers[e].dma) +if (rcd->egrbufs.buffers[e].addr) dma_free_coherent(&dd->pcidev->dev, rcd->egrbufs.buffers[e].len, rcd->egrbufs.buffers[e].addr,
drivers/irqchip/irq-armada-370-xp.c +6 -10
@@ -153,16 +153,12 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq,int hwirq, i;mutex_lock (&msi_used_lock); + hwirq =bitmap_find_free_region (msi_used,PCI_MSI_DOORBELL_NR , +order_base_2 (nr_irqs)); +mutex_unlock (&msi_used_lock); - hwirq =bitmap_find_next_zero_area (msi_used,PCI_MSI_DOORBELL_NR , -0 , nr_irqs,0 ); -if (hwirq >=PCI_MSI_DOORBELL_NR ) { -mutex_unlock (&msi_used_lock); +if (hwirq <0 )return -ENOSPC ; - } - -bitmap_set (msi_used, hwirq, nr_irqs); -mutex_unlock (&msi_used_lock);for (i =0 ; i < nr_irqs; i++) { irq_domain_set_info(domain, virq + i, hwirq + i,
@@ -171,7 +167,7 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq, NULL, NULL); } -return hwirq; +return 0 ; } static void armada_370_xp_msi_free(struct irq_domain *domain,
@@ -180,7 +176,7 @@ static void armada_370_xp_msi_free(struct irq_domain *domain,struct irq_data *d =irq_domain_get_irq_data (domain, virq);mutex_lock (&msi_used_lock); -bitmap_clear (msi_used, d->hwirq, nr_irqs); +bitmap_release_region (msi_used, d->hwirq,order_base_2 (nr_irqs));mutex_unlock (&msi_used_lock); }
drivers/irqchip/irq-gic-v3-its.c +1 -1
@@ -369,7 +369,7 @@ static struct its_collection *its_build_invall_cmd(struct its_cmd_block *cmd,its_fixup_cmd (cmd); -return NULL ; +return desc->its_invall_cmd.col; } static u64 its_cmd_ptr_to_offset(struct its_node *its,
drivers/irqchip/irq-nvic.c +1 -1
@@ -29,7 +29,7 @@#define NVIC_ISER 0x000#define NVIC_ICER 0x080 -#define NVIC_IPR 0x300 +#define NVIC_IPR 0x400#define NVIC_MAX_BANKS 16/*
drivers/net/can/pch_can.c +1 -1
@@ -703,11 +703,11 @@ static int pch_can_rx_normal(struct net_device *ndev, u32 obj_num, int quota) cf->data[i +1 ] = data_reg >>8 ; } -netif_receive_skb (skb); rcv_pkts++; stats->rx_packets++; quota--; stats->rx_bytes += cf->can_dlc; +netif_receive_skb (skb);pch_fifo_thresh (priv, obj_num); obj_num++;
drivers/net/can/sja1000/ems_pcmcia.c +6 -1
@@ -243,7 +243,12 @@ static int ems_pcmcia_add_card(struct pcmcia_device *pdev, unsigned long base)free_sja1000dev (dev); } - err =request_irq (dev->irq, &ems_pcmcia_interrupt,IRQF_SHARED , +if (!card->channels) { + err = -ENODEV ; + goto failure_cleanup; + } + + err =request_irq (pdev->irq, &ems_pcmcia_interrupt,IRQF_SHARED ,DRV_NAME , card);if (!err)return 0 ;
drivers/net/ethernet/altera/altera_tse_main.c +6 -3
@@ -1361,16 +1361,19 @@ static int altera_tse_probe(struct platform_device *pdev) priv->rxdescmem_busaddr = dma_res->start; }else { + ret = -ENODEV ; goto err_free_netdev; } -if (!dma_set_mask (priv->device,DMA_BIT_MASK (priv->dmaops->dmamask))) +if (!dma_set_mask (priv->device,DMA_BIT_MASK (priv->dmaops->dmamask))) {dma_set_coherent_mask (priv->device,DMA_BIT_MASK (priv->dmaops->dmamask)); -else if (!dma_set_mask (priv->device,DMA_BIT_MASK (32 ))) + }else if (!dma_set_mask (priv->device,DMA_BIT_MASK (32 ))) {dma_set_coherent_mask (priv->device,DMA_BIT_MASK (32 )); -else + }else { + ret = -EIO ; goto err_free_netdev; + }/* MAC address space */ ret = request_and_map(pdev, "control_port", &control_port,
drivers/net/ethernet/freescale/fec.h +3 -0
@@ -371,6 +371,9 @@ struct bufdesc_ex {#define FEC_ENET_WAKEUP ((uint)0x00020000)/* Wakeup request */ #define FEC_ENET_TXF (FEC_ENET_TXF_0 | FEC_ENET_TXF_1 | FEC_ENET_TXF_2)#define FEC_ENET_RXF (FEC_ENET_RXF_0 | FEC_ENET_RXF_1 | FEC_ENET_RXF_2) +#define FEC_ENET_RXF_GET (X ) (((X) == 0) ? FEC_ENET_RXF_0 : \ + (((X) == 1) ? FEC_ENET_RXF_1 : \ + FEC_ENET_RXF_2))#define FEC_ENET_TS_AVAIL ((uint)0x00010000)#define FEC_ENET_TS_TIMER ((uint)0x00008000)
drivers/net/ethernet/freescale/fec_main.c +1 -1
@@ -1380,7 +1380,7 @@ fec_enet_rx_queue(struct net_device *ndev, int budget, u16 queue_id)break ; pkt_received++; -writel (FEC_ENET_RXF , fep->hwp +FEC_IEVENT ); +writel (FEC_ENET_RXF_GET (queue_id), fep->hwp +FEC_IEVENT );/* Check for errors. */ status ^=BD_ENET_RX_LAST ;
drivers/net/ethernet/qlogic/qla3xxx.c +9 -10
@@ -3491,20 +3491,19 @@ static int ql_adapter_up(struct ql3_adapter *qdev)spin_lock_irqsave (&qdev->hw_lock, hw_flags); - err =ql_wait_for_drvr_lock (qdev); -if (err) { - err =ql_adapter_initialize (qdev); -if (err) { -netdev_err (ndev,"Unable to initialize adapter\n" ); - goto err_init; - } -netdev_err (ndev,"Releasing driver lock\n" ); -ql_sem_unlock (qdev,QL_DRVR_SEM_MASK ); - }else { +if (!ql_wait_for_drvr_lock (qdev)) {netdev_err (ndev,"Could not acquire driver lock\n" ); + err = -ENODEV ; goto err_lock; } + err =ql_adapter_initialize (qdev); +if (err) { +netdev_err (ndev,"Unable to initialize adapter\n" ); + goto err_init; + } +ql_sem_unlock (qdev,QL_DRVR_SEM_MASK ); +spin_unlock_irqrestore (&qdev->hw_lock, hw_flags);set_bit (QL_ADAPTER_UP , &qdev->flags);
drivers/net/usb/cdc_ncm.c +2 -0
@@ -175,6 +175,8 @@ static u32 cdc_ncm_check_tx_max(struct usbnet *dev, u32 new_tx)/* clamp new_tx to sane values */ min = ctx->max_datagram_size + ctx->max_ndp_size +sizeof (struct usb_cdc_ncm_nth16 ); max =min_t (u32,CDC_NCM_NTB_MAX_SIZE_TX ,le32_to_cpu (ctx->ncm_parm.dwNtbOutMaxSize)); +if (max ==0 ) + max =CDC_NCM_NTB_MAX_SIZE_TX ;/* dwNtbOutMaxSize not set */ /* some devices set dwNtbOutMaxSize too low for the above default */ min =min (min, max);
drivers/usb/core/config.c +3 -3
@@ -404,7 +404,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno,* the USB-2 spec requires such endpoints to have wMaxPacketSize = 0 * (see the end of section 5.6.3), so don't warn about them. */ - maxp =usb_endpoint_maxp (&endpoint->desc); + maxp =le16_to_cpu (endpoint->desc.wMaxPacketSize);if (maxp ==0 && !(usb_endpoint_xfer_isoc (d) && asnum ==0 )) {dev_warn (ddev,"config %d interface %d altsetting %d endpoint 0x%X has invalid wMaxPacketSize 0\n" , cfgno, inum, asnum, d->bEndpointAddress);
@@ -420,9 +420,9 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, maxpacket_maxes = full_speed_maxpacket_maxes;break ;case USB_SPEED_HIGH : -/* Bits 12..11 are allowed only for HS periodic endpoints */ +/* Multiple-transactions bits are allowed only for HS periodic endpoints */ if (usb_endpoint_xfer_int (d) ||usb_endpoint_xfer_isoc (d)) { - i = maxp & (BIT (12 ) |BIT (11 )); + i = maxp &USB_EP_MAXP_MULT_MASK ; maxp &= ~i; }/* fallthrough */
drivers/usb/gadget/composite.c +13 -1
@@ -1631,6 +1631,18 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)struct usb_function *f =NULL ;u8 endp; +if (w_length >USB_COMP_EP0_BUFSIZ ) { +if (ctrl->bRequestType ==USB_DIR_OUT ) { + goto done; + }else { +/* Cast away the const, we are going to overwrite on purpose. */ +__le16 *temp = (__le16 *)&ctrl->wLength; + + *temp =cpu_to_le16 (USB_COMP_EP0_BUFSIZ ); + w_length =USB_COMP_EP0_BUFSIZ ; + } + } +/* partial re-init of the response message; the function or the * gadget might need to intercept e.g. a control-OUT completion * when we delegate to it.
@@ -2171,7 +2183,7 @@ int composite_dev_prepare(struct usb_composite_driver *composite,if (!cdev->req)return -ENOMEM ; - cdev->req->buf =kmalloc (USB_COMP_EP0_BUFSIZ ,GFP_KERNEL ); + cdev->req->buf =kzalloc (USB_COMP_EP0_BUFSIZ ,GFP_KERNEL );if (!cdev->req->buf) goto fail;
drivers/usb/gadget/legacy/dbgp.c +14 -1
@@ -136,7 +136,7 @@ static int dbgp_enable_ep_req(struct usb_ep *ep) goto fail_1; } - req->buf =kmalloc (DBGP_REQ_LEN ,GFP_KERNEL ); + req->buf =kzalloc (DBGP_REQ_LEN ,GFP_KERNEL );if (!req->buf) { err = -ENOMEM ; stp =2 ;
@@ -344,6 +344,19 @@ static int dbgp_setup(struct usb_gadget *gadget,void *data =NULL ;u16 len =0 ; +if (length >DBGP_REQ_LEN ) { +if (ctrl->bRequestType ==USB_DIR_OUT ) { +return err; + }else { +/* Cast away the const, we are going to overwrite on purpose. */ +__le16 *temp = (__le16 *)&ctrl->wLength; + + *temp =cpu_to_le16 (DBGP_REQ_LEN ); + length =DBGP_REQ_LEN ; + } + } + +if (request ==USB_REQ_GET_DESCRIPTOR ) {switch (value>>8 ) {case USB_DT_DEVICE :
drivers/usb/gadget/legacy/inode.c +15 -1
@@ -113,6 +113,8 @@ enum ep0_state {/* enough for the whole queue: most events invalidate others */ #define N_EVENT 5 +#define RBUF_SIZE 256 +struct dev_data {spinlock_t lock;atomic_t count;
@@ -147,7 +149,7 @@ struct dev_data {struct dentry *dentry;/* except this scratch i/o buffer for ep0 */ -u8 rbuf [256 ]; +u8 rbuf[RBUF_SIZE ]; };static inline void get_dev (struct dev_data *data)
@@ -1336,6 +1338,18 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)u16 w_value =le16_to_cpu (ctrl->wValue);u16 w_length =le16_to_cpu (ctrl->wLength); +if (w_length >RBUF_SIZE ) { +if (ctrl->bRequestType ==USB_DIR_OUT ) { +return value; + }else { +/* Cast away the const, we are going to overwrite on purpose. */ +__le16 *temp = (__le16 *)&ctrl->wLength; + + *temp =cpu_to_le16 (RBUF_SIZE ); + w_length =RBUF_SIZE ; + } + } +spin_lock (&dev->lock); dev->setup_abort =0 ;if (dev->state ==STATE_DEV_UNCONNECTED ) {
fs/signalfd.c +1 -11
@@ -34,17 +34,7 @@void signalfd_cleanup (struct sighand_struct *sighand) { -wait_queue_head_t *wqh = &sighand->signalfd_wqh; -/* -* The lockless check can race with remove_wait_queue() in progress, -* but in this case its caller should run under rcu_read_lock() and -* sighand_cachep is SLAB_DESTROY_BY_RCU, we can safely return. -*/ -if (likely (!waitqueue_active (wqh))) -return ; - -/* wait_queue_t->func(POLLFREE) should do remove_wait_queue() */ -wake_up_poll (wqh,POLLHUP |POLLFREE ); +wake_up_pollfree (&sighand->signalfd_wqh); }struct signalfd_ctx {
fs/tracefs/inode.c +76 -0
100 lines not on this page · raw message
include/linux/hid.h +16 -0
@@ -762,6 +762,22 @@ struct hid_ll_driver {int (*idle)(struct hid_device *hdev,int report,int idle,int reqtype); }; +extern struct hid_ll_driver i2c_hid_ll_driver; +extern struct hid_ll_driver hidp_hid_driver; +extern struct hid_ll_driver uhid_hid_driver; +extern struct hid_ll_driver usb_hid_driver; + +static inline bool hid_is_using_ll_driver (struct hid_device *hdev, +struct hid_ll_driver *driver) +{ +return hdev->ll_driver == driver; +} + +static inline bool hid_is_usb (struct hid_device *hdev) +{ +return hid_is_using_ll_driver (hdev, &usb_hid_driver); +} +#define PM_HINT_FULLON 1<<5#define PM_HINT_NORMAL 1<<1
include/linux/wait.h +26 -0
@@ -202,6 +202,7 @@ void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, void *key);void __wake_up_sync_key (wait_queue_head_t *q,unsigned int mode,int nr,void *key);void __wake_up_locked (wait_queue_head_t *q,unsigned int mode,int nr);void __wake_up_sync (wait_queue_head_t *q,unsigned int mode,int nr); +void __wake_up_pollfree (wait_queue_head_t *wq_head);void __wake_up_bit (wait_queue_head_t *,void *,int );int __wait_on_bit (wait_queue_head_t *,struct wait_bit_queue *,wait_bit_action_f *,unsigned );int __wait_on_bit_lock (wait_queue_head_t *,struct wait_bit_queue *,wait_bit_action_f *,unsigned );
@@ -236,6 +237,31 @@ wait_queue_head_t *bit_waitqueue(void *, int);#define wake_up_interruptible_sync_poll (x, m) \ __wake_up_sync_key((x), TASK_INTERRUPTIBLE, 1, (void *) (m)) +/** +* wake_up_pollfree - signal that a polled waitqueue is going away +* @wq_head: the wait queue head +* +* In the very rare cases where a ->poll() implementation uses a waitqueue whose +* lifetime is tied to a task rather than to the 'struct file' being polled, +* this function must be called before the waitqueue is freed so that +* non-blocking polls (e.g. epoll) are notified that the queue is going away. +* +* The caller must also RCU-delay the freeing of the wait_queue_head, e.g. via +* an explicit synchronize_rcu() or call_rcu(), or via SLAB_DESTROY_BY_RCU. +*/ +static inline void wake_up_pollfree (wait_queue_head_t *wq_head) +{ +/* +* For performance reasons, we don't always take the queue lock here. +* Therefore, we might race with someone removing the last entry from +* the queue, and proceed while they still hold the queue lock. +* However, rcu_read_lock() is required to be held in such cases, so we +* can safely proceed with an RCU-delayed free. +*/ +if (waitqueue_active (wq_head)) +__wake_up_pollfree (wq_head); +} +#define ___wait_cond_timeout (condition) \ ({ \ bool __cond = (condition); \
kernel/sched/wait.c +8 -0
@@ -10,6 +10,7 @@#include <linux/wait.h> #include <linux/hash.h> #include <linux/kthread.h> +#include <linux/poll.h> void __init_waitqueue_head (wait_queue_head_t *q,const char *name,struct lock_class_key *key) {
@@ -156,6 +157,13 @@ void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr_exclusive) }EXPORT_SYMBOL_GPL (__wake_up_sync);/* For internal use only */ +void __wake_up_pollfree (wait_queue_head_t *wq_head) +{ +__wake_up (wq_head,TASK_NORMAL ,0 , (void *)(POLLHUP |POLLFREE )); +/* POLLFREE must have cleared the queue. */ +WARN_ON_ONCE (waitqueue_active (wq_head)); +} +/* * Note: we use "set_current_state()" _after_ the wait-queue add, * because we need a memory barrier there on SMP, so that any
mm/backing-dev.c +7 -0
@@ -865,6 +865,13 @@ void bdi_unregister(struct backing_dev_info *bdi)wb_shutdown (&bdi->wb);cgwb_bdi_destroy (bdi); +/* +* If this BDI's min ratio has been set, use bdi_set_min_ratio() to +* update the global bdi_min_ratio. +*/ +if (bdi->min_ratio) +bdi_set_min_ratio (bdi,0 ); +if (bdi->dev) {bdi_debug_unregister (bdi);device_unregister (bdi->dev);
net/bluetooth/hidp/core.c +2 -1
@@ -734,7 +734,7 @@ static void hidp_stop(struct hid_device *hid) hid->claimed =0 ; } -static struct hid_ll_driver hidp_hid_driver = { +struct hid_ll_driver hidp_hid_driver = { .parse = hidp_parse, .start = hidp_start, .stop = hidp_stop,
@@ -743,6 +743,7 @@ static struct hid_ll_driver hidp_hid_driver = { .raw_request = hidp_raw_request, .output_report = hidp_output_report, }; +EXPORT_SYMBOL_GPL (hidp_hid_driver);/* This function sets up the hid device. It does not add it to the HID system. That is done in hidp_add_connection(). */
net/core/neighbour.c +1 -1
@@ -597,7 +597,7 @@ struct pneigh_entry * pneigh_lookup(struct neigh_table *tbl,ASSERT_RTNL (); - n =kmalloc (sizeof (*n) + key_len,GFP_KERNEL ); + n =kzalloc (sizeof (*n) + key_len,GFP_KERNEL );if (!n) goto out;
net/nfc/netlink.c +4 -2
@@ -1403,8 +1403,10 @@ static int nfc_genl_dump_ses_done(struct netlink_callback *cb) {struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0 ]; -nfc_device_iter_exit (iter); -kfree (iter); +if (iter) { +nfc_device_iter_exit (iter); +kfree (iter); + }return 0 ; }
sound/core/control_compat.c +3 -0
@@ -281,6 +281,7 @@ static int copy_ctl_value_to_user(void __user *userdata,struct snd_ctl_elem_value *data, int type, int count) { + struct snd_ctl_elem_value32 __user *data32 = userdata;int i, size; if (type == SNDRV_CTL_ELEM_TYPE_BOOLEAN ||
@@ -297,6 +298,8 @@ static int copy_ctl_value_to_user(void __user *userdata,if (copy_to_user (valuep, data->value.bytes.data, size))return -EFAULT ; } +if (copy_to_user (&data32->id, &data->id,sizeof (data32->id))) +return -EFAULT ;return 0 ; }
sound/core/oss/pcm_oss.c +25 -12
@@ -173,7 +173,7 @@ snd_pcm_hw_param_value_min(const struct snd_pcm_hw_params *params,* * Return the maximum value for field PAR. */ -static unsigned int +static int snd_pcm_hw_param_value_max (const struct snd_pcm_hw_params *params,snd_pcm_hw_param_t var,int *dir) {
@@ -708,18 +708,24 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream,struct snd_pcm_hw_params *oss_params, struct snd_pcm_hw_params *slave_params) { - size_t s; -size_t oss_buffer_size, oss_period_size, oss_periods; -size_t min_period_size, max_period_size; + ssize_t s; +ssize_t oss_buffer_size; +ssize_t oss_period_size, oss_periods; +ssize_t min_period_size, max_period_size;struct snd_pcm_runtime *runtime = substream->runtime;size_t oss_frame_size; oss_frame_size =snd_pcm_format_physical_width (params_format (oss_params)) *params_channels (oss_params) /8 ; + oss_buffer_size =snd_pcm_hw_param_value_max (slave_params, +SNDRV_PCM_HW_PARAM_BUFFER_SIZE , +NULL ); +if (oss_buffer_size <=0 ) +return -EINVAL ; oss_buffer_size =snd_pcm_plug_client_size (substream, -snd_pcm_hw_param_value_max (slave_params,SNDRV_PCM_HW_PARAM_BUFFER_SIZE ,NULL )) * oss_frame_size; -if (!oss_buffer_size) + oss_buffer_size * oss_frame_size); +if (oss_buffer_size <=0 )return -EINVAL ; oss_buffer_size =rounddown_pow_of_two (oss_buffer_size);if (atomic_read (&substream->mmap_count)) {
@@ -756,7 +762,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, min_period_size =snd_pcm_plug_client_size (substream,snd_pcm_hw_param_value_min (slave_params,SNDRV_PCM_HW_PARAM_PERIOD_SIZE ,NULL )); -if (min_period_size) { +if (min_period_size >0 ) { min_period_size *= oss_frame_size; min_period_size =roundup_pow_of_two (min_period_size);if (oss_period_size < min_period_size)
@@ -765,7 +771,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, max_period_size =snd_pcm_plug_client_size (substream,snd_pcm_hw_param_value_max (slave_params,SNDRV_PCM_HW_PARAM_PERIOD_SIZE ,NULL )); -if (max_period_size) { +if (max_period_size >0 ) { max_period_size *= oss_frame_size; max_period_size =rounddown_pow_of_two (max_period_size);if (oss_period_size > max_period_size)
@@ -778,7 +784,7 @@ static int snd_pcm_oss_period_size(struct snd_pcm_substream *substream, oss_periods = substream->oss.setup.periods; s =snd_pcm_hw_param_value_max (slave_params,SNDRV_PCM_HW_PARAM_PERIODS ,NULL ); -if (runtime->oss.maxfrags && s > runtime->oss.maxfrags) +if (s >0 && runtime->oss.maxfrags && s > runtime->oss.maxfrags) s = runtime->oss.maxfrags;if (oss_periods > s) oss_periods = s;
@@ -904,8 +910,15 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) err = -EINVAL ; goto failure; } -choose_rate (substream, sparams, runtime->oss.rate); -snd_pcm_hw_param_near (substream, sparams,SNDRV_PCM_HW_PARAM_CHANNELS , runtime->oss.channels,NULL ); + + err =choose_rate (substream, sparams, runtime->oss.rate); +if (err <0 ) + goto failure; + err =snd_pcm_hw_param_near (substream, sparams, +SNDRV_PCM_HW_PARAM_CHANNELS , + runtime->oss.channels,NULL ); +if (err <0 ) + goto failure; format =snd_pcm_oss_format_from (runtime->oss.format);
@@ -2013,7 +2026,7 @@ static int snd_pcm_oss_set_fragment1(struct snd_pcm_substream *substream, unsignif (runtime->oss.subdivision || runtime->oss.fragshift)return -EINVAL ; fragshift = val &0xffff ; -if (fragshift >=31 ) +if (fragshift >=25 )/* should be large enough */ return -EINVAL ; runtime->oss.fragshift = fragshift; runtime->oss.maxfrags = (val >>16 ) &0xffff ;