Linux 4.9.227
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.227 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
------------
Documentation/ABI/testing/sysfs-devices-system-cpu | 1 Documentation/hw-vuln/index.rst | 3 Documentation/hw-vuln/special-register-buffer-data-sampling.rst | 149 ++++++++++ Documentation/kernel-parameters.txt | 20 + Makefile | 2 arch/arc/kernel/setup.c | 5 arch/s390/kernel/mcount.S | 1 arch/x86/include/asm/cpu_device_id.h | 27 + arch/x86/include/asm/cpufeatures.h | 30 +- arch/x86/include/asm/msr-index.h | 4 arch/x86/include/asm/pgtable.h | 1 arch/x86/kernel/cpu/bugs.c | 106 +++++++ arch/x86/kernel/cpu/common.c | 54 ++- arch/x86/kernel/cpu/cpu.h | 1 arch/x86/kernel/cpu/match.c | 7 arch/x86/mm/mmio-mod.c | 4 drivers/base/cpu.c | 8 drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c | 8 drivers/iio/light/vcnl4000.c | 6 drivers/net/can/slcan.c | 3 drivers/net/ethernet/apple/bmac.c | 2 drivers/net/ethernet/freescale/ucc_geth.c | 13 drivers/net/ethernet/smsc/smsc911x.c | 9 drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c | 13 drivers/net/ppp/pppoe.c | 3 drivers/net/slip/slip.c | 3 drivers/net/usb/qmi_wwan.c | 1 drivers/net/wireless/cisco/airo.c | 12 drivers/net/wireless/intersil/p54/p54usb.c | 1 drivers/nfc/st21nfca/dep.c | 4 drivers/nvmem/qfprom.c | 14 drivers/scsi/scsi_devinfo.c | 23 - drivers/scsi/ufs/ufshcd.c | 1 drivers/spi/spi-dw.c | 3 drivers/staging/rtl8712/wifi.h | 9 drivers/tty/hvc/hvc_console.c | 23 - drivers/tty/vt/keyboard.c | 26 + drivers/usb/gadget/function/f_uac2.c | 4 drivers/usb/musb/musb_debugfs.c | 10 drivers/usb/serial/option.c | 4 drivers/usb/serial/qcserial.c | 1 drivers/usb/serial/usb_wwan.c | 4 include/linux/mod_devicetable.h | 6 include/uapi/linux/mmc/ioctl.h | 1 kernel/events/uprobes.c | 14 kernel/relay.c | 5 mm/mremap.c | 2 net/ipv4/devinet.c | 1 net/ipv6/esp6.c | 4 net/l2tp/l2tp_core.c | 2 net/l2tp/l2tp_ip.c | 29 + net/l2tp/l2tp_ip6.c | 30 +- net/vmw_vsock/af_vsock.c | 2 53 files changed, 584 insertions(+), 135 deletions(-)
Ben Hutchings (1):
slcan: Fix double-free on slcan_open() error path
Bin Liu (1):
USB: serial: usb_wwan: do not resubmit rx urb on fatal errors
Can Guo (1):
scsi: ufs: Release clock if DMA map fails
Chuhong Yuan (1):
NFC: st21nfca: add missed kfree_skb() in an error path
Dan Carpenter (1):
airo: Fix read overflows sending packets
Daniel Axtens (1):
kernel/relay.c: handle alloc_percpu returning NULL in relay_open
Daniele Palmas (2):
net: usb: qmi_wwan: add Telit LE910C1-EUX composition
USB: serial: option: add Telit LE910C1-EUX compositions
Dinghao Liu (2):
net: smsc911x: Fix runtime PM imbalance on error
usb: musb: Fix runtime PM imbalance on error
Dmitry Torokhov (1):
vt: keyboard: avoid signed integer overflow in k_ascii
Eric Dumazet (2):
l2tp: do not use inet_hash()/inet_unhash()
l2tp: add sk_family checks to l2tp_validate_socket
Eugeniu Rosca (1):
usb: gadget: f_uac2: fix error handling in afunc_bind (again)
Eugeniy Paltsev (1):
ARC: Fix ICCM & DCCM runtime size checks
Fan Yang (1):
mm: Fix mremap not considering huge pmd devmap
Giuseppe Marco Randazzo (1):
p54usb: add AirVasT USB stick device-id
Greg Kroah-Hartman (1):
Linux 4.9.227
Guillaume Nault (1):
pppoe: only process PADT targeted at local interfaces
Hannes Reinecke (1):
scsi: scsi_devinfo: fixup string compare
Jeremy Kerr (1):
net: bmac: Fix read of MAC address from ROM
Jiri Slaby (1):
tty: hvc_console, fix crashes on parallel open/close
Jonathan McDowell (1):
net: ethernet: stmmac: Enable interface clocks on probe for IPQ806x
Josh Poimboeuf (1):
x86/speculation: Add Ivy Bridge to affected list
Julian Sax (1):
HID: i2c-hid: add Schneider SCL142ALM to descriptor override
Jérôme Pouiller (1):
mmc: fix compilation of user API
Mark Gross (4):
x86/cpu: Add a steppings field to struct x86_cpu_id
x86/cpu: Add 'table' argument to cpu_matches()
x86/speculation: Add Special Register Buffer Data Sampling (SRBDS) mitigation x86/speculation: Add SRBDS vulnerability and mitigation documentation
Mathieu Othacehe (1):
iio: vcnl4000: Fix i2c swapped word reading.
Matt Jolly (1):
USB: serial: qcserial: add DW5816e QDL support
Nathan Chancellor (1):
x86/mmiotrace: Use cpumask_available() for cpumask_var_t variables
Oleg Nesterov (1):
uprobes: ensure that uprobe->offset and ->ref_ctr_offset are properly aligned
Pascal Terjan (1):
staging: rtl8712: Fix IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK
Srinivas Kandagatla (1):
nvmem: qfprom: remove incorrect write support
Stefano Garzarella (1):
vsock: fix timeout in vsock_accept()
Valentin Longchamp (1):
net/ethernet/freescale: rework quiesce/activate for ucc_geth
Vasily Gorbik (1):
s390/ftrace: save traced function caller
Xinwei Kong (1):
spi: dw: use "smp_mb()" to avoid sending spi data error
Yang Yingliang (1):
devinet: fix memleak in inetdev_init()
Zhen Lei (1):
esp6: fix memleak on error path in esp6_input
yangerkun (1):
slip: not call free_netdev before rtnl_unlock in slip_open
Greg Kroah-Hartman
maintainerDocumentation/ABI/testing/sysfs-devices-system-cpu +1 -0
@@ -358,6 +358,7 @@ What: /sys/devices/system/cpu/vulnerabilities /sys/devices/system/cpu/vulnerabilities/spec_store_bypass /sys/devices/system/cpu/vulnerabilities/l1tf /sys/devices/system/cpu/vulnerabilities/mds + /sys/devices/system/cpu/vulnerabilities/srbds /sys/devices/system/cpu/vulnerabilities/tsx_async_abort /sys/devices/system/cpu/vulnerabilities/itlb_multihit Date: January 2018
Documentation/hw-vuln/index.rst +2 -1
@@ -12,4 +12,5 @@ are configurable at compile, boot or run time. l1tf mds tsx_async_abort - multihit.rst + multihit + special-register-buffer-data-sampling
Documentation/hw-vuln/special-register-buffer-data-sampling.rst new file +149 -0
149 lines not on this page · raw message
Documentation/kernel-parameters.txt +20 -0
@@ -4262,6 +4262,26 @@ bytes respectively. Such letter suffixes can also be entirely omitted. spia_pedr= spia_peddr= + srbds= [X86,INTEL] + Control the Special Register Buffer Data Sampling + (SRBDS) mitigation. + + Certain CPUs are vulnerable to an MDS-like + exploit which can leak bits from the random + number generator. + + By default, this issue is mitigated by + microcode. However, the microcode fix can cause + the RDRAND and RDSEED instructions to become + much slower. Among other effects, this will + result in reduced throughput from /dev/urandom. + + The microcode mitigation can be disabled with + the following option: + + off: Disable mitigation and remove + performance impact to RDRAND and RDSEED + ssbd= [ARM64,HW] Speculative Store Bypass Disable control
Makefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 226 +SUBLEVEL = 227 EXTRAVERSION = NAME = Roaring Lionus
arch/arc/kernel/setup.c +3 -2
@@ -12,6 +12,7 @@#include <linux/root_dev.h> #include <linux/console.h> #include <linux/module.h> +#include <linux/sizes.h> #include <linux/cpu.h> #include <linux/of_fdt.h> #include <linux/of.h>
@@ -333,12 +334,12 @@ static void arc_chk_core_config(void)if ((unsigned int )__arc_dccm_base != cpu->dccm.base_addr)panic ("Linux built with incorrect DCCM Base address\n" ); -if (CONFIG_ARC_DCCM_SZ != cpu->dccm.sz) +if (CONFIG_ARC_DCCM_SZ *SZ_1K != cpu->dccm.sz)panic ("Linux built with incorrect DCCM Size\n" );#endif #ifdef CONFIG_ARC_HAS_ICCM -if (CONFIG_ARC_ICCM_SZ != cpu->iccm.sz) +if (CONFIG_ARC_ICCM_SZ *SZ_1K != cpu->iccm.sz)panic ("Linux built with incorrect ICCM Size\n" );#endif
arch/s390/kernel/mcount.S +1 -0
@@ -39,6 +39,7 @@ EXPORT_SYMBOL(_mcount) ENTRY(ftrace_caller) .globl ftrace_regs_caller .set ftrace_regs_caller,ftrace_caller + stg %r14,(__SF_GPRS+8*8)(%r15) # save traced function caller lgr %r1,%r15 #ifndef CC_USING_HOTPATCH aghi %r0,MCOUNT_RETURN_FIXUP
arch/x86/include/asm/cpu_device_id.h +27 -0
@@ -8,6 +8,33 @@#include <linux/mod_devicetable.h> +#define X86_STEPPINGS (mins, maxs) GENMASK(maxs, mins) + +/** +* X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE - Base macro for CPU matching +* @_vendor: The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY +* The name is expanded to X86_VENDOR_@_vendor +* @_family: The family number or X86_FAMILY_ANY +* @_model: The model number, model constant or X86_MODEL_ANY +* @_steppings: Bitmask for steppings, stepping constant or X86_STEPPING_ANY +* @_feature: A X86_FEATURE bit or X86_FEATURE_ANY +* @_data: Driver specific data or NULL. The internal storage +* format is unsigned long. The supplied value, pointer +* etc. is casted to unsigned long internally. +* +* Backport version to keep the SRBDS pile consistant. No shorter variants +* required for this. +*/ +#define X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE (_vendor, _family, _model, \ + _steppings, _feature, _data) { \ + .vendor = X86_VENDOR_##_vendor, \ + .family = _family, \ + .model = _model, \ + .steppings = _steppings, \ + .feature = _feature, \ + .driver_data = (unsigned long) _data \ +} +extern const struct x86_cpu_id *x86_match_cpu (const struct x86_cpu_id *match);#endif
arch/x86/include/asm/cpufeatures.h +16 -14
@@ -316,6 +316,7 @@/* Intel-defined CPU features, CPUID level 0x00000007:0 (EDX), word 18 */ #define X86_FEATURE_AVX512_4VNNIW (18*32+ 2)/* AVX-512 Neural Network Instructions */ #define X86_FEATURE_AVX512_4FMAPS (18*32+ 3)/* AVX-512 Multiply Accumulation Single precision */ +#define X86_FEATURE_SRBDS_CTRL (18*32+ 9)/* "" SRBDS mitigation MSR available */ #define X86_FEATURE_TSX_FORCE_ABORT (18*32+13)/* "" TSX_FORCE_ABORT */ #define X86_FEATURE_MD_CLEAR (18*32+10)/* VERW clears CPU buffers */ #define X86_FEATURE_PCONFIG (18*32+18)/* Intel PCONFIG */
@@ -346,19 +347,20 @@*/ #define X86_BUG_ESPFIX X86_BUG(9)/* "" IRET to 16-bit SS corrupts ESP/RSP high bits */ #endif -#define X86_BUG_NULL_SEG X86_BUG(10)/* Nulling a selector preserves the base */ -#define X86_BUG_SWAPGS_FENCE X86_BUG(11)/* SWAPGS without input dep on GS */ -#define X86_BUG_MONITOR X86_BUG(12)/* IPI required to wake up remote CPU */ -#define X86_BUG_AMD_E400 X86_BUG(13)/* CPU is among the affected by Erratum 400 */ -#define X86_BUG_CPU_MELTDOWN X86_BUG(14)/* CPU is affected by meltdown attack and needs kernel page table isolation */ -#define X86_BUG_SPECTRE_V1 X86_BUG(15)/* CPU is affected by Spectre variant 1 attack with conditional branches */ -#define X86_BUG_SPECTRE_V2 X86_BUG(16)/* CPU is affected by Spectre variant 2 attack with indirect branches */ -#define X86_BUG_SPEC_STORE_BYPASS X86_BUG(17)/* CPU is affected by speculative store bypass attack */ -#define X86_BUG_L1TF X86_BUG(18)/* CPU is affected by L1 Terminal Fault */ -#define X86_BUG_MDS X86_BUG(19)/* CPU is affected by Microarchitectural data sampling */ -#define X86_BUG_MSBDS_ONLY X86_BUG(20)/* CPU is only affected by the MSDBS variant of BUG_MDS */ -#define X86_BUG_SWAPGS X86_BUG(21)/* CPU is affected by speculation through SWAPGS */ -#define X86_BUG_TAA X86_BUG(22)/* CPU is affected by TSX Async Abort(TAA) */ -#define X86_BUG_ITLB_MULTIHIT X86_BUG(23)/* CPU may incur MCE during certain page attribute changes */ +#define X86_BUG_NULL_SEG X86_BUG(10)/* Nulling a selector preserves the base */ +#define X86_BUG_SWAPGS_FENCE X86_BUG(11)/* SWAPGS without input dep on GS */ +#define X86_BUG_MONITOR X86_BUG(12)/* IPI required to wake up remote CPU */ +#define X86_BUG_AMD_E400 X86_BUG(13)/* CPU is among the affected by Erratum 400 */ +#define X86_BUG_CPU_MELTDOWN X86_BUG(14)/* CPU is affected by meltdown attack and needs kernel page table isolation */ +#define X86_BUG_SPECTRE_V1 X86_BUG(15)/* CPU is affected by Spectre variant 1 attack with conditional branches */ +#define X86_BUG_SPECTRE_V2 X86_BUG(16)/* CPU is affected by Spectre variant 2 attack with indirect branches */ +#define X86_BUG_SPEC_STORE_BYPASS X86_BUG(17)/* CPU is affected by speculative store bypass attack */ +#define X86_BUG_L1TF X86_BUG(18)/* CPU is affected by L1 Terminal Fault */ +#define X86_BUG_MDS X86_BUG(19)/* CPU is affected by Microarchitectural data sampling */ +#define X86_BUG_MSBDS_ONLY X86_BUG(20)/* CPU is only affected by the MSDBS variant of BUG_MDS */ +#define X86_BUG_SWAPGS X86_BUG(21)/* CPU is affected by speculation through SWAPGS */ +#define X86_BUG_TAA X86_BUG(22)/* CPU is affected by TSX Async Abort(TAA) */ +#define X86_BUG_ITLB_MULTIHIT X86_BUG(23)/* CPU may incur MCE during certain page attribute changes */ +#define X86_BUG_SRBDS X86_BUG(24)/* CPU may leak RNG bits if not mitigated */ #endif /* _ASM_X86_CPUFEATURES_H */
arch/x86/include/asm/msr-index.h +4 -0
@@ -103,6 +103,10 @@#define TSX_CTRL_RTM_DISABLE BIT(0)/* Disable RTM feature */ #define TSX_CTRL_CPUID_CLEAR BIT(1)/* Disable TSX enumeration */ +/* SRBDS support */ +#define MSR_IA32_MCU_OPT_CTRL 0x00000123 +#define RNGDS_MITG_DIS BIT(0) +#define MSR_IA32_SYSENTER_CS 0x00000174#define MSR_IA32_SYSENTER_ESP 0x00000175#define MSR_IA32_SYSENTER_EIP 0x00000176
arch/x86/include/asm/pgtable.h +1 -0
@@ -203,6 +203,7 @@ static inline int pmd_large(pmd_t pte) }#ifdef CONFIG_TRANSPARENT_HUGEPAGE +/* NOTE: when predicate huge page, consider also pmd_devmap, or use pmd_large */ static inline int pmd_trans_huge (pmd_t pmd) {return (pmd_val (pmd) & (_PAGE_PSE|_PAGE_DEVMAP)) == _PAGE_PSE;
arch/x86/kernel/cpu/bugs.c +106 -0
140 lines not on this page · raw message
arch/x86/kernel/cpu/common.c +44 -10
102 lines not on this page · raw message
arch/x86/kernel/cpu/cpu.h +1 -0
@@ -66,6 +66,7 @@ extern int detect_extended_topology_early(struct cpuinfo_x86 *c);extern int detect_ht_early (struct cpuinfo_x86 *c);extern void x86_spec_ctrl_setup_ap (void ); +extern void update_srbds_msr (void );extern u64 x86_read_arch_cap_msr (void );
arch/x86/kernel/cpu/match.c +6 -1
@@ -33,13 +33,18 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match)const struct x86_cpu_id *m;struct cpuinfo_x86 *c = &boot_cpu_data; -for (m = match; m->vendor | m->family | m->model | m->feature; m++) { +for (m = match; + m->vendor | m->family | m->model | m->steppings | m->feature; + m++) {if (m->vendor !=X86_VENDOR_ANY && c->x86_vendor != m->vendor)continue ;if (m->family !=X86_FAMILY_ANY && c->x86 != m->family)continue ;if (m->model !=X86_MODEL_ANY && c->x86_model != m->model)continue ; +if (m->steppings !=X86_STEPPING_ANY && + !(BIT (c->x86_stepping) & m->steppings)) +continue ;if (m->feature !=X86_FEATURE_ANY && !cpu_has (c, m->feature))continue ;return m;
arch/x86/mm/mmio-mod.c +2 -2
@@ -385,7 +385,7 @@ static void enter_uniprocessor(void)int cpu;int err; -if (downed_cpus ==NULL && +if (!cpumask_available (downed_cpus) && !alloc_cpumask_var (&downed_cpus,GFP_KERNEL )) {pr_notice ("Failed to allocate mask\n" ); goto out;
@@ -415,7 +415,7 @@ static void leave_uniprocessor(void)int cpu;int err; -if (downed_cpus ==NULL ||cpumask_weight (downed_cpus) ==0 ) +if (!cpumask_available (downed_cpus) ||cpumask_weight (downed_cpus) ==0 )return ;pr_notice ("Re-enabling CPUs...\n" );for_each_cpu (cpu, downed_cpus) {
drivers/base/cpu.c +8 -0
@@ -550,6 +550,12 @@ ssize_t __weak cpu_show_itlb_multihit(struct device *dev,return sprintf (buf,"Not affected\n" ); } +ssize_t __weak cpu_show_srbds (struct device *dev, +struct device_attribute *attr,char *buf) +{ +return sprintf (buf,"Not affected\n" ); +} + static DEVICE_ATTR(meltdown, 0444, cpu_show_meltdown, NULL); static DEVICE_ATTR(spectre_v1, 0444, cpu_show_spectre_v1, NULL); static DEVICE_ATTR(spectre_v2, 0444, cpu_show_spectre_v2, NULL);
@@ -558,6 +564,7 @@ static DEVICE_ATTR(l1tf, 0444, cpu_show_l1tf, NULL); static DEVICE_ATTR(mds, 0444, cpu_show_mds, NULL); static DEVICE_ATTR(tsx_async_abort, 0444, cpu_show_tsx_async_abort, NULL); static DEVICE_ATTR(itlb_multihit, 0444, cpu_show_itlb_multihit, NULL); +static DEVICE_ATTR(srbds, 0444, cpu_show_srbds, NULL);static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_meltdown.attr,
@@ -568,6 +575,7 @@ static struct attribute *cpu_root_vulnerabilities_attrs[] = { &dev_attr_mds.attr, &dev_attr_tsx_async_abort.attr, &dev_attr_itlb_multihit.attr, + &dev_attr_srbds.attr, NULL };
drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c +8 -0
@@ -381,6 +381,14 @@ static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = { }, .driver_data = (void *)&sipodev_desc }, + { + .ident = "Schneider SCL142ALM", + .matches = { + DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SCHNEIDER"), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SCL142ALM"), + }, + .driver_data = (void *)&sipodev_desc + }, { } /* Terminate list */ };
drivers/iio/light/vcnl4000.c +2 -4
@@ -61,7 +61,6 @@ static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask, u8 rdy_mask, u8 data_reg, int *val) { int tries = 20; -__be16 buf;int ret;mutex_lock (&data->lock);
@@ -88,13 +87,12 @@ static int vcnl4000_measure(struct vcnl4000_data *data, u8 req_mask, goto fail; } - ret =i2c_smbus_read_i2c_block_data (data->client, - data_reg,sizeof (buf), (u8 *) &buf); + ret =i2c_smbus_read_word_swapped (data->client, data_reg);if (ret <0 ) goto fail;mutex_unlock (&data->lock); - *val =be16_to_cpu (buf); + *val = ret;return 0 ;
drivers/net/can/slcan.c +1 -2
@@ -618,10 +618,9 @@ static int slcan_open(struct tty_struct *tty) sl->tty =NULL ; tty->disc_data =NULL ;clear_bit (SLF_INUSE , &sl->flags); -slc_free_netdev (sl->dev);/* do not call free_netdev before rtnl_unlock */ rtnl_unlock (); -free_netdev (sl->dev); +slc_free_netdev (sl->dev);return err; err_exit:
drivers/net/ethernet/apple/bmac.c +1 -1
@@ -1187,7 +1187,7 @@ bmac_get_station_address(struct net_device *dev, unsigned char *ea)int i;unsigned short data; -for (i =0 ; i <6 ; i++) +for (i =0 ; i <3 ; i++) {reset_and_select_srom (dev); data =read_srom (dev, i + EnetAddressOffset/2 , SROMAddressBits);
drivers/net/ethernet/freescale/ucc_geth.c +7 -6
@@ -45,6 +45,7 @@#include <soc/fsl/qe/ucc.h> #include <soc/fsl/qe/ucc_fast.h> #include <asm/machdep.h> +#include <net/sch_generic.h> #include "ucc_geth.h"
@@ -1551,11 +1552,8 @@ static int ugeth_disable(struct ucc_geth_private *ugeth, enum comm_dir mode)static void ugeth_quiesce (struct ucc_geth_private *ugeth) { -/* Prevent any further xmits, plus detach the device. */ -netif_device_detach (ugeth->ndev); - -/* Wait for any current xmits to finish. */ -netif_tx_disable (ugeth->ndev); +/* Prevent any further xmits */ +netif_tx_stop_all_queues (ugeth->ndev);/* Disable the interrupt to avoid NAPI rescheduling. */ disable_irq (ugeth->ug_info->uf_info.irq);
@@ -1568,7 +1566,10 @@ static void ugeth_activate(struct ucc_geth_private *ugeth) {napi_enable (&ugeth->napi);enable_irq (ugeth->ug_info->uf_info.irq); -netif_device_attach (ugeth->ndev); + +/* allow to xmit again */ +netif_tx_wake_all_queues (ugeth->ndev); +__netdev_watchdog_up (ugeth->ndev); }/* Called every time the controller might need to be made
drivers/net/ethernet/smsc/smsc911x.c +5 -4
@@ -2506,20 +2506,20 @@ static int smsc911x_drv_probe(struct platform_device *pdev) retval =smsc911x_init (dev);if (retval <0 ) - goto out_disable_resources; + goto out_init_fail;netif_carrier_off (dev); retval =smsc911x_mii_init (pdev, dev);if (retval) {SMSC_WARN (pdata, probe,"Error %i initialising mii" , retval); - goto out_disable_resources; + goto out_init_fail; } retval =register_netdev (dev);if (retval) {SMSC_WARN (pdata, probe,"Error %i registering device" , retval); - goto out_disable_resources; + goto out_init_fail; }else {SMSC_TRACE (pdata, probe,"Network interface: \"%s\"" , dev->name);
@@ -2560,9 +2560,10 @@ static int smsc911x_drv_probe(struct platform_device *pdev)return 0 ; -out_disable_resources: +out_init_fail:pm_runtime_put (&pdev->dev);pm_runtime_disable (&pdev->dev); +out_disable_resources: (void )smsc911x_disable_resources (pdev); out_enable_resources_fail:smsc911x_free_resources (pdev);
drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c +13 -0
@@ -330,6 +330,19 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)/* Enable PTP clock */ regmap_read (gmac->nss_common,NSS_COMMON_CLK_GATE , &val); val |=NSS_COMMON_CLK_GATE_PTP_EN (gmac->id); +switch (gmac->phy_mode) { +case PHY_INTERFACE_MODE_RGMII : + val |=NSS_COMMON_CLK_GATE_RGMII_RX_EN (gmac->id) | +NSS_COMMON_CLK_GATE_RGMII_TX_EN (gmac->id); +break ; +case PHY_INTERFACE_MODE_SGMII : + val |=NSS_COMMON_CLK_GATE_GMII_RX_EN (gmac->id) | +NSS_COMMON_CLK_GATE_GMII_TX_EN (gmac->id); +break ; +default : +/* We don't get here; the switch above will have errored out */ +unreachable (); + }regmap_write (gmac->nss_common,NSS_COMMON_CLK_GATE , val);if (gmac->phy_mode ==PHY_INTERFACE_MODE_SGMII ) {
drivers/net/ppp/pppoe.c +3 -0
@@ -494,6 +494,9 @@ static int pppoe_disc_rcv(struct sk_buff *skb, struct net_device *dev,if (!skb) goto out; +if (skb->pkt_type !=PACKET_HOST ) + goto abort; +if (!pskb_may_pull (skb,sizeof (struct pppoe_hdr ))) goto abort;
drivers/net/slip/slip.c +3 -0
@@ -867,7 +867,10 @@ static int slip_open(struct tty_struct *tty) sl->tty =NULL ; tty->disc_data =NULL ;clear_bit (SLF_INUSE , &sl->flags); +/* do not call free_netdev before rtnl_unlock */ +rtnl_unlock ();sl_free_netdev (sl->dev); +return err; err_exit:rtnl_unlock ();
drivers/net/usb/qmi_wwan.c +1 -0
@@ -921,6 +921,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ + {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */ {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */ {QMI_FIXED_INTF(0x1bc7, 0x1100, 3)}, /* Telit ME910 */ {QMI_FIXED_INTF(0x1bc7, 0x1101, 3)}, /* Telit ME910 dual modem */
drivers/net/wireless/cisco/airo.c +12 -0
@@ -1928,6 +1928,10 @@ static netdev_tx_t mpi_start_xmit(struct sk_buff *skb,airo_print_err (dev->name,"%s: skb == NULL!" ,__func__);return NETDEV_TX_OK ; } +if (skb_padto (skb,ETH_ZLEN )) { + dev->stats.tx_dropped++; +return NETDEV_TX_OK ; + } npacks =skb_queue_len (&ai->txq);if (npacks >=MAXTXQ -1 ) {
@@ -2130,6 +2134,10 @@ static netdev_tx_t airo_start_xmit(struct sk_buff *skb,airo_print_err (dev->name,"%s: skb == NULL!" , __func__);return NETDEV_TX_OK ; } +if (skb_padto (skb,ETH_ZLEN )) { + dev->stats.tx_dropped++; +return NETDEV_TX_OK ; + }/* Find a vacant FID */ for ( i =0 ; i <MAX_FIDS /2 && (fids[i] &0xffff0000 ); i++ );
@@ -2204,6 +2212,10 @@ static netdev_tx_t airo_start_xmit11(struct sk_buff *skb,airo_print_err (dev->name,"%s: skb == NULL!" , __func__);return NETDEV_TX_OK ; } +if (skb_padto (skb,ETH_ZLEN )) { + dev->stats.tx_dropped++; +return NETDEV_TX_OK ; + }/* Find a vacant FID */ for ( i =MAX_FIDS /2 ; i <MAX_FIDS && (fids[i] &0xffff0000 ); i++ );
drivers/net/wireless/intersil/p54/p54usb.c +1 -0
@@ -64,6 +64,7 @@ static struct usb_device_id p54u_table[] = { {USB_DEVICE(0x0db0, 0x6826)}, /* MSI UB54G (MS-6826) */ {USB_DEVICE(0x107b, 0x55f2)}, /* Gateway WGU-210 (Gemtek) */ {USB_DEVICE(0x124a, 0x4023)}, /* Shuttle PN15, Airvast WM168g, IOGear GWU513 */ + {USB_DEVICE(0x124a, 0x4026)}, /* AirVasT USB wireless device */ {USB_DEVICE(0x1435, 0x0210)}, /* Inventel UR054G */ {USB_DEVICE(0x15a9, 0x0002)}, /* Gemtek WUBI-100GW 802.11g */ {USB_DEVICE(0x1630, 0x0005)}, /* 2Wire 802.11g USB (v1) / Z-Com */
drivers/nfc/st21nfca/dep.c +3 -1
@@ -184,8 +184,10 @@ static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,memcpy (atr_res->gbi, atr_req->gbi, gb_len); r =nfc_set_remote_general_bytes (hdev->ndev, atr_res->gbi, gb_len); -if (r <0 ) +if (r <0 ) { +kfree_skb (skb);return r; + } } info->dep_info.curr_nfc_dep_pni =0 ;
drivers/nvmem/qfprom.c +0 -14
@@ -30,19 +30,6 @@ static int qfprom_reg_read(void *context,return 0 ; } -static int qfprom_reg_write (void *context, -unsigned int reg,void *_val,size_t bytes) -{ -void __iomem *base = context; -u32 *val = _val; -int i =0 , words = bytes /4 ; - -while (words--) -writel (*val++, base + reg + (i++ *4 )); - -return 0 ; -} -static int qfprom_remove (struct platform_device *pdev) {struct nvmem_device *nvmem =platform_get_drvdata (pdev);
@@ -56,7 +43,6 @@ static struct nvmem_config econfig = { .stride = 4, .word_size = 1, .reg_read = qfprom_reg_read, - .reg_write = qfprom_reg_write, };static int qfprom_probe (struct platform_device *pdev)
drivers/scsi/scsi_devinfo.c +13 -10
@@ -394,8 +394,8 @@ EXPORT_SYMBOL(scsi_dev_info_list_add_keyed);/** * scsi_dev_info_list_find - find a matching dev_info list entry. -* @vendor: vendor string -* @model: model (product) string +* @vendor: full vendor string +* @model: full model (product) string * @key: specify list to use * * Description:
@@ -410,7 +410,7 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,struct scsi_dev_info_list *devinfo;struct scsi_dev_info_list_table *devinfo_table =scsi_devinfo_lookup_by_key (key); -size_t vmax, mmax; +size_t vmax, mmax, mlen;const char *vskip, *mskip;if (IS_ERR (devinfo_table))
@@ -449,15 +449,18 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor, dev_info_list) {if (devinfo->compatible) {/* -* Behave like the older version of get_device_flags. +* vendor strings must be an exact match */ -if (memcmp (devinfo->vendor, vskip, vmax) || - (vmax <sizeof (devinfo->vendor) && - devinfo->vendor[vmax])) +if (vmax !=strlen (devinfo->vendor) || +memcmp (devinfo->vendor, vskip, vmax))continue ; -if (memcmp (devinfo->model, mskip, mmax) || - (mmax <sizeof (devinfo->model) && - devinfo->model[mmax])) + +/* +* @model specifies the full string, and +* must be larger or equal to devinfo->model +*/ + mlen =strlen (devinfo->model); +if (mmax < mlen ||memcmp (devinfo->model, mskip, mlen))continue ;return devinfo; }else {
drivers/scsi/ufs/ufshcd.c +1 -0
@@ -1512,6 +1512,7 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) err =ufshcd_map_sg (hba, lrbp);if (err) { +ufshcd_release (hba); lrbp->cmd =NULL ;clear_bit_unlock (tag, &hba->lrb_in_use); goto out;
drivers/spi/spi-dw.c +3 -0
@@ -305,6 +305,9 @@ static int dw_spi_transfer_one(struct spi_master *master, dws->len = transfer->len;spin_unlock_irqrestore (&dws->buf_lock, flags); +/* Ensure dw->rx and dw->rx_end are visible */ +smp_mb (); +spi_enable_chip (dws,0 );/* Handle per transfer options for bpw and speed */
drivers/staging/rtl8712/wifi.h +1 -8
@@ -471,7 +471,7 @@ static inline unsigned char *get_hdr_bssid(unsigned char *pframe)/* block-ack parameters */ #define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 +#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFC0#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800
@@ -565,13 +565,6 @@ struct ieee80211_ht_addt_info {#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 -/* block-ack parameters */ -#define IEEE80211_ADDBA_PARAM_POLICY_MASK 0x0002 -#define IEEE80211_ADDBA_PARAM_TID_MASK 0x003C -#define IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK 0xFFA0 -#define IEEE80211_DELBA_PARAM_TID_MASK 0xF000 -#define IEEE80211_DELBA_PARAM_INITIATOR_MASK 0x0800 -/* * A-PMDU buffer sizes * According to IEEE802.11n spec size varies from 8K to 64K (in powers of 2)
drivers/tty/hvc/hvc_console.c +8 -15
@@ -358,15 +358,14 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)* tty fields and return the kref reference. */ if (rc) { -tty_port_tty_set (&hp->port,NULL ); - tty->driver_data =NULL ; -tty_port_put (&hp->port);printk (KERN_ERR "hvc_open: request_irq failed with rc %d.\n" , rc); - }else + }else {/* We are ready... raise DTR/RTS */ if (C_BAUD (tty))if (hp->ops->dtr_rts) hp->ops->dtr_rts (hp,1 ); +tty_port_set_initialized (&hp->port, true); + }/* Force wakeup of the polling thread */ hvc_kick ();
@@ -376,22 +375,12 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)static void hvc_close (struct tty_struct *tty,struct file * filp) { -struct hvc_struct *hp; +struct hvc_struct *hp = tty->driver_data;unsigned long flags;if (tty_hung_up_p (filp))return ; -/* -* No driver_data means that this close was issued after a failed -* hvc_open by the tty layer's release_dev() function and we can just -* exit cleanly because the kref reference wasn't made. -*/ -if (!tty->driver_data) -return ; - - hp = tty->driver_data; -spin_lock_irqsave (&hp->port.lock, flags);if (--hp->port.count ==0 ) {
@@ -399,6 +388,9 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)/* We are done with the tty pointer now. */ tty_port_tty_set (&hp->port,NULL ); +if (!tty_port_initialized (&hp->port)) +return ; +if (C_HUPCL (tty))if (hp->ops->dtr_rts) hp->ops->dtr_rts (hp,0 );
@@ -415,6 +407,7 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)* waking periodically to check chars_in_buffer(). */ tty_wait_until_sent (tty,HVC_CLOSE_WAIT ); +tty_port_set_initialized (&hp->port, false); }else {if (hp->port.count <0 ) printk(KERN_ERR "hvc_close %X: oops, count is %d\n",
drivers/tty/vt/keyboard.c +16 -10
@@ -125,7 +125,11 @@ static DEFINE_SPINLOCK(func_buf_lock); /* guard 'func_buf' and friends */static unsigned long key_down[BITS_TO_LONGS (KEY_CNT )];/* keyboard key bitmap */ static unsigned char shift_down[NR_SHIFT ];/* shift state counters.. */ static bool dead_key_next; -static int npadch =-1 ;/* -1 or number assembled on pad */ + +/* Handles a number being assembled on the number pad */ +static bool npadch_active; +static unsigned int npadch_value; +static unsigned int diacr;static char rep;/* flag telling character repeat */
@@ -815,12 +819,12 @@ static void k_shift(struct vc_data *vc, unsigned char value, char up_flag) shift_state &= ~(1 << value);/* kludge */ -if (up_flag && shift_state != old_state && npadch !=-1 ) { +if (up_flag && shift_state != old_state && npadch_active) {if (kbd->kbdmode ==VC_UNICODE ) -to_utf8 (vc, npadch); +to_utf8 (vc, npadch_value);else -put_queue (vc, npadch &0xff ); - npadch =-1 ; +put_queue (vc, npadch_value &0xff ); + npadch_active = false; } }
@@ -838,7 +842,7 @@ static void k_meta(struct vc_data *vc, unsigned char value, char up_flag)static void k_ascii (struct vc_data *vc,unsigned char value,char up_flag) { -int base; +unsigned int base;if (up_flag)return ;
@@ -852,10 +856,12 @@ static void k_ascii(struct vc_data *vc, unsigned char value, char up_flag) base =16 ; } -if (npadch ==-1 ) - npadch = value; -else - npadch = npadch * base + value; +if (!npadch_active) { + npadch_value =0 ; + npadch_active = true; + } + + npadch_value = npadch_value * base + value; }static void k_lock (struct vc_data *vc,unsigned char value,char up_flag)
drivers/usb/gadget/function/f_uac2.c +2 -2
@@ -1069,13 +1069,13 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) agdev->out_ep =usb_ep_autoconfig (gadget, &fs_epout_desc);if (!agdev->out_ep) {dev_err (dev,"%s:%d Error!\n" , __func__, __LINE__); -return ret; +return -ENODEV ; } agdev->in_ep =usb_ep_autoconfig (gadget, &fs_epin_desc);if (!agdev->in_ep) {dev_err (dev,"%s:%d Error!\n" , __func__, __LINE__); -return ret; +return -ENODEV ; } uac2->p_prm.uac2 = uac2;
drivers/usb/musb/musb_debugfs.c +5 -5
@@ -200,6 +200,11 @@ static ssize_t musb_test_mode_write(struct file *file,u8 test;char buf[18 ]; +memset (buf,0x00 ,sizeof (buf)); + +if (copy_from_user (buf, ubuf,min_t (size_t,sizeof (buf) -1 , count))) +return -EFAULT ; +pm_runtime_get_sync (musb->controller); test =musb_readb (musb->mregs,MUSB_TESTMODE );if (test) {
@@ -208,11 +213,6 @@ static ssize_t musb_test_mode_write(struct file *file, goto ret; } -memset (buf,0x00 ,sizeof (buf)); - -if (copy_from_user (buf, ubuf,min_t (size_t,sizeof (buf) -1 , count))) -return -EFAULT ; -if (strstarts (buf,"force host" )) test =MUSB_TEST_FORCE_HOST ;
drivers/usb/serial/option.c +4 -0
@@ -1146,6 +1146,10 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1031, 0xff), /* Telit LE910C1-EUX */ + .driver_info = NCTRL(0) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1033, 0xff), /* Telit LE910C1-EUX (ECM) */ + .driver_info = NCTRL(0) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0), .driver_info = RSVD(0) | RSVD(1) | NCTRL(2) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG1),
drivers/usb/serial/qcserial.c +1 -0
@@ -177,6 +177,7 @@ static const struct usb_device_id id_table[] = { {DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ {DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */ {DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */ + {DEVICE_SWI(0x413c, 0x81cb)}, /* Dell Wireless 5816e QDL */ {DEVICE_SWI(0x413c, 0x81cc)}, /* Dell Wireless 5816e */ {DEVICE_SWI(0x413c, 0x81cf)}, /* Dell Wireless 5819 */ {DEVICE_SWI(0x413c, 0x81d0)}, /* Dell Wireless 5819 */
drivers/usb/serial/usb_wwan.c +4 -0
@@ -305,6 +305,10 @@ static void usb_wwan_indat_callback(struct urb *urb)if (status) {dev_dbg (dev,"%s: nonzero status: %d on endpoint %02x.\n" , __func__, status, endpoint); + +/* don't resubmit on fatal errors */ +if (status == -ESHUTDOWN || status == -ENOENT ) +return ; }else {if (urb->actual_length) { tty_insert_flip_string(&port->port, data,
include/linux/mod_devicetable.h +6 -0
@@ -572,6 +572,10 @@ struct mips_cdmm_device_id {/* * MODULE_DEVICE_TABLE expects this struct to be called x86cpu_device_id. * Although gcc seems to ignore this error, clang fails without this define. +* +* Note: The ordering of the struct is different from upstream because the +* static initializers in kernels < 5.7 still use C89 style while upstream +* has been converted to proper C99 initializers. */ #define x86cpu_device_id x86_cpu_idstruct x86_cpu_id {
@@ -580,6 +584,7 @@ struct x86_cpu_id {__u16 model;__u16 feature;/* bit index */ kernel_ulong_t driver_data; +__u16 steppings; };#define X86_FEATURE_MATCH (x) \
@@ -588,6 +593,7 @@ struct x86_cpu_id {#define X86_VENDOR_ANY 0xffff#define X86_FAMILY_ANY 0#define X86_MODEL_ANY 0 +#define X86_STEPPING_ANY 0#define X86_FEATURE_ANY 0/* Same as FPU, you can't test for that */ /*
include/uapi/linux/mmc/ioctl.h +1 -0
@@ -2,6 +2,7 @@#define LINUX_MMC_IOCTL_H #include <linux/types.h> +#include <linux/major.h> struct mmc_ioc_cmd {/* Implies direction of data. true = write, false = read */
kernel/events/uprobes.c +10 -4
@@ -604,10 +604,6 @@ static int prepare_uprobe(struct uprobe *uprobe, struct file *file,if (ret) goto out; -/* uprobe_write_opcode() assumes we don't cross page boundary */ -BUG_ON ((uprobe->offset & ~PAGE_MASK ) + -UPROBE_SWBP_INSN_SIZE >PAGE_SIZE ); -smp_wmb ();/* pairs with the smp_rmb() in handle_swbp() */ set_bit (UPROBE_COPY_INSN , &uprobe->flags);
@@ -886,6 +882,13 @@ int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *if (offset >i_size_read (inode))return -EINVAL ; +/* +* This ensures that copy_from_page() and copy_to_page() +* can't cross page boundary. +*/ +if (!IS_ALIGNED (offset,UPROBE_SWBP_INSN_SIZE )) +return -EINVAL ; + retry: uprobe =alloc_uprobe (inode, offset);if (!uprobe)
@@ -1696,6 +1699,9 @@ static int is_trap_at_addr(struct mm_struct *mm, unsigned long vaddr)uprobe_opcode_t opcode;int result; +if (WARN_ON_ONCE (!IS_ALIGNED (vaddr,UPROBE_SWBP_INSN_SIZE ))) +return -EINVAL ; +pagefault_disable (); result =__get_user (opcode, (uprobe_opcode_t __user *)vaddr);pagefault_enable ();
kernel/relay.c +5 -0
@@ -578,6 +578,11 @@ struct rchan *relay_open(const char *base_filename,return NULL ; chan->buf = alloc_percpu(struct rchan_buf *); +if (!chan->buf) { +kfree (chan); +return NULL ; + } + chan->version =RELAYFS_CHANNEL_VERSION ; chan->n_subbufs = n_subbufs; chan->subbuf_size = subbuf_size;
mm/mremap.c +1 -1
@@ -212,7 +212,7 @@ unsigned long move_page_tables(struct vm_area_struct *vma, new_pmd =alloc_new_pmd (vma->vm_mm, vma, new_addr);if (!new_pmd)break ; -if (pmd_trans_huge (*old_pmd)) { +if (pmd_trans_huge (*old_pmd) ||pmd_devmap (*old_pmd)) {if (extent ==HPAGE_PMD_SIZE ) {bool moved;/* See comment in move_ptes() */
net/ipv4/devinet.c +1 -0
@@ -262,6 +262,7 @@ static struct in_device *inetdev_init(struct net_device *dev) err =devinet_sysctl_register (in_dev);if (err) { in_dev->dead =1 ; +neigh_parms_release (&arp_tbl, in_dev->arp_parms);in_dev_put (in_dev); in_dev =NULL ; goto out;
net/ipv6/esp6.c +3 -1
@@ -426,8 +426,10 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)sg_init_table (sg, nfrags); ret =skb_to_sgvec (skb, sg,0 , skb->len); -if (unlikely (ret <0 )) +if (unlikely (ret <0 )) { +kfree (tmp); goto out; + }aead_request_set_crypt (req, sg, sg, elen + ivlen, iv);aead_request_set_ad (req, assoclen);
net/l2tp/l2tp_core.c +2 -0
@@ -1568,6 +1568,8 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 tunnel_id, fd); goto err; } +if (sk->sk_family !=PF_INET && sk->sk_family !=PF_INET6 ) + goto err;switch (encap) {case L2TP_ENCAPTYPE_UDP :if (sk->sk_protocol !=IPPROTO_UDP ) {
net/l2tp/l2tp_ip.c +22 -7
@@ -24,7 +24,6 @@#include <net/icmp.h> #include <net/udp.h> #include <net/inet_common.h> -#include <net/inet_hashtables.h> #include <net/tcp_states.h> #include <net/protocol.h> #include <net/xfrm.h>
@@ -208,15 +207,31 @@ static int l2tp_ip_recv(struct sk_buff *skb)return 0 ; } -static int l2tp_ip_open (struct sock *sk) +static int l2tp_ip_hash (struct sock *sk) { -/* Prevent autobind. We don't have ports. */ -inet_sk (sk)->inet_num =IPPROTO_L2TP ; +if (sk_unhashed (sk)) { +write_lock_bh (&l2tp_ip_lock); +sk_add_node (sk, &l2tp_ip_table); +write_unlock_bh (&l2tp_ip_lock); + } +return 0 ; +} +static void l2tp_ip_unhash (struct sock *sk) +{ +if (sk_unhashed (sk)) +return ;write_lock_bh (&l2tp_ip_lock); -sk_add_node (sk, &l2tp_ip_table); +sk_del_node_init (sk);write_unlock_bh (&l2tp_ip_lock); +} + +static int l2tp_ip_open (struct sock *sk) +{ +/* Prevent autobind. We don't have ports. */ +inet_sk (sk)->inet_num =IPPROTO_L2TP ; +l2tp_ip_hash (sk);return 0 ; }
@@ -598,8 +613,8 @@ static struct proto l2tp_ip_prot = { .sendmsg = l2tp_ip_sendmsg, .recvmsg = l2tp_ip_recvmsg, .backlog_rcv = l2tp_ip_backlog_recv, - .hash = inet_hash, - .unhash = inet_unhash, + .hash = l2tp_ip_hash, + .unhash = l2tp_ip_unhash, .obj_size =sizeof (struct l2tp_ip_sock ), #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ip_setsockopt,
net/l2tp/l2tp_ip6.c +22 -8
@@ -24,8 +24,6 @@#include <net/icmp.h> #include <net/udp.h> #include <net/inet_common.h> -#include <net/inet_hashtables.h> -#include <net/inet6_hashtables.h> #include <net/tcp_states.h> #include <net/protocol.h> #include <net/xfrm.h>
@@ -221,15 +219,31 @@ static int l2tp_ip6_recv(struct sk_buff *skb)return 0 ; } -static int l2tp_ip6_open (struct sock *sk) +static int l2tp_ip6_hash (struct sock *sk) { -/* Prevent autobind. We don't have ports. */ -inet_sk (sk)->inet_num =IPPROTO_L2TP ; +if (sk_unhashed (sk)) { +write_lock_bh (&l2tp_ip6_lock); +sk_add_node (sk, &l2tp_ip6_table); +write_unlock_bh (&l2tp_ip6_lock); + } +return 0 ; +} +static void l2tp_ip6_unhash (struct sock *sk) +{ +if (sk_unhashed (sk)) +return ;write_lock_bh (&l2tp_ip6_lock); -sk_add_node (sk, &l2tp_ip6_table); +sk_del_node_init (sk);write_unlock_bh (&l2tp_ip6_lock); +} + +static int l2tp_ip6_open (struct sock *sk) +{ +/* Prevent autobind. We don't have ports. */ +inet_sk (sk)->inet_num =IPPROTO_L2TP ; +l2tp_ip6_hash (sk);return 0 ; }
@@ -732,8 +746,8 @@ static struct proto l2tp_ip6_prot = { .sendmsg = l2tp_ip6_sendmsg, .recvmsg = l2tp_ip6_recvmsg, .backlog_rcv = l2tp_ip6_backlog_recv, - .hash = inet6_hash, - .unhash = inet_unhash, + .hash = l2tp_ip6_hash, + .unhash = l2tp_ip6_unhash, .obj_size =sizeof (struct l2tp_ip6_sock ), #ifdef CONFIG_COMPAT .compat_setsockopt = compat_ipv6_setsockopt,
net/vmw_vsock/af_vsock.c +1 -1
@@ -1296,7 +1296,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags)/* Wait for children sockets to appear; these are the new sockets * created upon connection establishment. */ - timeout =sock_sndtimeo (listener, flags &O_NONBLOCK ); + timeout =sock_rcvtimeo (listener, flags &O_NONBLOCK );prepare_to_wait (sk_sleep (listener), &wait,TASK_INTERRUPTIBLE ); while ((connected = vsock_dequeue_accept(listener)) == NULL &&