Linux 4.14.249
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.14.249 kernel.
All users of the 4.14 kernel series must upgrade.
The updated 4.14.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.14.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/alpha/include/asm/io.h | 6 - arch/arm/include/asm/ftrace.h | 3 arch/arm/include/asm/insn.h | 8 +- arch/arm/include/asm/module.h | 10 +++ arch/arm/kernel/ftrace.c | 50 ++++++++++++--- arch/arm/kernel/insn.c | 19 +++--- arch/arm/kernel/module-plts.c | 49 ++++++++++++--- arch/arm64/Kconfig | 2 arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 11 ++- arch/arm64/kernel/process.c | 2 arch/arm64/mm/proc.S | 4 - arch/m68k/include/asm/raw_io.h | 20 +++--- arch/parisc/include/asm/page.h | 2 arch/sparc/kernel/mdesc.c | 3 arch/x86/xen/enlighten_pv.c | 15 ++-- drivers/cpufreq/cpufreq_governor_attr_set.c | 2 drivers/crypto/ccp/ccp-ops.c | 14 ++-- drivers/edac/synopsys_edac.c | 2 drivers/hid/hid-betopff.c | 13 +++- drivers/hid/usbhid/hid-core.c | 13 +++- drivers/hwmon/tmp421.c | 24 ++----- drivers/ipack/devices/ipoctal.c | 63 ++++++++++++++------ drivers/irqchip/irq-gic-v3-its.c | 2 drivers/mcb/mcb-core.c | 12 +-- drivers/md/md.c | 5 - drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 + drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 2 drivers/net/ethernet/cadence/macb_pci.c | 2 drivers/net/ethernet/i825xx/82596.c | 2 drivers/net/ethernet/intel/e100.c | 22 ++++--- drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 3 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 2 drivers/net/hamradio/6pack.c | 4 - drivers/net/usb/hso.c | 45 ++++++++------ drivers/pci/host/pci-aardvark.c | 64 +++++++++++++++++--- drivers/scsi/csiostor/csio_init.c | 1 drivers/scsi/scsi_transport_iscsi.c | 8 +- drivers/spi/spi-tegra20-slink.c | 4 - drivers/staging/greybus/uart.c | 62 ++++++++++--------- drivers/thermal/thermal_core.c | 7 -- drivers/tty/serial/mvebu-uart.c | 2 drivers/tty/vt/vt.c | 21 ++++++ drivers/usb/gadget/udc/r8a66597-udc.c | 2 drivers/usb/musb/tusb6010.c | 1 drivers/usb/serial/cp210x.c | 1 drivers/usb/serial/mos7840.c | 2 drivers/usb/serial/option.c | 11 +++ drivers/usb/storage/unusual_devs.h | 9 ++ drivers/usb/storage/unusual_uas.h | 2 drivers/xen/balloon.c | 62 ++++++++++++++----- fs/cifs/connect.c | 5 - fs/ext4/dir.c | 6 - fs/ocfs2/dlmglue.c | 3 fs/qnx4/dir.c | 69 ++++++++++++++++------ include/linux/compiler.h | 2 include/linux/cred.h | 14 ++-- include/net/sock.h | 2 kernel/sched/cpufreq_schedutil.c | 16 +++-- kernel/trace/blktrace.c | 8 ++ net/core/sock.c | 32 ++++++++-- net/ipv4/udp.c | 10 +-- net/ipv6/udp.c | 2 net/mac80211/tx.c | 12 +++ net/mac80211/wpa.c | 6 + net/netfilter/ipset/ip_set_hash_gen.h | 4 - net/netfilter/ipvs/ip_vs_conn.c | 4 + net/sctp/input.c | 2 net/unix/af_unix.c | 34 ++++++++-- 70 files changed, 660 insertions(+), 281 deletions(-)
Alex Sverdlin (4):
ARM: 9077/1: PLT: Move struct plt_entries definition to header
ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link()
ARM: 9079/1: ftrace: Add MODULE_PLTS support
ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE
Andrea Claudi (1):
ipvs: check that ip_vs_conn_tab_bits is between 8 and 20
Anirudh Rayabharam (1):
HID: usbhid: free raw_report buffers in usbhid_stop
Aya Levin (1):
net/mlx4_en: Don't allow aRFS for encapsulated packets
Baokun Li (1):
scsi: iscsi: Adjust iface sysfs attr detection
Carlo Lobrano (1):
USB: serial: option: add Telit LN920 compositions
Chih-Kang Chang (1):
mac80211: Fix ieee80211_amsdu_aggregate frag_tail bug
Christoph Hellwig (1):
md: fix a lock order reversal in md_alloc
Dan Carpenter (5):
usb: gadget: r8a66597: fix a loop in set_feature()
usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned()
mcb: fix error handling in mcb_alloc_bus()
thermal/core: Potential buffer overflow in thermal_build_list_of_policies()
crypto: ccp - fix resource leaks in ccp_run_aes_gcm_cmd()
Dan Li (1):
arm64: Mark __stack_chk_guard as __ro_after_init
Dongliang Mu (2):
usb: hso: fix error handling code of hso_create_net_device
usb: hso: remove the bailout parameter
Eric Dumazet (2):
af_unix: fix races in sk_peer_pid and sk_peer_cred accesses
net: udp: annotate data race around udp_sk(sk)->corkflag
Evan Wang (1):
PCI: aardvark: Fix checking for PIO status
F.A.Sulaiman (1):
HID: betop: fix slab-out-of-bounds Write in betop_probe
Greg Kroah-Hartman (1):
Linux 4.14.249
Guenter Roeck (5):
m68k: Double cast io functions to unsigned long
compiler.h: Introduce absolute_pointer macro
net: i825xx: Use absolute_pointer for memcpy from fixed memory location
alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile
net: 6pack: Fix tx timeout and slot time
Helge Deller (1):
parisc: Use absolute_pointer() to define PAGE0
Igor Matheus Andrade Torrente (1):
tty: Fix out-of-bound vmalloc access in imageblit
Jacob Keller (2):
e100: fix length calculation in e100_get_regs_len
e100: fix buffer overrun in e100_get_regs
James Morse (1):
cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory
Jan Beulich (1):
xen/x86: fix PV trap handling on secondary processors
Jesper Nilsson (1):
net: stmmac: allow CSR clock of 300MHz
Johan Hovold (7):
staging: greybus: uart: fix tty use after free
net: hso: fix muxed tty registration
ipack: ipoctal: fix stack information leak
ipack: ipoctal: fix tty registration race
ipack: ipoctal: fix tty-registration error handling
ipack: ipoctal: fix missing allocation-failure check
ipack: ipoctal: fix module reference leak
Johannes Berg (1):
mac80211: fix use-after-free in CCMP/GCMP RX
Jozsef Kadlecsik (1):
netfilter: ipset: Fix oversized kvmalloc() calls
Juergen Gross (2):
xen/balloon: use a kernel thread instead a workqueue xen/balloon: fix balloon kthread freezing
Julian Sikorski (1):
Re-enable UAS for LaCie Rugged USB3-FW with fk quirk
Kaige Fu (1):
irqchip/gic-v3-its: Fix potential VPE leak on error
Kevin Hao (1):
cpufreq: schedutil: Use kobject release() method to free sugov_tunables
Krzysztof Kozlowski (2):
USB: serial: mos7840: remove duplicated 0xac24 device ID
USB: serial: option: remove duplicate USB device ID
Linus Torvalds (4):
sparc: avoid stringop-overread errors
qnx4: avoid stringop-overread errors
spi: Fix tegra20 build with CONFIG_PM=n
qnx4: work around gcc false positive warning bug
Lorenzo Bianconi (1):
mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap
Michael Chan (1):
bnxt_en: Fix TX timeout when TX ring size is set to the smallest
NeilBrown (1):
cred: allow get_cred() and put_cred() to be given NULL.
Oliver Neukum (1):
hso: fix bailout in error case of probe
Ondrej Zary (1):
usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c
Pali Rohár (3):
serial: mvebu-uart: fix driver's tx_empty callback
arm64: dts: marvell: armada-37xx: Extend PCIe MEM space
PCI: aardvark: Fix checking for PIO Non-posted Request
Paul Fertser (1):
hwmon: (tmp421) fix rounding for negative values
Rahul Lakkireddy (1):
scsi: csiostor: Add module softdep on cxgb4
Sai Krishna Potthuri (1):
EDAC/synopsys: Fix wrong value type assignment for edac_mode
Slark Xiao (1):
USB: serial: option: add device id for Foxconn T99W265
Steve French (1):
cifs: fix incorrect check for null pointer in header_assemble
Suzuki K Poulose (1):
arm64: Extend workaround for erratum 1024718 to all versions of Cortex-A55
Tong Zhang (1):
net: macb: fix use after free on rmmod
Uwe Brandt (1):
USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter
Wengang Wang (1):
ocfs2: drop acl cache for directories too
Xin Long (1):
sctp: break out if skb_header_pointer returns NULL in sctp_rcv_ootb
Zhihao Cheng (1):
blktrace: Fix uaf in blk_trace access after removing by sysfs
yangerkun (1):
ext4: fix potential infinite loop in ext4_dx_readdir()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 14 -SUBLEVEL = 248 +SUBLEVEL = 249 EXTRAVERSION = NAME = Petit Gorille
arch/alpha/include/asm/io.h +3 -3
@@ -61,7 +61,7 @@ extern inline void set_hae(unsigned long new_hae)* Change virtual addresses to physical addresses and vv. */ #ifdef USE_48_BIT_KSEG -static inline unsigned long virt_to_phys (void *address) +static inline unsigned long virt_to_phys (volatile void *address) {return (unsigned long )address -IDENT_ADDR ; }
@@ -71,7 +71,7 @@ static inline void * phys_to_virt(unsigned long address) return (void *) (address + IDENT_ADDR); }#else -static inline unsigned long virt_to_phys (void *address) +static inline unsigned long virt_to_phys (volatile void *address) {unsigned long phys = (unsigned long )address;
@@ -112,7 +112,7 @@ static inline dma_addr_t __deprecated isa_page_to_bus(struct page *page)extern unsigned long __direct_map_base;extern unsigned long __direct_map_size; -static inline unsigned long __deprecated virt_to_bus (void *address) +static inline unsigned long __deprecated virt_to_bus (volatile void *address) {unsigned long phys =virt_to_phys (address);unsigned long bus = phys + __direct_map_base;
arch/arm/include/asm/ftrace.h +3 -0
@@ -19,6 +19,9 @@ struct dyn_arch_ftrace {#ifdef CONFIG_OLD_MCOUNT bool old_mcount;#endif +#ifdef CONFIG_ARM_MODULE_PLTS +struct module *mod; +#endif };static inline unsigned long ftrace_call_adjust (unsigned long addr)
arch/arm/include/asm/insn.h +4 -4
@@ -13,18 +13,18 @@ arm_gen_nop(void) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link); +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn);static inline unsigned long arm_gen_branch (unsigned long pc,unsigned long addr) { -return __arm_gen_branch (pc, addr, false); +return __arm_gen_branch (pc, addr, false, true); }static inline unsigned long -arm_gen_branch_link (unsigned long pc,unsigned long addr) +arm_gen_branch_link (unsigned long pc,unsigned long addr,bool warn) { -return __arm_gen_branch (pc, addr, true); +return __arm_gen_branch (pc, addr, true, warn); }#endif
arch/arm/include/asm/module.h +10 -0
@@ -19,8 +19,18 @@ enum { };#endif +#define PLT_ENT_STRIDE L1_CACHE_BYTES +#define PLT_ENT_COUNT (PLT_ENT_STRIDE / sizeof(u32)) +#define PLT_ENT_SIZE (sizeof(struct plt_entries) / PLT_ENT_COUNT) + +struct plt_entries { +u32 ldr[PLT_ENT_COUNT ]; +u32 lit[PLT_ENT_COUNT ]; +}; +struct mod_plt_sec {struct elf32_shdr *plt; +struct plt_entries *plt_ent;int plt_count; };
arch/arm/kernel/ftrace.c +40 -10
108 lines not on this page · raw message
arch/arm/kernel/insn.c +10 -9
@@ -3,8 +3,9 @@#include <linux/kernel.h> #include <asm/opcodes.h> -static unsigned long -__arm_gen_branch_thumb2 (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_thumb2 (unsigned long pc, +unsigned long addr,bool link, +bool warn) {unsigned long s, j1, j2, i1, i2, imm10, imm11;unsigned long first, second;
@@ -12,7 +13,7 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link) offset = (long )addr - (long )(pc +4 );if (offset <-16777216 || offset >16777214 ) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -33,8 +34,8 @@ __arm_gen_branch_thumb2(unsigned long pc, unsigned long addr, bool link)return __opcode_thumb32_compose (first, second); } -static unsigned long -__arm_gen_branch_arm (unsigned long pc,unsigned long addr,bool link) +static unsigned long __arm_gen_branch_arm (unsigned long pc,unsigned long addr, +bool link,bool warn) {unsigned long opcode =0xea000000 ;long offset;
@@ -44,7 +45,7 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) offset = (long )addr - (long )(pc +8 );if (unlikely (offset <-33554432 || offset >33554428 )) { -WARN_ON_ONCE (1 ); +WARN_ON_ONCE (warn);return 0 ; }
@@ -54,10 +55,10 @@ __arm_gen_branch_arm(unsigned long pc, unsigned long addr, bool link) }unsigned long -__arm_gen_branch (unsigned long pc,unsigned long addr,bool link) +__arm_gen_branch (unsigned long pc,unsigned long addr,bool link,bool warn) {if (IS_ENABLED (CONFIG_THUMB2_KERNEL )) -return __arm_gen_branch_thumb2 (pc, addr, link); +return __arm_gen_branch_thumb2 (pc, addr, link, warn);else -return __arm_gen_branch_arm (pc, addr, link); +return __arm_gen_branch_arm (pc, addr, link, warn); }
arch/arm/kernel/module-plts.c +38 -11
97 lines not on this page · raw message
arch/arm64/Kconfig +1 -1
@@ -450,7 +450,7 @@ config ARM64_ERRATUM_1024718 help This option adds work around for Arm Cortex-A55 Erratum 1024718. - Affected Cortex-A55 cores (r0p0, r0p1, r1p0) could cause incorrect + Affected Cortex-A55 cores (all revisions) could cause incorrect update of the hardware dirty bit when the DBM/AP bits are updated without a break-before-make. The work around is to disable the usage of hardware DBM locally on the affected cores. CPUs not affected by
arch/arm64/boot/dts/marvell/armada-37xx.dtsi +9 -2
@@ -347,8 +347,15 @@ #interrupt-cells = <1>; msi-parent = <&pcie0>; msi-controller; - ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x1000000 /* Port 0 MEM */ - 0x81000000 0 0xe9000000 0 0xe9000000 0 0x10000>; /* Port 0 IO*/ + /* + * The 128 MiB address range [0xe8000000-0xf0000000] is + * dedicated for PCIe and can be assigned to 8 windows + * with size a power of two. Use one 64 KiB window for + * IO at the end and the remaining seven windows + * (totaling 127 MiB) for MEM. + */ + ranges = <0x82000000 0 0xe8000000 0 0xe8000000 0 0x07f00000 /* Port 0 MEM */ + 0x81000000 0 0xefff0000 0 0xefff0000 0 0x00010000>; /* Port 0 IO */ interrupt-map-mask = <0 0 0 7>; interrupt-map = <0 0 0 1 &pcie_intc 0>, <0 0 0 2 &pcie_intc 1>,
arch/arm64/kernel/process.c +1 -1
@@ -61,7 +61,7 @@#ifdef CONFIG_CC_STACKPROTECTOR #include <linux/stackprotector.h> -unsigned long __stack_chk_guard__read_mostly ; +unsigned long __stack_chk_guard__ro_after_init ;EXPORT_SYMBOL (__stack_chk_guard);#endif
arch/arm64/mm/proc.S +2 -2
@@ -455,8 +455,8 @@ ENTRY(__cpu_setup) cmp x9, #2 b.lt 1f #ifdef CONFIG_ARM64_ERRATUM_1024718 - /* Disable hardware DBM on Cortex-A55 r0p0, r0p1 & r1p0 */ - cpu_midr_match MIDR_CORTEX_A55, MIDR_CPU_VAR_REV(0, 0), MIDR_CPU_VAR_REV(1, 0), x1, x2, x3, x4 + /* Disable hardware DBM on Cortex-A55 all versions */ + cpu_midr_match MIDR_CORTEX_A55, MIDR_CPU_VAR_REV(0, 0), MIDR_CPU_VAR_REV(0xf, 0xf), x1, x2, x3, x4 cbnz x1, 1f #endif orr x10, x10, #TCR_HD // hardware Dirty flag update
arch/m68k/include/asm/raw_io.h +10 -10
@@ -31,21 +31,21 @@ extern void __iounmap(void *addr, unsigned long size);* two accesses to memory, which may be undesirable for some devices. */ #define in_8 (addr) \ - ({ u8 __v = (*(__force volatile u8 *) (addr)); __v; }) + ({ u8 __v = (*(__force volatile u8 *) (unsigned long)(addr)); __v; })#define in_be16 (addr) \ - ({ u16 __v = (*(__force volatile u16 *) (addr)); __v; }) + ({ u16 __v = (*(__force volatile u16 *) (unsigned long)(addr)); __v; })#define in_be32 (addr) \ - ({ u32 __v = (*(__force volatile u32 *) (addr)); __v; }) + ({ u32 __v = (*(__force volatile u32 *) (unsigned long)(addr)); __v; })#define in_le16 (addr) \ - ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (addr)); __v; }) + ({ u16 __v = le16_to_cpu(*(__force volatile __le16 *) (unsigned long)(addr)); __v; })#define in_le32 (addr) \ - ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (addr)); __v; }) + ({ u32 __v = le32_to_cpu(*(__force volatile __le32 *) (unsigned long)(addr)); __v; }) -#define out_8 (addr,b) (void)((*(__force volatile u8 *) (addr)) = (b)) -#define out_be16 (addr,w) (void)((*(__force volatile u16 *) (addr)) = (w)) -#define out_be32 (addr,l) (void)((*(__force volatile u32 *) (addr)) = (l)) -#define out_le16 (addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w)) -#define out_le32 (addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l)) +#define out_8 (addr,b) (void)((*(__force volatile u8 *) (unsigned long)(addr)) = (b)) +#define out_be16 (addr,w) (void)((*(__force volatile u16 *) (unsigned long)(addr)) = (w)) +#define out_be32 (addr,l) (void)((*(__force volatile u32 *) (unsigned long)(addr)) = (l)) +#define out_le16 (addr,w) (void)((*(__force volatile __le16 *) (unsigned long)(addr)) = cpu_to_le16(w)) +#define out_le32 (addr,l) (void)((*(__force volatile __le32 *) (unsigned long)(addr)) = cpu_to_le32(l))#define raw_inb in_8#define raw_inw in_be16
arch/parisc/include/asm/page.h +1 -1
@@ -179,7 +179,7 @@ extern int npmem_ranges;#include <asm-generic/getorder.h> #include <asm/pdc.h> -#define PAGE0 ((struct zeropage *)__PAGE_OFFSET) +#define PAGE0 ((struct zeropage *)absolute_pointer(__PAGE_OFFSET))/* DEFINITION OF THE ZERO-PAGE (PAG0) */ /* based on work by Jason Eckhardt ([email protected]) */
arch/sparc/kernel/mdesc.c +2 -1
@@ -38,6 +38,7 @@ struct mdesc_hdr {u32 node_sz;/* node block size */ u32 name_sz;/* name block size */ u32 data_sz;/* data block size */ +char data[]; } __attribute__((aligned(16)));struct mdesc_elem {
@@ -611,7 +612,7 @@ EXPORT_SYMBOL(mdesc_get_node_info);static struct mdesc_elem *node_block (struct mdesc_hdr *mdesc) { -return (struct mdesc_elem *) (mdesc +1 ); +return (struct mdesc_elem *) mdesc->data; }static void *name_block (struct mdesc_hdr *mdesc)
arch/x86/xen/enlighten_pv.c +9 -6
@@ -721,8 +721,8 @@ static void xen_write_idt_entry(gate_desc *dt, int entrynum, const gate_desc *g)preempt_enable (); } -static void xen_convert_trap_info (const struct desc_ptr *desc, -struct trap_info *traps) +static unsigned xen_convert_trap_info (const struct desc_ptr *desc, +struct trap_info *traps,bool full) {unsigned in, out, count;
@@ -732,17 +732,18 @@ static void xen_convert_trap_info(const struct desc_ptr *desc,for (in = out =0 ; in < count; in++) {gate_desc *entry = (gate_desc *)(desc->address) + in; -if (cvt_gate_to_trap (in, entry, &traps[out])) +if (cvt_gate_to_trap (in, entry, &traps[out]) || full) out++; } - traps[out].address =0 ; + +return out; }void xen_copy_trap_info (struct trap_info *traps) {const struct desc_ptr *desc =this_cpu_ptr (&idt_desc); -xen_convert_trap_info (desc, traps); +xen_convert_trap_info (desc, traps, true); }/* Load a new IDT into Xen. In principle this can be per-CPU, so we
@@ -752,6 +753,7 @@ static void xen_load_idt(const struct desc_ptr *desc) {static DEFINE_SPINLOCK (lock);static struct trap_info traps[257 ]; +unsigned out;trace_xen_cpu_load_idt (desc);
@@ -759,7 +761,8 @@ static void xen_load_idt(const struct desc_ptr *desc)memcpy (this_cpu_ptr (&idt_desc), desc,sizeof (idt_desc)); -xen_convert_trap_info (desc, traps); + out =xen_convert_trap_info (desc, traps, false); +memset (&traps[out],0 ,sizeof (traps[0 ]));xen_mc_flush ();if (HYPERVISOR_set_trap_table (traps))
drivers/cpufreq/cpufreq_governor_attr_set.c +1 -1
@@ -77,8 +77,8 @@ unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *lif (count)return count; -kobject_put (&attr_set->kobj);mutex_destroy (&attr_set->update_lock); +kobject_put (&attr_set->kobj);return 0 ; }EXPORT_SYMBOL_GPL (gov_attr_set_put);
drivers/crypto/ccp/ccp-ops.c +8 -6
@@ -783,7 +783,7 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) in_place ?DMA_BIDIRECTIONAL : DMA_TO_DEVICE);if (ret) - goto e_ctx; + goto e_aad;if (in_place) { dst = src;
@@ -868,7 +868,7 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) op.u.aes.size =0 ; ret = cmd_q->ccp->vdata->perform->aes (&op);if (ret) - goto e_dst; + goto e_final_wa;if (aes->action ==CCP_AES_ACTION_ENCRYPT ) {/* Put the ciphered tag after the ciphertext. */
@@ -878,17 +878,19 @@ ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd) ret =ccp_init_dm_workarea (&tag, cmd_q, authsize,DMA_BIDIRECTIONAL );if (ret) - goto e_tag; + goto e_final_wa; ret =ccp_set_dm_area (&tag,0 , p_tag,0 , authsize); -if (ret) - goto e_tag; +if (ret) { +ccp_dm_free (&tag); + goto e_final_wa; + } ret =crypto_memneq (tag.address, final_wa.address, authsize) ? -EBADMSG :0 ;ccp_dm_free (&tag); } -e_tag: +e_final_wa:ccp_dm_free (&final_wa); e_dst:
drivers/edac/synopsys_edac.c +1 -1
@@ -371,7 +371,7 @@ static int synps_edac_init_csrows(struct mem_ctl_info *mci)for (j =0 ; j < csi->nr_channels; j++) { dimm = csi->channels[j]->dimm; - dimm->edac_mode =EDAC_FLAG_SECDED ; + dimm->edac_mode =EDAC_SECDED ; dimm->mtype =synps_edac_get_mtype (priv->baseaddr); dimm->nr_pages = (size >>PAGE_SHIFT ) / csi->nr_channels; dimm->grain =SYNPS_EDAC_ERR_GRAIN ;
drivers/hid/hid-betopff.c +10 -3
@@ -59,15 +59,22 @@ static int betopff_init(struct hid_device *hid) {struct betopff_device *betopff;struct hid_report *report; -struct hid_input *hidinput = - list_first_entry(&hid->inputs, struct hid_input, list); +struct hid_input *hidinput;struct list_head *report_list = &hid->report_enum[HID_OUTPUT_REPORT ].report_list; -struct input_dev *dev = hidinput->input; +struct input_dev *dev;int field_count =0 ;int error;int i, j; +if (list_empty (&hid->inputs)) { +hid_err (hid,"no inputs found\n" ); +return -ENODEV ; + } + + hidinput = list_first_entry(&hid->inputs, struct hid_input, list); + dev = hidinput->input; +if (list_empty (report_list)) {hid_err (hid,"no output reports found\n" );return -ENODEV ;
drivers/hid/usbhid/hid-core.c +12 -1
@@ -501,7 +501,7 @@ static void hid_ctrl(struct urb *urb)if (unplug) { usbhid->ctrltail = usbhid->ctrlhead; - }else { + }else if (usbhid->ctrlhead != usbhid->ctrltail) { usbhid->ctrltail = (usbhid->ctrltail +1 ) & (HID_CONTROL_FIFO_SIZE -1 ); if (usbhid->ctrlhead != usbhid->ctrltail &&
@@ -1214,9 +1214,20 @@ static void usbhid_stop(struct hid_device *hid)mutex_lock (&usbhid->mutex);clear_bit (HID_STARTED , &usbhid->iofl); +spin_lock_irq (&usbhid->lock);/* Sync with error and led handlers */ set_bit (HID_DISCONNECTED , &usbhid->iofl); +while (usbhid->ctrltail != usbhid->ctrlhead) { +if (usbhid->ctrl[usbhid->ctrltail].dir ==USB_DIR_OUT ) { +kfree (usbhid->ctrl[usbhid->ctrltail].raw_report); + usbhid->ctrl[usbhid->ctrltail].raw_report =NULL ; + } + + usbhid->ctrltail = (usbhid->ctrltail +1 ) & + (HID_CONTROL_FIFO_SIZE -1 ); + }spin_unlock_irq (&usbhid->lock); +usb_kill_urb (usbhid->urbin);usb_kill_urb (usbhid->urbout);usb_kill_urb (usbhid->urbctrl);
drivers/hwmon/tmp421.c +8 -16
@@ -109,23 +109,17 @@ struct tmp421_data {s16 temp[4 ]; }; -static int temp_from_s16 (s16 reg) +static int temp_from_raw (u16 reg,bool extended) {/* Mask out status bits */ int temp = reg & ~0xf ; -return (temp *1000 +128 ) /256 ; -} - -static int temp_from_u16 (u16 reg) -{ -/* Mask out status bits */ -int temp = reg & ~0xf ; - -/* Add offset for extended temperature range. */ - temp -=64 *256 ; +if (extended) + temp = temp -64 *256 ; +else + temp = (s16 )temp; -return (temp *1000 +128 ) /256 ; +return DIV_ROUND_CLOSEST (temp *1000 ,256 ); }static struct tmp421_data *tmp421_update_device (struct device *dev)
@@ -162,10 +156,8 @@ static int tmp421_read(struct device *dev, enum hwmon_sensor_types type,switch (attr) {case hwmon_temp_input: -if (tmp421->config &TMP421_CONFIG_RANGE ) - *val =temp_from_u16 (tmp421->temp[channel]); -else - *val =temp_from_s16 (tmp421->temp[channel]); + *val =temp_from_raw (tmp421->temp[channel], + tmp421->config &TMP421_CONFIG_RANGE );return 0 ;case hwmon_temp_fault:/*
drivers/ipack/devices/ipoctal.c +47 -16
142 lines not on this page · raw message
drivers/irqchip/irq-gic-v3-its.c +1 -1
@@ -2730,7 +2730,7 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virqif (err) {if (i >0 ) -its_vpe_irq_domain_free (domain, virq, i -1 ); +its_vpe_irq_domain_free (domain, virq, i);its_lpi_free_chunks (bitmap, base, nr_ids);its_free_prop_table (vprop_page);
drivers/mcb/mcb-core.c +6 -6
@@ -280,8 +280,8 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier) bus_nr =ida_simple_get (&mcb_ida,0 ,0 ,GFP_KERNEL );if (bus_nr <0 ) { - rc = bus_nr; - goto err_free; +kfree (bus); +return ERR_PTR (bus_nr); } bus->bus_nr = bus_nr;
@@ -296,12 +296,12 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)dev_set_name (&bus->dev,"mcb:%d" , bus_nr); rc =device_add (&bus->dev);if (rc) - goto err_free; + goto err_put;return bus; -err_free: -put_device (carrier); -kfree (bus); + +err_put: +put_device (&bus->dev);return ERR_PTR (rc); }EXPORT_SYMBOL_GPL (mcb_alloc_bus);
drivers/md/md.c +0 -5
@@ -5375,10 +5375,6 @@ static int md_alloc(dev_t dev, char *name)*/ disk->flags |=GENHD_FL_EXT_DEVT ; mddev->gendisk = disk; -/* As soon as we call add_disk(), another thread could get -* through to md_open, so make sure it doesn't get too far -*/ -mutex_lock (&mddev->open_mutex);add_disk (disk); error = kobject_init_and_add(&mddev->kobj, &md_ktype,
@@ -5394,7 +5390,6 @@ static int md_alloc(dev_t dev, char *name)if (mddev->kobj.sd &&sysfs_create_group (&mddev->kobj, &md_bitmap_group))pr_debug ("pointless warning\n" ); -mutex_unlock (&mddev->open_mutex); abort:mutex_unlock (&disks_mutex);if (!error && mddev->kobj.sd) {
drivers/net/ethernet/broadcom/bnxt/bnxt.c +4 -4
@@ -278,7 +278,7 @@ static bool bnxt_txr_netif_try_stop_queue(struct bnxt *bp,* netif_tx_queue_stopped(). */ smp_mb (); -if (bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh) { +if (bnxt_tx_avail (bp, txr) >= bp->tx_wake_thresh) {netif_tx_wake_queue (txq);return false; }
@@ -609,7 +609,7 @@ static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts)smp_mb ();if (unlikely (netif_tx_queue_stopped (txq)) && -bnxt_tx_avail (bp, txr) > bp->tx_wake_thresh && +bnxt_tx_avail (bp, txr) >= bp->tx_wake_thresh &&READ_ONCE (txr->dev_state) !=BNXT_DEV_STATE_CLOSING )netif_tx_wake_queue (txq); }
@@ -1888,7 +1888,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)if (TX_CMP_TYPE (txcmp) ==CMP_TYPE_TX_L2_CMP ) { tx_pkts++;/* return full budget so NAPI will complete. */ -if (unlikely (tx_pkts > bp->tx_wake_thresh)) { +if (unlikely (tx_pkts >= bp->tx_wake_thresh)) { rx_pkts = budget; raw_cons =NEXT_RAW_CMP (raw_cons);break ;
@@ -2662,7 +2662,7 @@ static int bnxt_init_tx_rings(struct bnxt *bp)u16 i; bp->tx_wake_thresh =max_t (int, bp->tx_ring_size /2 , -MAX_SKB_FRAGS +1 ); +BNXT_MIN_TX_DESC_CNT );for (i =0 ; i < bp->tx_nr_rings; i++) {struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
drivers/net/ethernet/broadcom/bnxt/bnxt.h +5 -0
@@ -477,6 +477,11 @@ struct rx_tpa_end_cmp_ext {#define BNXT_MAX_RX_JUM_DESC_CNT (RX_DESC_CNT * MAX_RX_AGG_PAGES - 1)#define BNXT_MAX_TX_DESC_CNT (TX_DESC_CNT * MAX_TX_PAGES - 1) +/* Minimum TX BDs for a TX packet with MAX_SKB_FRAGS + 1. We need one extra +* BD because the first TX BD is always a long BD. +*/ +#define BNXT_MIN_TX_DESC_CNT (MAX_SKB_FRAGS + 2) +#define RX_RING (x) (((x) & ~(RX_DESC_CNT - 1)) >> (BNXT_PAGE_SHIFT - 4))#define RX_IDX (x) ((x) & (RX_DESC_CNT - 1))
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +1 -1
@@ -348,7 +348,7 @@ static int bnxt_set_ringparam(struct net_device *dev,if ((ering->rx_pending >BNXT_MAX_RX_DESC_CNT ) || (ering->tx_pending >BNXT_MAX_TX_DESC_CNT ) || - (ering->tx_pending <=MAX_SKB_FRAGS )) + (ering->tx_pending <BNXT_MIN_TX_DESC_CNT ))return -EINVAL ;if (netif_running (dev))
drivers/net/ethernet/cadence/macb_pci.c +1 -1
@@ -123,9 +123,9 @@ static void macb_remove(struct pci_dev *pdev)struct platform_device *plat_dev =pci_get_drvdata (pdev);struct macb_platform_data *plat_data =dev_get_platdata (&plat_dev->dev); -platform_device_unregister (plat_dev);clk_unregister (plat_data->pclk);clk_unregister (plat_data->hclk); +platform_device_unregister (plat_dev); }static const struct pci_device_id dev_id_table[] = {
drivers/net/ethernet/i825xx/82596.c +1 -1
@@ -1155,7 +1155,7 @@ struct net_device * __init i82596_probe(int unit) err = -ENODEV ; goto out; } -memcpy (eth_addr, (void *)0xfffc1f2c ,ETH_ALEN );/* YUCK! Get addr from NOVRAM */ +memcpy (eth_addr,absolute_pointer (0xfffc1f2c ),ETH_ALEN );/* YUCK! Get addr from NOVRAM */ dev->base_addr =MVME_I596_BASE ; dev->irq = (unsigned ) MVME16x_IRQ_I596; goto found;
drivers/net/ethernet/intel/e100.c +15 -7
@@ -2459,11 +2459,15 @@ static void e100_get_drvinfo(struct net_device *netdev, sizeof(info->bus_info)); } -#define E100_PHY_REGS 0x1C +#define E100_PHY_REGS 0x1Dstatic int e100_get_regs_len (struct net_device *netdev) {struct nic *nic =netdev_priv (netdev); -return 1 +E100_PHY_REGS +sizeof (nic->mem->dump_buf); + +/* We know the number of registers, and the size of the dump buffer. +* Calculate the total size in bytes. +*/ +return (1 +E100_PHY_REGS ) *sizeof (u32) +sizeof (nic->mem->dump_buf); } static void e100_get_regs(struct net_device *netdev,
@@ -2477,14 +2481,18 @@ static void e100_get_regs(struct net_device *netdev, buff[0 ] =ioread8 (&nic->csr->scb.cmd_hi) <<24 |ioread8 (&nic->csr->scb.cmd_lo) <<16 |ioread16 (&nic->csr->scb.status); -for (i =E100_PHY_REGS ; i >=0 ; i--) - buff[1 +E100_PHY_REGS - i] = -mdio_read (netdev, nic->mii.phy_id, i); +for (i =0 ; i <E100_PHY_REGS ; i++) +/* Note that we read the registers in reverse order. This +* ordering is the ABI apparently used by ethtool and other +* applications. +*/ + buff[1 + i] =mdio_read (netdev, nic->mii.phy_id, +E100_PHY_REGS -1 - i);memset (nic->mem->dump_buf,0 ,sizeof (nic->mem->dump_buf));e100_exec_cb (nic,NULL , e100_dump);msleep (10 ); -memcpy (&buff[2 +E100_PHY_REGS ], nic->mem->dump_buf, -sizeof (nic->mem->dump_buf)); +memcpy (&buff[1 +E100_PHY_REGS ], nic->mem->dump_buf, +sizeof (nic->mem->dump_buf)); }static void e100_get_wol (struct net_device *netdev,struct ethtool_wolinfo *wol)
drivers/net/ethernet/mellanox/mlx4/en_netdev.c +3 -0
@@ -363,6 +363,9 @@ mlx4_en_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,int nhoff =skb_network_offset (skb);int ret =0 ; +if (skb->encapsulation) +return -EPROTONOSUPPORT ; +if (skb->protocol !=htons (ETH_P_IP ))return -EPROTONOSUPPORT ;
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -1
@@ -232,7 +232,7 @@ static void stmmac_clk_csr_set(struct stmmac_priv *priv) priv->clk_csr =STMMAC_CSR_100_150M ; else if ((clk_rate >= CSR_F_150M) && (clk_rate < CSR_F_250M)) priv->clk_csr = STMMAC_CSR_150_250M; - else if ((clk_rate >= CSR_F_250M) && (clk_rate < CSR_F_300M)) + else if ((clk_rate >= CSR_F_250M) && (clk_rate <= CSR_F_300M)) priv->clk_csr = STMMAC_CSR_250_300M; }
drivers/net/hamradio/6pack.c +2 -2
@@ -68,9 +68,9 @@#define SIXP_DAMA_OFF 0/* default level 2 parameters */ -#define SIXP_TXDELAY (HZ/4)/* in 1 s */ +#define SIXP_TXDELAY 25/* 250 ms */ #define SIXP_PERSIST 50/* in 256ths */ -#define SIXP_SLOTTIME (HZ/10)/* in 1 s */ +#define SIXP_SLOTTIME 10/* 100 ms */ #define SIXP_INIT_RESYNC_TIMEOUT (3*HZ/2)/* in 1 s */ #define SIXP_RESYNC_TIMEOUT 5*HZ/* in 1 s */
drivers/net/usb/hso.c +28 -17
106 lines not on this page · raw message
drivers/pci/host/pci-aardvark.c +55 -9
112 lines not on this page · raw message
drivers/scsi/csiostor/csio_init.c +1 -0
@@ -1260,3 +1260,4 @@ MODULE_DEVICE_TABLE(pci, csio_pci_tbl);MODULE_VERSION (CSIO_DRV_VERSION );MODULE_FIRMWARE (FW_FNAME_T5 );MODULE_FIRMWARE (FW_FNAME_T6 ); +MODULE_SOFTDEP ("pre: cxgb4" );
drivers/scsi/scsi_transport_iscsi.c +4 -4
@@ -429,9 +429,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,struct iscsi_transport *t = iface->transport;int param =-1 ; -if (attr == &dev_attr_iface_enabled.attr) - param =ISCSI_NET_PARAM_IFACE_ENABLE ; -else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr) +if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr) param =ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO ;else if (attr == &dev_attr_iface_header_digest.attr) param =ISCSI_IFACE_PARAM_HDRDGST_EN ;
@@ -471,7 +469,9 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,if (param !=-1 )return t->attr_is_visible (ISCSI_IFACE_PARAM , param); -if (attr == &dev_attr_iface_vlan_id.attr) +if (attr == &dev_attr_iface_enabled.attr) + param =ISCSI_NET_PARAM_IFACE_ENABLE ; +else if (attr == &dev_attr_iface_vlan_id.attr) param =ISCSI_NET_PARAM_VLAN_ID ;else if (attr == &dev_attr_iface_vlan_priority.attr) param =ISCSI_NET_PARAM_VLAN_PRIORITY ;
drivers/spi/spi-tegra20-slink.c +2 -2
@@ -1210,7 +1210,7 @@ static int tegra_slink_resume(struct device *dev) }#endif -static int tegra_slink_runtime_suspend (struct device *dev) +static int __maybe_unused tegra_slink_runtime_suspend (struct device *dev) {struct spi_master *master =dev_get_drvdata (dev);struct tegra_slink_data *tspi =spi_master_get_devdata (master);
@@ -1222,7 +1222,7 @@ static int tegra_slink_runtime_suspend(struct device *dev)return 0 ; } -static int tegra_slink_runtime_resume (struct device *dev) +static int __maybe_unused tegra_slink_runtime_resume (struct device *dev) {struct spi_master *master =dev_get_drvdata (dev);struct tegra_slink_data *tspi =spi_master_get_devdata (master);
drivers/staging/greybus/uart.c +32 -30
135 lines not on this page · raw message
drivers/thermal/thermal_core.c +3 -4
@@ -231,15 +231,14 @@ int thermal_build_list_of_policies(char *buf) {struct thermal_governor *pos;ssize_t count =0 ; -ssize_t size =PAGE_SIZE ;mutex_lock (&thermal_governor_lock);list_for_each_entry (pos, &thermal_governor_list, governor_list) { - size =PAGE_SIZE - count; - count +=scnprintf (buf + count, size,"%s " , pos->name); + count +=scnprintf (buf + count,PAGE_SIZE - count,"%s " , + pos->name); } - count +=scnprintf (buf + count, size,"\n" ); + count +=scnprintf (buf + count,PAGE_SIZE - count,"\n" );mutex_unlock (&thermal_governor_lock);
drivers/tty/serial/mvebu-uart.c +1 -1
@@ -108,7 +108,7 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port) st =readl (port->membase +UART_STAT );spin_unlock_irqrestore (&port->lock, flags); -return (st &STAT_TX_FIFO_EMP ) ?TIOCSER_TEMT :0 ; +return (st &STAT_TX_EMP ) ?TIOCSER_TEMT :0 ; }static unsigned int mvebu_uart_get_mctrl (struct uart_port *port)
drivers/tty/vt/vt.c +19 -2
@@ -883,8 +883,25 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc, new_row_size = new_cols <<1 ; new_screen_size = new_row_size * new_rows; -if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) -return 0 ; +if (new_cols == vc->vc_cols && new_rows == vc->vc_rows) { +/* +* This function is being called here to cover the case +* where the userspace calls the FBIOPUT_VSCREENINFO twice, +* passing the same fb_var_screeninfo containing the fields +* yres/xres equal to a number non-multiple of vc_font.height +* and yres_virtual/xres_virtual equal to number lesser than the +* vc_font.height and yres/xres. +* In the second call, the struct fb_var_screeninfo isn't +* being modified by the underlying driver because of the +* if above, and this causes the fbcon_display->vrows to become +* negative and it eventually leads to out-of-bound +* access by the imageblit function. +* To give the correct values to the struct and to not have +* to deal with possible errors from the code below, we call +* the resize_screen here as well. +*/ +return resize_screen (vc, new_cols, new_rows, user); + }if (new_screen_size >KMALLOC_MAX_SIZE || !new_screen_size)return -EINVAL ;
drivers/usb/gadget/udc/r8a66597-udc.c +1 -1
@@ -1253,7 +1253,7 @@ static void set_feature(struct r8a66597 *r8a66597, struct usb_ctrlrequest *ctrl)do { tmp =r8a66597_read (r8a66597,INTSTS0 ) &CTSQ ;udelay (1 ); - }while (tmp !=CS_IDST || timeout-- >0 ); + }while (tmp !=CS_IDST && timeout-- >0 );if (tmp ==CS_IDST ) r8a66597_bset(r8a66597,
drivers/usb/musb/tusb6010.c +1 -0
@@ -193,6 +193,7 @@ tusb_fifo_write_unaligned(void __iomem *fifo, const u8 *buf, u16 len) }if (len >0 ) {/* Write the rest 1 - 3 bytes to FIFO */ + val =0 ;memcpy (&val, buf, len);musb_writel (fifo,0 , val); }
drivers/usb/serial/cp210x.c +1 -0
@@ -237,6 +237,7 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */ { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */ { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ + { USB_DEVICE(0x2184, 0x0030) }, /* GW Instek GDM-834x Digital Multimeter */ { USB_DEVICE(0x2626, 0xEA60) }, /* Aruba Networks 7xxx USB Serial Console */ { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */
drivers/usb/serial/mos7840.c +0 -2
@@ -126,7 +126,6 @@#define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44#define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03 -#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24/* This driver also supports * ATEN UC2324 device using Moschip MCS7840
@@ -207,7 +206,6 @@ static const struct usb_device_id id_table[] = { {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)}, - {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, {USB_DEVICE(USB_VENDOR_ID_MOXA, MOXA_DEVICE_ID_2210)},
drivers/usb/serial/option.c +10 -1
@@ -1208,6 +1208,14 @@ static const struct usb_device_id option_ids[] = { .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff), /* Telit FD980 */ .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff), /* Telit LN920 (rmnet) */ + .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff), /* Telit LN920 (MBIM) */ + .driver_info = NCTRL(0) | RSVD(1) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1062, 0xff), /* Telit LN920 (RNDIS) */ + .driver_info = NCTRL(2) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1063, 0xff), /* Telit LN920 (ECM) */ + .driver_info = NCTRL(0) | RSVD(1) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
@@ -1653,7 +1661,6 @@ static const struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0060, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff), .driver_info = RSVD(1) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff),
@@ -2070,6 +2077,8 @@ static const struct usb_device_id option_ids[] = { .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, + { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ + .driver_info = RSVD(3) }, { USB_DEVICE(0x1508, 0x1001), /* Fibocom NL668 (IOT version) */ .driver_info = RSVD(4) | RSVD(5) | RSVD(6) }, { USB_DEVICE(0x2cb7, 0x0104), /* Fibocom NL678 series */
drivers/usb/storage/unusual_devs.h +8 -1
@@ -435,9 +435,16 @@ UNUSUAL_DEV( 0x04cb, 0x0100, 0x0000, 0x2210, USB_SC_UFI, USB_PR_DEVICE, NULL, US_FL_FIX_INQUIRY | US_FL_SINGLE_LUN),/* -* Reported by Ondrej Zary <[email protected]> +* Reported by Ondrej Zary <[email protected]> * The device reports one sector more and breaks when that sector is accessed +* Firmwares older than 2.6c (the latest one and the only that claims Linux +* support) have also broken tag handling */ +UNUSUAL_DEV (0x04ce ,0x0002 ,0x0000 ,0x026b , +"ScanLogic" , +"SL11R-IDE" , +USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , +US_FL_FIX_CAPACITY |US_FL_BULK_IGNORE_TAG ), UNUSUAL_DEV( 0x04ce, 0x0002, 0x026c, 0x026c, "ScanLogic", "SL11R-IDE",
drivers/usb/storage/unusual_uas.h +1 -1
@@ -63,7 +63,7 @@ UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999,"LaCie" ,"Rugged USB3-FW" ,USB_SC_DEVICE ,USB_PR_DEVICE ,NULL , - US_FL_IGNORE_UAS), + US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),/* * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
drivers/xen/balloon.c +45 -17
137 lines not on this page · raw message
fs/cifs/connect.c +3 -2
@@ -3079,9 +3079,10 @@ cifs_match_super(struct super_block *sb, void *data)spin_lock (&cifs_tcp_ses_lock); cifs_sb =CIFS_SB (sb); tlink =cifs_get_tlink (cifs_sb_master_tlink (cifs_sb)); -if (IS_ERR (tlink)) { +if (tlink ==NULL ) { +/* can not match superblock if tlink were ever null */ spin_unlock (&cifs_tcp_ses_lock); -return rc; +return 0 ; } tcon =tlink_tcon (tlink); ses = tcon->ses;
fs/ext4/dir.c +3 -3
@@ -532,7 +532,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx)struct dir_private_info *info = file->private_data;struct inode *inode =file_inode (file);struct fname *fname; -int ret; +int ret =0 ;if (!info) { info =ext4_htree_create_dir_info (file, ctx->pos);
@@ -580,7 +580,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx) info->curr_minor_hash, &info->next_hash);if (ret <0 ) -return ret; + goto finished;if (ret ==0 ) { ctx->pos =ext4_get_htree_eof (file);break ;
@@ -611,7 +611,7 @@ static int ext4_dx_readdir(struct file *file, struct dir_context *ctx) } finished: info->last_pos = ctx->pos; -return 0 ; +return ret <0 ? ret :0 ; }static int ext4_dir_open (struct inode * inode,struct file * filp)
fs/ocfs2/dlmglue.c +2 -1
@@ -3705,7 +3705,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres, oi =OCFS2_I (inode); oi->ip_dir_lock_gen++;mlog (0 ,"generation: %u\n" , oi->ip_dir_lock_gen); - goto out; + goto out_forget; }if (!S_ISREG (inode->i_mode))
@@ -3736,6 +3736,7 @@ static int ocfs2_data_convert_worker(struct ocfs2_lock_res *lockres,filemap_fdatawait (mapping); } +out_forget:forget_all_cached_acls (inode); out:
fs/qnx4/dir.c +52 -17
92 lines not on this page · raw message
include/linux/compiler.h +2 -0
@@ -152,6 +152,8 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val, (typeof(ptr)) (__ptr + (off)); })#endif +#define absolute_pointer (val) RELOC_HIDE((void *)(val), 0) +#ifndef OPTIMIZER_HIDE_VAR #define OPTIMIZER_HIDE_VAR (var) barrier()#endif
include/linux/cred.h +9 -5
@@ -235,7 +235,7 @@ static inline struct cred *get_new_cred(struct cred *cred)* @cred: The credentials to reference * * Get a reference on the specified set of credentials. The caller must -* release the reference. +* release the reference. If %NULL is passed, it is returned with no action. * * This is used to deal with a committed set of credentials. Although the * pointer is const, this will temporarily discard the const and increment the
@@ -246,6 +246,8 @@ static inline struct cred *get_new_cred(struct cred *cred)static inline const struct cred *get_cred (const struct cred *cred) {struct cred *nonconst_cred = (struct cred *) cred; +if (!cred) +return cred;validate_creds (cred); nonconst_cred->non_rcu =0 ;return get_new_cred (nonconst_cred);
@@ -256,7 +258,7 @@ static inline const struct cred *get_cred(const struct cred *cred)* @cred: The credentials to release * * Release a reference to a set of credentials, deleting them when the last ref -* is released. +* is released. If %NULL is passed, nothing is done. * * This takes a const pointer to a set of credentials because the credentials * on task_struct are attached by const pointers to prevent accidental
@@ -266,9 +268,11 @@ static inline void put_cred(const struct cred *_cred) {struct cred *cred = (struct cred *) _cred; -validate_creds (cred); -if (atomic_dec_and_test (&(cred)->usage)) -__put_cred (cred); +if (cred) { +validate_creds (cred); +if (atomic_dec_and_test (&(cred)->usage)) +__put_cred (cred); + } }/**
include/net/sock.h +2 -0
@@ -454,8 +454,10 @@ struct sock {u32 sk_ack_backlog;u32 sk_max_ack_backlog;kuid_t sk_uid; +spinlock_t sk_peer_lock;struct pid *sk_peer_pid;const struct cred *sk_peer_cred; +long sk_rcvtimeo;ktime_t sk_stamp;#if BITS_PER_LONG ==32
kernel/sched/cpufreq_schedutil.c +11 -5
@@ -441,9 +441,17 @@ static struct attribute *sugov_attributes[] = {NULL }; +static void sugov_tunables_free (struct kobject *kobj) +{ + struct gov_attr_set *attr_set = container_of(kobj, struct gov_attr_set, kobj); + +kfree (to_sugov_tunables (attr_set)); +} +static struct kobj_type sugov_tunables_ktype = { .default_attrs = sugov_attributes, .sysfs_ops = &governor_sysfs_ops, + .release = &sugov_tunables_free, };/********************** cpufreq governor interface *********************/
@@ -534,12 +542,10 @@ static struct sugov_tunables *sugov_tunables_alloc(struct sugov_policy *sg_policreturn tunables; } -static void sugov_tunables_free (struct sugov_tunables *tunables) +static void sugov_clear_global_tunables (void ) {if (!have_governor_per_policy ()) global_tunables =NULL ; - -kfree (tunables); }static int sugov_init (struct cpufreq_policy *policy)
@@ -602,7 +608,7 @@ static int sugov_init(struct cpufreq_policy *policy) fail:kobject_put (&tunables->attr_set.kobj); policy->governor_data =NULL ; -sugov_tunables_free (tunables); +sugov_clear_global_tunables (); stop_kthread:sugov_kthread_stop (sg_policy);
@@ -629,7 +635,7 @@ static void sugov_exit(struct cpufreq_policy *policy) count =gov_attr_set_put (&tunables->attr_set, &sg_policy->tunables_hook); policy->governor_data =NULL ;if (!count) -sugov_tunables_free (tunables); +sugov_clear_global_tunables ();mutex_unlock (&global_tunables_lock);
kernel/trace/blktrace.c +8 -0
@@ -1679,6 +1679,14 @@ static int blk_trace_remove_queue(struct request_queue *q)if (bt ==NULL )return -EINVAL ; +if (bt->trace_state == Blktrace_running) { + bt->trace_state = Blktrace_stopped; +spin_lock_irq (&running_trace_lock); +list_del_init (&bt->running_list); +spin_unlock_irq (&running_trace_lock); +relay_flush (bt->rchan); + } +put_probe_ref ();synchronize_rcu ();blk_trace_free (bt);
net/core/sock.c +26 -6
@@ -1069,6 +1069,16 @@ int sock_setsockopt(struct socket *sock, int level, int optname, }EXPORT_SYMBOL (sock_setsockopt); +static const struct cred *sk_get_peer_cred (struct sock *sk) +{ +const struct cred *cred; + +spin_lock (&sk->sk_peer_lock); + cred =get_cred (sk->sk_peer_cred); +spin_unlock (&sk->sk_peer_lock); + +return cred; +}static void cred_to_ucred (struct pid *pid,const struct cred *cred,struct ucred *ucred)
@@ -1242,7 +1252,11 @@ int sock_getsockopt(struct socket *sock, int level, int optname,struct ucred peercred;if (len >sizeof (peercred)) len =sizeof (peercred); + +spin_lock (&sk->sk_peer_lock);cred_to_ucred (sk->sk_peer_pid, sk->sk_peer_cred, &peercred); +spin_unlock (&sk->sk_peer_lock); +if (copy_to_user (optval, &peercred, len))return -EFAULT ; goto lenout;
@@ -1250,20 +1264,23 @@ int sock_getsockopt(struct socket *sock, int level, int optname,case SO_PEERGROUPS : { +const struct cred *cred;int ret, n; -if (!sk->sk_peer_cred) + cred =sk_get_peer_cred (sk); +if (!cred)return -ENODATA ; - n = sk->sk_peer_cred->group_info->ngroups; + n = cred->group_info->ngroups;if (len < n *sizeof (gid_t)) { len = n *sizeof (gid_t); +put_cred (cred);return put_user (len, optlen) ? -EFAULT : -ERANGE ; } len = n *sizeof (gid_t); - ret =groups_to_user ((gid_t __user *)optval, - sk->sk_peer_cred->group_info); + ret =groups_to_user ((gid_t __user *)optval, cred->group_info); +put_cred (cred);if (ret)return ret; goto lenout;
@@ -1574,9 +1591,10 @@ static void __sk_destruct(struct rcu_head *head) sk->sk_frag.page =NULL ; } -if (sk->sk_peer_cred) -put_cred (sk->sk_peer_cred); +/* We do not need to acquire sk->sk_peer_lock, we are the last user. */ +put_cred (sk->sk_peer_cred);put_pid (sk->sk_peer_pid); +if (likely (sk->sk_net_refcnt))put_net (sock_net (sk));sk_prot_free (sk->sk_prot_creator, sk);
@@ -2753,6 +2771,8 @@ void sock_init_data(struct socket *sock, struct sock *sk) sk->sk_peer_pid =NULL ; sk->sk_peer_cred =NULL ; +spin_lock_init (&sk->sk_peer_lock); + sk->sk_write_pending =0 ; sk->sk_rcvlowat =1 ; sk->sk_rcvtimeo =MAX_SCHEDULE_TIMEOUT ;
net/ipv4/udp.c +5 -5
@@ -882,7 +882,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)__be16 dport;u8 tos;int err, is_udplite =IS_UDPLITE (sk); -int corkreq = up->corkflag || msg->msg_flags&MSG_MORE ; +int corkreq =READ_ONCE (up->corkflag) || msg->msg_flags&MSG_MORE ;int (*getfrag)(void *,char *,int ,int ,int ,struct sk_buff *);struct sk_buff *skb;struct ip_options_data opt_copy;
@@ -1165,7 +1165,7 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset, } up->len += size; -if (!(up->corkflag || (flags&MSG_MORE ))) +if (!(READ_ONCE (up->corkflag) || (flags&MSG_MORE ))) ret =udp_push_pending_frames (sk);if (!ret) ret = size;
@@ -2373,9 +2373,9 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,switch (optname) {case UDP_CORK :if (val !=0 ) { - up->corkflag =1 ; +WRITE_ONCE (up->corkflag,1 ); }else { - up->corkflag =0 ; +WRITE_ONCE (up->corkflag,0 );lock_sock (sk);push_pending_frames (sk);release_sock (sk);
@@ -2482,7 +2482,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,switch (optname) {case UDP_CORK : - val = up->corkflag; + val =READ_ONCE (up->corkflag);break ;case UDP_ENCAP :
net/ipv6/udp.c +1 -1
@@ -1135,7 +1135,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)struct ipcm6_cookie ipc6;int addr_len = msg->msg_namelen;int ulen = len; -int corkreq = up->corkflag || msg->msg_flags&MSG_MORE ; +int corkreq =READ_ONCE (up->corkflag) || msg->msg_flags&MSG_MORE ;int err;int connected =0 ;int is_udplite =IS_UDPLITE (sk);
net/mac80211/tx.c +12 -0
@@ -2068,7 +2068,11 @@ static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local, } vht_mcs = iterator.this_arg[4 ] >>4 ; +if (vht_mcs >11 ) + vht_mcs =0 ; vht_nss = iterator.this_arg[4 ] &0xF ; +if (!vht_nss || vht_nss >8 ) + vht_nss =1 ;break ;/*
@@ -3202,6 +3206,14 @@ static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata,if (!ieee80211_amsdu_prepare_head (sdata, fast_tx, head)) goto out; +/* If n == 2, the "while (*frag_tail)" loop above didn't execute +* and frag_tail should be &skb_shinfo(head)->frag_list. +* However, ieee80211_amsdu_prepare_head() can reallocate it. +* Reload frag_tail to have it pointing to the correct place. +*/ +if (n ==2 ) + frag_tail = &skb_shinfo (head)->frag_list; +/* * Pad out the previous subframe to a multiple of 4 by adding the * padding to the next one, that's being added. Note that head->len
net/mac80211/wpa.c +6 -0
@@ -514,6 +514,9 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,return RX_DROP_UNUSABLE ; } +/* reload hdr - skb might have been reallocated */ + hdr = (void *)rx->skb->data; + data_len = skb->len - hdrlen -IEEE80211_CCMP_HDR_LEN - mic_len;if (!rx->sta || data_len <0 )return RX_DROP_UNUSABLE ;
@@ -744,6 +747,9 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)return RX_DROP_UNUSABLE ; } +/* reload hdr - skb might have been reallocated */ + hdr = (void *)rx->skb->data; + data_len = skb->len - hdrlen -IEEE80211_GCMP_HDR_LEN - mic_len;if (!rx->sta || data_len <0 )return RX_DROP_UNUSABLE ;
net/netfilter/ipset/ip_set_hash_gen.h +2 -2
@@ -104,11 +104,11 @@ htable_size(u8 hbits) {size_t hsize; -/* We must fit both into u32 in jhash and size_t */ +/* We must fit both into u32 in jhash and INT_MAX in kvmalloc_node() */ if (hbits >31 )return 0 ; hsize =jhash_size (hbits); -if ((((size_t )-1 ) -sizeof (struct htable )) /sizeof (struct hbucket *) +if ((INT_MAX -sizeof (struct htable )) /sizeof (struct hbucket *) < hsize)return 0 ;
net/netfilter/ipvs/ip_vs_conn.c +4 -0
@@ -1406,6 +1406,10 @@ int __init ip_vs_conn_init(void)int idx;/* Compute size and mask */ +if (ip_vs_conn_tab_bits <8 || ip_vs_conn_tab_bits >20 ) { +pr_info ("conn_tab_bits not in [8, 20]. Using default value\n" ); + ip_vs_conn_tab_bits =CONFIG_IP_VS_TAB_BITS ; + } ip_vs_conn_tab_size =1 << ip_vs_conn_tab_bits; ip_vs_conn_tab_mask = ip_vs_conn_tab_size -1 ;
net/sctp/input.c +1 -1
@@ -679,7 +679,7 @@ static int sctp_rcv_ootb(struct sk_buff *skb) ch =skb_header_pointer (skb, offset,sizeof (*ch), &_ch);/* Break out if chunk length is less then minimal. */ -if (ntohs (ch->length) <sizeof (_ch)) +if (!ch ||ntohs (ch->length) <sizeof (_ch))break ; ch_end = offset +SCTP_PAD4 (ntohs (ch->length));
net/unix/af_unix.c +28 -6
@@ -595,20 +595,42 @@ static void unix_release_sock(struct sock *sk, int embrion)static void init_peercred (struct sock *sk) { -put_pid (sk->sk_peer_pid); -if (sk->sk_peer_cred) -put_cred (sk->sk_peer_cred); +const struct cred *old_cred; +struct pid *old_pid; + +spin_lock (&sk->sk_peer_lock); + old_pid = sk->sk_peer_pid; + old_cred = sk->sk_peer_cred; sk->sk_peer_pid =get_pid (task_tgid (current)); sk->sk_peer_cred =get_current_cred (); +spin_unlock (&sk->sk_peer_lock); + +put_pid (old_pid); +put_cred (old_cred); }static void copy_peercred (struct sock *sk,struct sock *peersk) { -put_pid (sk->sk_peer_pid); -if (sk->sk_peer_cred) -put_cred (sk->sk_peer_cred); +const struct cred *old_cred; +struct pid *old_pid; + +if (sk < peersk) { +spin_lock (&sk->sk_peer_lock); +spin_lock_nested (&peersk->sk_peer_lock,SINGLE_DEPTH_NESTING ); + }else { +spin_lock (&peersk->sk_peer_lock); +spin_lock_nested (&sk->sk_peer_lock,SINGLE_DEPTH_NESTING ); + } + old_pid = sk->sk_peer_pid; + old_cred = sk->sk_peer_cred; sk->sk_peer_pid =get_pid (peersk->sk_peer_pid); sk->sk_peer_cred =get_cred (peersk->sk_peer_cred); + +spin_unlock (&sk->sk_peer_lock); +spin_unlock (&peersk->sk_peer_lock); + +put_pid (old_pid); +put_cred (old_cred); }static int unix_listen (struct socket *sock,int backlog)