Linux 4.9.305
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.305 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 arch/arm/mm/mmu.c | 2 drivers/ata/pata_hpt37x.c | 4 - drivers/dma/sh/shdma-base.c | 4 + drivers/firmware/efi/vars.c | 5 + drivers/firmware/qemu_fw_cfg.c | 10 +-- drivers/hid/hid-debug.c | 4 + drivers/hid/hid-input.c | 2 drivers/i2c/busses/Kconfig | 2 drivers/i2c/busses/i2c-bcm2835.c | 11 +++ drivers/input/input.c | 6 ++ drivers/input/mouse/elan_i2c_core.c | 64 +++++++--------------- drivers/net/arcnet/com20020-pci.c | 3 + drivers/net/can/usb/gs_usb.c | 10 +-- drivers/net/ethernet/chelsio/cxgb3/t3_hw.c | 2 drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c | 6 +- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 6 +- drivers/net/hamradio/mkiss.c | 2 drivers/net/usb/cdc_mbim.c | 5 + drivers/net/wireless/mac80211_hwsim.c | 13 ++++ drivers/soc/fsl/qe/qe_io.c | 2 drivers/usb/gadget/legacy/inode.c | 10 ++- fs/cifs/cifsfs.c | 1 include/net/netfilter/nf_queue.h | 2 include/uapi/linux/input-event-codes.h | 3 - mm/shmem.c | 7 +- net/dcb/dcbnl.c | 44 +++++++++++++++ net/ipv6/ip6_output.c | 11 ++- net/mac80211/rx.c | 4 - net/netfilter/nf_queue.c | 23 ++++++- net/netfilter/nfnetlink_queue.c | 12 +++- sound/soc/soc-ops.c | 4 - 32 files changed, 200 insertions(+), 86 deletions(-)
Benjamin Beichler (1):
mac80211_hwsim: report NOACK frames in tx_status
Daniele Palmas (1):
net: usb: cdc_mbim: avoid altsetting toggling for Telit FN990
Eric Anholt (1):
i2c: bcm2835: Avoid clock stretching timeouts
Florian Westphal (2):
netfilter: nf_queue: don't assume sk is full socket
netfilter: nf_queue: fix possible use-after-free
Greg Kroah-Hartman (1):
Linux 4.9.305
Hangyu Hua (2):
usb: gadget: don't release an existing dev->buf
usb: gadget: clear related members when goto fail
Hans de Goede (2):
Input: elan_i2c - move regulator_[en|dis]able() out of elan_[en|dis]able_power()
Input: elan_i2c - fix regulator enable count imbalance after suspend/resume
Huang Pei (1):
hamradio: fix macro redefine warning
Hugh Dickins (1):
memfd: fix F_SEAL_WRITE after shmem huge page allocated
JaeMan Park (1):
mac80211_hwsim: initialize ieee80211_tx_info at hw_scan_work
Jann Horn (1):
efivars: Respect "block" flag in efivar_entry_set_safe()
Jia-Ju Bai (1):
net: chelsio: cxgb3: check the return value of pci_find_capability()
Jiasheng Jiang (1):
soc: fsl: qe: Check of ioremap return value
Jiri Bohac (1):
xfrm: fix MTU regression
Johan Hovold (1):
firmware: qemu_fw_cfg: fix kobject leak in probe error path
José Expósito (1):
Input: clear BTN_RIGHT/MIDDLE on buttonpads
Marek Vasut (1):
ASoC: ops: Shift tested values in snd_soc_put_volsw() by +min
Nicolas Escande (1):
mac80211: fix forwarded mesh frames AC & queue selection
Qiushi Wu (1):
firmware: Fix a reference count leak.
Randy Dunlap (3):
net: stmmac: fix return value of __setup handler
net: sxgbe: fix return value of __setup handler
ARM: 9182/1: mmu: fix returns from early_param() and __setup() functions
Ronnie Sahlberg (1):
cifs: fix double free race when mount fails in cifs_get_root()
Sergey Shtylyov (1):
ata: pata_hpt37x: fix PCI clock detection
Vincent Mailhol (1):
can: gs_usb: change active_channels's type from atomic_t to u8
Vladimir Oltean (2):
net: dcb: flush lingering app table entries for unregistered devices
net: dcb: disable softirqs in dcbnl_flush_dev()
William Mahon (1):
HID: add mapping for KEY_ALL_APPLICATIONS
Wolfram Sang (1):
i2c: qup: allow COMPILE_TEST
Yongzhi Liu (1):
dmaengine: shdma: Fix runtime PM imbalance on error
Zheyu Ma (1):
net: arcnet: com20020: Fix null-ptr-deref in com20020pci_probe()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 304 +SUBLEVEL = 305 EXTRAVERSION = NAME = Roaring Lionus
arch/arm/mm/mmu.c +2 -0
@@ -228,12 +228,14 @@ early_param("ecc", early_ecc);static int __init early_cachepolicy (char *p) {pr_warn ("cachepolicy kernel parameter not supported without cp15\n" ); +return 0 ; }early_param ("cachepolicy" , early_cachepolicy);static int __init noalign_setup (char *__unused) {pr_warn ("noalign kernel parameter not supported without cp15\n" ); +return 1 ; }__setup ("noalign" , noalign_setup);
drivers/ata/pata_hpt37x.c +2 -2
@@ -964,14 +964,14 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)if ((freq >>12 ) !=0xABCDE ) {int i; -u8 sr; +u16 sr;u32 total =0 ;pr_warn ("BIOS has not set timing clocks\n" );/* This is the process the HPT371 BIOS is reported to use */ for (i =0 ; i <128 ; i++) { -pci_read_config_byte (dev,0x78 , &sr); +pci_read_config_word (dev,0x78 , &sr); total += sr &0x1FF ;udelay (15 ); }
drivers/dma/sh/shdma-base.c +3 -1
@@ -118,8 +118,10 @@ static dma_cookie_t shdma_tx_submit(struct dma_async_tx_descriptor *tx) ret =pm_runtime_get (schan->dev);spin_unlock_irq (&schan->chan_lock); -if (ret <0 ) +if (ret <0 ) {dev_err (schan->dev,"%s(): GET = %d\n" , __func__, ret); +pm_runtime_put (schan->dev); + }pm_runtime_barrier (schan->dev);
drivers/firmware/efi/vars.c +4 -1
@@ -763,6 +763,7 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes, {const struct efivar_operations *ops;efi_status_t status; +unsigned long varsize;if (!__efivars)return -EINVAL ;
@@ -785,15 +786,17 @@ int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,return efivar_entry_set_nonblocking (name, vendor, attributes, size, data); + varsize = size +ucs2_strsize (name,1024 );if (!block) {if (down_trylock (&efivars_lock))return -EBUSY ; + status =check_var_size_nonblocking (attributes, varsize); }else {if (down_interruptible (&efivars_lock))return -EINTR ; + status =check_var_size (attributes, varsize); } - status =check_var_size (attributes, size +ucs2_strsize (name,1024 ));if (status !=EFI_SUCCESS ) {up (&efivars_lock);return -ENOSPC ;
drivers/firmware/qemu_fw_cfg.c +5 -5
@@ -462,12 +462,12 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f) err =kobject_init_and_add (&entry->kobj, &fw_cfg_sysfs_entry_ktype, fw_cfg_sel_ko,"%d" , entry->f.select);if (err) - goto err_register; + goto err_put_entry;/* add raw binary content access */ err =sysfs_create_bin_file (&entry->kobj, &fw_cfg_sysfs_attr_raw);if (err) - goto err_add_raw; + goto err_del_entry;/* try adding "/sys/firmware/qemu_fw_cfg/by_name/" symlink */ fw_cfg_build_symlink (fw_cfg_fname_kset, &entry->kobj, entry->f.name);
@@ -476,10 +476,10 @@ static int fw_cfg_register_file(const struct fw_cfg_file *f)fw_cfg_sysfs_cache_enlist (entry);return 0 ; -err_add_raw: +err_del_entry:kobject_del (&entry->kobj); -err_register: -kfree (entry); +err_put_entry: +kobject_put (&entry->kobj);return err; }
drivers/hid/hid-debug.c +3 -1
@@ -833,7 +833,9 @@ static const char *keys[KEY_MAX + 1] = { [KEY_F22] = "F22", [KEY_F23] = "F23", [KEY_F24] = "F24", [KEY_PLAYCD] = "PlayCD", [KEY_PAUSECD] = "PauseCD", [KEY_PROG3] = "Prog3", - [KEY_PROG4] = "Prog4", [KEY_SUSPEND] = "Suspend", + [KEY_PROG4] = "Prog4", + [KEY_ALL_APPLICATIONS] = "AllApplications", + [KEY_SUSPEND] = "Suspend", [KEY_CLOSE] = "Close", [KEY_PLAY] = "Play", [KEY_FASTFORWARD] = "FastForward", [KEY_BASSBOOST] = "BassBoost", [KEY_PRINT] = "Print", [KEY_HP] = "HP",
drivers/hid/hid-input.c +2 -0
@@ -937,6 +937,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x28b :map_key_clear (KEY_FORWARDMAIL );break ;case 0x28c :map_key_clear (KEY_SEND );break ; +case 0x2a2 :map_key_clear (KEY_ALL_APPLICATIONS );break ; +case 0x2c7 :map_key_clear (KEY_KBDINPUTASSIST_PREV );break ;case 0x2c8 :map_key_clear (KEY_KBDINPUTASSIST_NEXT );break ;case 0x2c9 :map_key_clear (KEY_KBDINPUTASSIST_PREVGROUP );break ;
drivers/i2c/busses/Kconfig +1 -1
@@ -783,7 +783,7 @@ config I2C_PXA_SLAVE config I2C_QUP tristate "Qualcomm QUP based I2C controller" - depends on ARCH_QCOM + depends on ARCH_QCOM || COMPILE_TEST help If you say yes to this option, support will be included for the built-in I2C interface on the Qualcomm SoCs.
drivers/i2c/busses/i2c-bcm2835.c +11 -0
@@ -28,6 +28,11 @@#define BCM2835_I2C_FIFO 0x10#define BCM2835_I2C_DIV 0x14#define BCM2835_I2C_DEL 0x18 +/* +* 16-bit field for the number of SCL cycles to wait after rising SCL +* before deciding the slave is not responding. 0 disables the +* timeout detection. +*/ #define BCM2835_I2C_CLKT 0x1c#define BCM2835_I2C_C_READ BIT(0)
@@ -313,6 +318,12 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) adap->dev.of_node = pdev->dev.of_node; adap->quirks = &bcm2835_i2c_quirks; +/* +* Disable the hardware clock stretching timeout. SMBUS +* specifies a limit for how long the device can stretch the +* clock, but core I2C doesn't. +*/ +bcm2835_i2c_writel (i2c_dev,BCM2835_I2C_CLKT ,0 );bcm2835_i2c_writel (i2c_dev,BCM2835_I2C_C ,0 ); ret =i2c_add_adapter (adap);
drivers/input/input.c +6 -0
@@ -2112,6 +2112,12 @@ int input_register_device(struct input_dev *dev)/* KEY_RESERVED is not supposed to be transmitted to userspace. */ __clear_bit (KEY_RESERVED , dev->keybit); +/* Buttonpads should not map BTN_RIGHT and/or BTN_MIDDLE. */ +if (test_bit (INPUT_PROP_BUTTONPAD , dev->propbit)) { +__clear_bit (BTN_RIGHT , dev->keybit); +__clear_bit (BTN_MIDDLE , dev->keybit); + } +/* Make sure that bitmasks not mentioned in dev->evbit are clean. */ input_cleanse_bitmasks (dev);
drivers/input/mouse/elan_i2c_core.c +23 -41
99 lines not on this page · raw message
drivers/net/arcnet/com20020-pci.c +3 -0
@@ -115,6 +115,9 @@ static int com20020pci_probe(struct pci_dev *pdev,return -ENOMEM ; ci = (struct com20020_pci_card_info *)id->driver_data; +if (!ci) +return -EINVAL ; + priv->ci = ci; mm = &ci->misc_map;
drivers/net/can/usb/gs_usb.c +5 -5
@@ -198,8 +198,8 @@ struct gs_can {struct gs_usb {struct gs_can *canch[GS_MAX_INTF ];struct usb_anchor rx_submitted; -atomic_t active_channels;struct usb_device *udev; +u8 active_channels; };/* 'allocate' a tx context.
@@ -597,7 +597,7 @@ static int gs_can_open(struct net_device *netdev)if (rc)return rc; -if (atomic_add_return (1 , &parent->active_channels) ==1 ) { +if (!parent->active_channels) {for (i =0 ; i <GS_MAX_RX_URBS ; i++) {struct urb *urb;u8 *buf;
@@ -698,6 +698,7 @@ static int gs_can_open(struct net_device *netdev) dev->can.state =CAN_STATE_ERROR_ACTIVE ; + parent->active_channels++;if (!(dev->can.ctrlmode &CAN_CTRLMODE_LISTENONLY ))netif_start_queue (netdev);
@@ -713,7 +714,8 @@ static int gs_can_close(struct net_device *netdev)netif_stop_queue (netdev);/* Stop polling */ -if (atomic_dec_and_test (&parent->active_channels)) + parent->active_channels--; +if (!parent->active_channels)usb_kill_anchored_urbs (&parent->rx_submitted);/* Stop sending URBs */
@@ -992,8 +994,6 @@ static int gs_usb_probe(struct usb_interface *intf,init_usb_anchor (&dev->rx_submitted); -atomic_set (&dev->active_channels,0 ); -usb_set_intfdata (intf, dev); dev->udev =interface_to_usbdev (intf);
drivers/net/ethernet/chelsio/cxgb3/t3_hw.c +2 -0
@@ -3677,6 +3677,8 @@ int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai, MAC_STATS_ACCUM_SECS : (MAC_STATS_ACCUM_SECS *10 ); adapter->params.pci.vpd_cap_addr =pci_find_capability (adapter->pdev,PCI_CAP_ID_VPD ); +if (!adapter->params.pci.vpd_cap_addr) +return -ENODEV ; ret =get_vpd_params (adapter, &adapter->params.vpd);if (ret <0 )return ret;
drivers/net/ethernet/samsung/sxgbe/sxgbe_main.c +3 -3
@@ -2311,18 +2311,18 @@ static int __init sxgbe_cmdline_opt(char *str)char *opt;if (!str || !*str) -return -EINVAL ; +return 1 ;while ((opt =strsep (&str,"," )) !=NULL ) {if (!strncmp (opt,"eee_timer:" ,10 )) {if (kstrtoint (opt +10 ,0 , &eee_timer)) goto err; } } -return 0 ; +return 1 ; err:pr_err ("%s: ERROR broken module parameter conversion\n" , __func__); -return -EINVAL ; +return 1 ; }__setup ("sxgbeeth=" , sxgbe_cmdline_opt);
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +3 -3
@@ -3608,7 +3608,7 @@ static int __init stmmac_cmdline_opt(char *str)char *opt;if (!str || !*str) -return -EINVAL ; +return 1 ;while ((opt =strsep (&str,"," )) !=NULL ) {if (!strncmp (opt,"debug:" ,6 )) {if (kstrtoint (opt +6 ,0 , &debug))
@@ -3639,11 +3639,11 @@ static int __init stmmac_cmdline_opt(char *str) goto err; } } -return 0 ; +return 1 ; err:pr_err ("%s: ERROR broken module parameter conversion" , __func__); -return -EINVAL ; +return 1 ; }__setup ("stmmaceth=" , stmmac_cmdline_opt);
drivers/net/hamradio/mkiss.c +2 -0
@@ -41,6 +41,8 @@#define AX_MTU 236 +/* some arch define END as assembly function ending, just undef it */ +#undef END/* SLIP/KISS protocol characters. */ #define END 0300/* indicates end of frame */ #define ESC 0333/* indicates byte stuffing */
drivers/net/usb/cdc_mbim.c +5 -0
@@ -652,6 +652,11 @@ static const struct usb_device_id mbim_devs[] = { .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle, }, +/* Telit FN990 */ + { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1071, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), + .driver_info = (unsigned long )&cdc_mbim_info_avoid_altsetting_toggle, + }, + /* default entry */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), .driver_info = (unsigned long)&cdc_mbim_info_zlp,
drivers/net/wireless/mac80211_hwsim.c +13 -0
@@ -1987,6 +1987,15 @@ static void hw_scan_work(struct work_struct *work)memcpy (skb_put (probe, req->ie_len), req->ie, req->ie_len); +if (!ieee80211_tx_prepare_skb (hwsim->hw, + hwsim->hw_scan_vif, + probe, + hwsim->tmp_chan->band, +NULL )) { +kfree_skb (probe); +continue ; + } +local_bh_disable ();mac80211_hwsim_tx_frame (hwsim->hw, probe, hwsim->tmp_chan);
@@ -2919,6 +2928,10 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2, } txi->flags |=IEEE80211_TX_STAT_ACK ; } + +if (hwsim_flags &HWSIM_TX_CTL_NO_ACK ) + txi->flags |=IEEE80211_TX_STAT_NOACK_TRANSMITTED ; +ieee80211_tx_status_irqsafe (data2->hw, skb);return 0 ; out:
drivers/soc/fsl/qe/qe_io.c +2 -0
@@ -41,6 +41,8 @@ int par_io_init(struct device_node *np)if (ret)return ret; par_io =ioremap (res.start,resource_size (&res)); +if (!par_io) +return -ENOMEM ; num_ports =of_get_property (np,"num-ports" ,NULL );if (num_ports)
drivers/usb/gadget/legacy/inode.c +7 -3
@@ -1833,8 +1833,9 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)spin_lock_irq (&dev->lock); value = -EINVAL ;if (dev->buf) { +spin_unlock_irq (&dev->lock);kfree (kbuf); - goto fail; +return value; } dev->buf = kbuf;
@@ -1882,8 +1883,8 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) value =usb_gadget_probe_driver (&gadgetfs_driver);if (value !=0 ) { -kfree (dev->buf); - dev->buf =NULL ; +spin_lock_irq (&dev->lock); + goto fail; }else {/* at this point "good" hardware has for the first time * let the USB the host see us. alternatively, if users
@@ -1900,6 +1901,9 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr)return value; fail: + dev->config =NULL ; + dev->hs_config =NULL ; + dev->dev =NULL ;spin_unlock_irq (&dev->lock);pr_debug ("%s: %s fail %Zd, %p\n" , shortname, __func__, value, dev);kfree (dev->buf);
fs/cifs/cifsfs.c +1 -0
@@ -746,6 +746,7 @@ cifs_do_mount(struct file_system_type *fs_type, out_super:deactivate_locked_super (sb); +return root; out:cifs_cleanup_volume_info (volume_info);return root;
include/net/netfilter/nf_queue.h +1 -1
@@ -31,7 +31,7 @@ void nf_register_queue_handler(struct net *net, const struct nf_queue_handler *qvoid nf_unregister_queue_handler (struct net *net);void nf_reinject (struct nf_queue_entry *entry,unsigned int verdict); -void nf_queue_entry_get_refs (struct nf_queue_entry *entry); +bool nf_queue_entry_get_refs (struct nf_queue_entry *entry);void nf_queue_entry_release_refs (struct nf_queue_entry *entry);static inline void init_hashrandom (u32 *jhash_initval)
include/uapi/linux/input-event-codes.h +2 -1
@@ -277,7 +277,8 @@#define KEY_PAUSECD 201#define KEY_PROG3 202#define KEY_PROG4 203 -#define KEY_DASHBOARD 204/* AL Dashboard */ +#define KEY_ALL_APPLICATIONS 204/* AC Desktop Show All Applications */ +#define KEY_DASHBOARD KEY_ALL_APPLICATIONS#define KEY_SUSPEND 205#define KEY_CLOSE 206/* AC Close */ #define KEY_PLAY 207
mm/shmem.c +4 -3
@@ -2478,7 +2478,8 @@ static void shmem_tag_pins(struct address_space *mapping) slot =radix_tree_iter_retry (&iter);continue ; } - }else if (page_count (page) -page_mapcount (page) >1 ) { + }else if (!PageTail (page) &&page_count (page) != +hpage_nr_pages (page) +total_mapcount (page)) {radix_tree_tag_set (&mapping->page_tree, iter.index,SHMEM_TAG_PINNED ); }
@@ -2538,8 +2539,8 @@ static int shmem_wait_for_pins(struct address_space *mapping) page =NULL ; } -if (page && -page_count (page) -page_mapcount (page) !=1 ) { +if (page &&page_count (page) != +hpage_nr_pages (page) +total_mapcount (page)) {if (scan <LAST_SCAN ) goto continue_resched;
net/dcb/dcbnl.c +44 -0
54 lines not on this page · raw message
net/ipv6/ip6_output.c +7 -4
@@ -1274,8 +1274,6 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork,if (np->frag_size) mtu = np->frag_size; } -if (mtu <IPV6_MIN_MTU ) -return -EINVAL ; cork->base.fragsize = mtu;if (dst_allfrag (rt->dst.path)) cork->base.flags |=IPCORK_ALLFRAG ;
@@ -1324,8 +1322,6 @@ static int __ip6_append_data(struct sock *sk, fragheaderlen =sizeof (struct ipv6hdr ) + rt->rt6i_nfheader_len + (opt ? opt->opt_nflen :0 ); - maxfraglen = ((mtu - fragheaderlen) & ~7 ) + fragheaderlen - -sizeof (struct frag_hdr ); headersize =sizeof (struct ipv6hdr ) + (opt ? opt->opt_flen + opt->opt_nflen : 0) +
@@ -1333,6 +1329,13 @@ static int __ip6_append_data(struct sock *sk, sizeof(struct frag_hdr) : 0) + rt->rt6i_nfheader_len; +if (mtu < fragheaderlen || + ((mtu - fragheaderlen) & ~7 ) + fragheaderlen <sizeof (struct frag_hdr )) + goto emsgsize; + + maxfraglen = ((mtu - fragheaderlen) & ~7 ) + fragheaderlen - +sizeof (struct frag_hdr ); +/* as per RFC 7112 section 5, the entire IPv6 Header Chain must fit * the first fragment */
net/mac80211/rx.c +2 -2
@@ -2607,13 +2607,13 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) ether_addr_equal(sdata->vif.addr, hdr->addr3))return RX_CONTINUE ; - ac =ieee80211_select_queue_80211 (sdata, skb, hdr); + ac = ieee802_1d_to_ac[skb->priority]; q = sdata->vif.hw_queue[ac];if (ieee80211_queue_stopped (&local->hw, q)) {IEEE80211_IFSTA_MESH_CTR_INC (ifmsh, dropped_frames_congestion);return RX_DROP_MONITOR ; } -skb_set_queue_mapping (skb, q); +skb_set_queue_mapping (skb, ac);if (!--mesh_hdr->ttl) {if (!is_multicast_ether_addr (hdr->addr1))
net/netfilter/nf_queue.c +20 -3
@@ -44,6 +44,15 @@ void nf_unregister_queue_handler(struct net *net) }EXPORT_SYMBOL (nf_unregister_queue_handler); +static void nf_queue_sock_put (struct sock *sk) +{ +#ifdef CONFIG_INET +sock_gen_put (sk); +#else +sock_put (sk); +#endif +} +void nf_queue_entry_release_refs (struct nf_queue_entry *entry) {struct nf_hook_state *state = &entry->state;
@@ -54,7 +63,7 @@ void nf_queue_entry_release_refs(struct nf_queue_entry *entry)if (state->out)dev_put (state->out);if (state->sk) -sock_put (state->sk); +nf_queue_sock_put (state->sk);#if IS_ENABLED (CONFIG_BRIDGE_NETFILTER )if (entry->skb->nf_bridge) {struct net_device *physdev;
@@ -71,10 +80,13 @@ void nf_queue_entry_release_refs(struct nf_queue_entry *entry)EXPORT_SYMBOL_GPL (nf_queue_entry_release_refs);/* Bump dev refs so they don't vanish while packet is out */ -void nf_queue_entry_get_refs (struct nf_queue_entry *entry) +bool nf_queue_entry_get_refs (struct nf_queue_entry *entry) {struct nf_hook_state *state = &entry->state; +if (state->sk && !atomic_inc_not_zero (&state->sk->sk_refcnt)) +return false; +if (state->in)dev_hold (state->in);if (state->out)
@@ -93,6 +105,7 @@ void nf_queue_entry_get_refs(struct nf_queue_entry *entry) dev_hold(physdev); }#endif +return true; }EXPORT_SYMBOL_GPL (nf_queue_entry_get_refs);
@@ -139,7 +152,11 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state, .size = sizeof(*entry) + afinfo->route_key_size, }; -nf_queue_entry_get_refs (entry); +if (!nf_queue_entry_get_refs (entry)) { +kfree (entry); +return -ENOTCONN ; + } +skb_dst_force (skb); afinfo->saveroute (skb, entry); status = qh->outfn (entry, queuenum);
net/netfilter/nfnetlink_queue.c +9 -3
@@ -673,9 +673,15 @@ static struct nf_queue_entry * nf_queue_entry_dup(struct nf_queue_entry *e) {struct nf_queue_entry *entry =kmemdup (e, e->size,GFP_ATOMIC ); -if (entry) -nf_queue_entry_get_refs (entry); -return entry; + +if (!entry) +return NULL ; + +if (nf_queue_entry_get_refs (entry)) +return entry; + +kfree (entry); +return NULL ; }#if IS_ENABLED (CONFIG_BRIDGE_NETFILTER )
sound/soc/soc-ops.c +2 -2
@@ -328,7 +328,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, mask =BIT (sign_bit +1 ) -1 ; val = ucontrol->value.integer.value[0 ]; -if (mc->platform_max && val > mc->platform_max) +if (mc->platform_max && ((int )val + min) > mc->platform_max)return -EINVAL ;if (val > max - min)return -EINVAL ;
@@ -341,7 +341,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, val = val << shift;if (snd_soc_volsw_is_stereo (mc)) { val2 = ucontrol->value.integer.value[1 ]; -if (mc->platform_max && val2 > mc->platform_max) +if (mc->platform_max && ((int )val2 + min) > mc->platform_max)return -EINVAL ;if (val2 > max - min)return -EINVAL ;