Linux 4.19.74
Greg KH
maintainerI'm announcing the release of the 4.19.74 kernel.
All users of the 4.19 kernel series must upgrade.
The updated 4.19.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.19.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/powerpc/include/asm/uaccess.h | 1 arch/s390/kvm/interrupt.c | 10 +++ arch/s390/kvm/kvm-s390.c | 4 + arch/x86/Makefile | 1 arch/x86/kvm/vmx.c | 7 +- arch/x86/kvm/x86.c | 7 ++ arch/x86/purgatory/Makefile | 35 +++++++------ drivers/base/core.c | 53 +++++++++++++++++++ drivers/bluetooth/btusb.c | 5 - drivers/clk/rockchip/clk-mmc-phase.c | 4 - drivers/crypto/talitos.c | 67 ++++++++++++++++++------- drivers/firmware/ti_sci.c | 8 +- drivers/gpio/gpiolib-acpi.c | 42 ++++++++++++++- drivers/gpio/gpiolib.c | 16 ++++- drivers/gpu/drm/drm_panel_orientation_quirks.c | 12 ++++ drivers/gpu/drm/mediatek/mtk_drm_drv.c | 5 + drivers/gpu/drm/meson/meson_plane.c | 16 +++++ drivers/iio/adc/stm32-dfsdm-adc.c | 4 - drivers/isdn/capi/capi.c | 10 +++ drivers/mtd/nand/raw/mtk_nand.c | 21 +++---- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 8 ++ drivers/net/phy/phylink.c | 6 +- drivers/net/tun.c | 16 ++++- drivers/net/usb/cdc_ether.c | 13 +++- drivers/net/wireless/rsi/rsi_91x_usb.c | 1 drivers/nvmem/core.c | 15 ++++- drivers/pci/pci-driver.c | 3 - drivers/platform/x86/pmc_atom.c | 8 ++ fs/btrfs/tree-log.c | 8 +- fs/ubifs/tnc.c | 16 ++++- include/uapi/linux/isdn/capicmd.h | 1 kernel/irq/resend.c | 2 kernel/module.c | 24 ++++++-- net/bridge/br_mdb.c | 2 net/core/dev.c | 2 net/core/skbuff.c | 19 +++++++ net/ipv4/tcp_input.c | 2 net/ipv6/ping.c | 2 net/sched/sch_generic.c | 9 ++- net/sched/sch_hhf.c | 2 net/sctp/protocol.c | 2 net/sctp/sm_sideeffect.c | 2 net/tipc/name_distr.c | 3 - 44 files changed, 378 insertions(+), 118 deletions(-)
Alex Williamson (1):
PCI: Always allow probing with driver_override
Alexander Duyck (1):
ixgbe: Prevent u8 wrapping of ITR value to something less than 10us
Andrew F. Davis (1):
firmware: ti_sci: Always request response from firmware
Bjørn Mork (1):
cdc_ether: fix rndis support for Mediatek based smartphones
Christophe JAILLET (2):
ipv6: Fix the link time qualifier of 'ping_v6_proc_exit_net()'
sctp: Fix the link time qualifier of 'sctp_ctrlsock_exit()'
Christophe Leroy (6):
crypto: talitos - check AES key size
crypto: talitos - fix CTR alg blocksize
crypto: talitos - check data blocksize in ablkcipher.
crypto: talitos - fix ECB algs ivsize
crypto: talitos - Do not modify req->cryptlen on decryption.
crypto: talitos - HMAC SNOOP NO AFEU mode requires SW icv checking.
Cong Wang (1):
sch_hhf: ensure quantum and hhf_non_hh_weight are non-zero
Douglas Anderson (1):
clk: rockchip: Don't yell about bad mmc phases when getting
Eric Biggers (1):
isdn/capi: check message length in capi_write()
Eric Dumazet (1):
net: sched: fix reordering issues
Filipe Manana (1):
Btrfs: fix assertion failure during fsync and use of stale transaction
Fuqian Huang (1):
KVM: x86: work around leak of uninitialized stack contents
Greg Kroah-Hartman (1):
Linux 4.19.74
Hans de Goede (2):
gpiolib: acpi: Add gpiolib_acpi_run_edge_events_on_boot option and blacklist
drm: panel-orientation-quirks: Add extra quirk table entry for GPD MicroPC
Hui Peng (1):
rsi: fix a double free bug in rsi_91x_deinit()
Igor Mammedov (1):
KVM: s390: kvm_s390_vm_start_migration: check dirty_bitmap before using it as target for memset()
Jean Delvare (1):
nvmem: Use the same permissions for eeprom as for nvmem
Kent Gibson (2):
gpio: fix line flag validation in linehandle_create
gpio: fix line flag validation in lineevent_create
Linus Torvalds (1):
x86/build: Add -Wnoaddress-of-packed-member to REALMODE_CFLAGS, to silence GCC9 build warning
Mario Limonciello (1):
Revert "Bluetooth: btusb: driver to enable the usb-wakeup feature"
Muchun Song (1):
driver core: Fix use-after-free and double free on glue directory
Neal Cardwell (1):
tcp: fix tcp_ecn_withdraw_cwr() to clear TCP_ECN_QUEUE_CWR
Neil Armstrong (1):
drm/meson: Add support for XBGR8888 & ABGR8888 formats
Nicolas Dichtel (1):
bridge/mdb: remove wrong use of NLM_F_MULTI
Nishka Dasgupta (1):
drm/mediatek: mtk_drm_drv.c: Add of_node_put() before goto
Olivier Moysan (1):
iio: adc: stm32-dfsdm: fix data type
Paolo Bonzini (1):
KVM: nVMX: handle page fault in vmread
Richard Weinberger (1):
ubifs: Correctly use tnc_next() in search_dh_cookie()
Shmulik Ladkani (1):
net: gso: Fix skb_segment splat when splitting gso_size mangled skb having linear-headed frag_list
Stefan Chulski (1):
net: phylink: Fix flow control resolution
Steffen Dirkwinkel (1):
platform/x86: pmc_atom: Add CB4063 Beckhoff Automation board to critclk_systems DMI table
Steffen Klassert (1):
ixgbe: Fix secpath usage for IPsec TX offload.
Steve Wahl (1):
x86/purgatory: Change compiler flags from -mcmodel=kernel to -mcmodel=large to fix kexec relocation errors
Subash Abhinov Kasiviswanathan (1):
net: Fix null de-reference of device refcount
Suraj Jitindar Singh (1):
powerpc: Add barrier_nospec to raw_copy_in_user()
Thomas Huth (1):
KVM: s390: Do not leak kernel stack data in the KVM_S390_INTERRUPT ioctl
Xiaolei Li (1):
mtd: rawnand: mtk: Fix wrongly assigned OOB buffer pointer issue
Xin Long (2):
sctp: use transport pf_retrans in sctp_do_8_2_transport_strike
tipc: add NULL pointer check before calling kfree_rcu
Yang Yingliang (3):
tun: fix use-after-free when register netdev failed
modules: fix BUG when load module with rodata=n
modules: fix compile error if don't have strict module rwx
Yunfeng Ye (1):
genirq: Prevent NULL pointer dereference in resend_irqs()
Greg KH
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 73 +SUBLEVEL = 74 EXTRAVERSION = NAME = "People's Front"
arch/powerpc/include/asm/uaccess.h +1 -0
@@ -306,6 +306,7 @@ extern unsigned long __copy_tofrom_user(void __user *to,static inline unsigned long raw_copy_in_user (void __user *to,const void __user *from,unsigned long n) { +barrier_nospec ();return __copy_tofrom_user (to, from, n); }#endif /* __powerpc64__ */
arch/s390/kvm/interrupt.c +10 -0
@@ -1879,6 +1879,16 @@ int s390int_to_s390irq(struct kvm_s390_interrupt *s390int,case KVM_S390_MCHK : irq->u.mchk.mcic = s390int->parm64;break ; +case KVM_S390_INT_PFAULT_INIT : + irq->u.ext.ext_params = s390int->parm; + irq->u.ext.ext_params2 = s390int->parm64; +break ; +case KVM_S390_RESTART : +case KVM_S390_INT_CLOCK_COMP : +case KVM_S390_INT_CPU_TIMER : +break ; +default : +return -EINVAL ; }return 0 ; }
arch/s390/kvm/kvm-s390.c +3 -1
@@ -928,6 +928,8 @@ static int kvm_s390_vm_start_migration(struct kvm *kvm)/* mark all the pages in active slots as dirty */ for (slotnr =0 ; slotnr < slots->used_slots; slotnr++) { ms = slots->memslots + slotnr; +if (!ms->dirty_bitmap) +return -EINVAL ;/* * The second half of the bitmap is only used on x86, * and would be wasted otherwise, so we put it to good
@@ -3956,7 +3958,7 @@ long kvm_arch_vcpu_async_ioctl(struct file *filp, }case KVM_S390_INTERRUPT : {struct kvm_s390_interrupt s390int; -struct kvm_s390_irq s390irq; +struct kvm_s390_irq s390irq = {};if (copy_from_user (&s390int, argp,sizeof (s390int)))return -EFAULT ;
arch/x86/Makefile +1 -0
@@ -38,6 +38,7 @@ REALMODE_CFLAGS := $(M16_CFLAGS) -g -Os -DDISABLE_BRANCH_PROFILING \ REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -ffreestanding) REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -fno-stack-protector) +REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -Wno-address-of-packed-member) REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), $(cc_stack_align4)) export REALMODE_CFLAGS
arch/x86/kvm/vmx.c +5 -2
@@ -8757,6 +8757,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu)u32 vmx_instruction_info =vmcs_read32 (VMX_INSTRUCTION_INFO );gva_t gva =0 ;struct vmcs12 *vmcs12; +struct x86_exception e;if (!nested_vmx_check_permission (vcpu))return 1 ;
@@ -8798,8 +8799,10 @@ static int handle_vmread(struct kvm_vcpu *vcpu) vmx_instruction_info, true, &gva))return 1 ;/* _system ok, nested_vmx_check_permission has verified cpl=0 */ -kvm_write_guest_virt_system (vcpu, gva, &field_value, - (is_long_mode (vcpu) ?8 :4 ),NULL ); +if (kvm_write_guest_virt_system (vcpu, gva, &field_value, + (is_long_mode (vcpu) ?8 :4 ), +NULL )) +kvm_inject_page_fault (vcpu, &e); }nested_vmx_succeed (vcpu);
arch/x86/kvm/x86.c +7 -0
@@ -5016,6 +5016,13 @@ int kvm_write_guest_virt_system(struct kvm_vcpu *vcpu, gva_t addr, void *val,/* kvm_write_guest_virt_system can pull in tons of pages. */ vcpu->arch.l1tf_flush_l1d = true; +/* +* FIXME: this should call handle_emulation_failure if X86EMUL_IO_NEEDED +* is returned, but our callers are not ready for that and they blindly +* call kvm_inject_page_fault. Ensure that they at least do not leak +* uninitialized kernel stack memory into cr2 and error code. +*/ +memset (exception,0 ,sizeof (*exception));return kvm_write_guest_virt_helper (addr, val, bytes, vcpu,PFERR_WRITE_MASK , exception); }
arch/x86/purgatory/Makefile +19 -16
@@ -18,37 +18,40 @@ targets += purgatory.ro KASAN_SANITIZE := n KCOV_INSTRUMENT := n +# These are adjustments to the compiler flags used for objects that +# make up the standalone purgatory.ro + +PURGATORY_CFLAGS_REMOVE := -mcmodel=kernel +PURGATORY_CFLAGS := -mcmodel=large -ffreestanding -fno-zero-initialized-in-bss + # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That # in turn leaves some undefined symbols like __fentry__ in purgatory and not # sure how to relocate those. ifdef CONFIG_FUNCTION_TRACER -CFLAGS_REMOVE_sha256.o += $(CC_FLAGS_FTRACE) -CFLAGS_REMOVE_purgatory.o += $(CC_FLAGS_FTRACE) -CFLAGS_REMOVE_string.o += $(CC_FLAGS_FTRACE) -CFLAGS_REMOVE_kexec-purgatory.o += $(CC_FLAGS_FTRACE) +PURGATORY_CFLAGS_REMOVE += $(CC_FLAGS_FTRACE) endif ifdef CONFIG_STACKPROTECTOR -CFLAGS_REMOVE_sha256.o += -fstack-protector -CFLAGS_REMOVE_purgatory.o += -fstack-protector -CFLAGS_REMOVE_string.o += -fstack-protector -CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector +PURGATORY_CFLAGS_REMOVE += -fstack-protector endif ifdef CONFIG_STACKPROTECTOR_STRONG -CFLAGS_REMOVE_sha256.o += -fstack-protector-strong -CFLAGS_REMOVE_purgatory.o += -fstack-protector-strong -CFLAGS_REMOVE_string.o += -fstack-protector-strong -CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector-strong +PURGATORY_CFLAGS_REMOVE += -fstack-protector-strong endif ifdef CONFIG_RETPOLINE -CFLAGS_REMOVE_sha256.o += $(RETPOLINE_CFLAGS) -CFLAGS_REMOVE_purgatory.o += $(RETPOLINE_CFLAGS) -CFLAGS_REMOVE_string.o += $(RETPOLINE_CFLAGS) -CFLAGS_REMOVE_kexec-purgatory.o += $(RETPOLINE_CFLAGS) +PURGATORY_CFLAGS_REMOVE += $(RETPOLINE_CFLAGS) endif +CFLAGS_REMOVE_purgatory.o += $(PURGATORY_CFLAGS_REMOVE) +CFLAGS_purgatory.o += $(PURGATORY_CFLAGS) + +CFLAGS_REMOVE_sha256.o += $(PURGATORY_CFLAGS_REMOVE) +CFLAGS_sha256.o += $(PURGATORY_CFLAGS) + +CFLAGS_REMOVE_string.o += $(PURGATORY_CFLAGS_REMOVE) +CFLAGS_string.o += $(PURGATORY_CFLAGS) + $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE $(call if_changed,ld)
drivers/base/core.c +52 -1
64 lines not on this page · raw message
drivers/bluetooth/btusb.c +0 -5
@@ -1139,10 +1139,6 @@ static int btusb_open(struct hci_dev *hdev) } data->intf->needs_remote_wakeup =1 ; -/* device specific wakeup source enabled and required for USB -* remote wakeup while host is suspended -*/ -device_wakeup_enable (&data->udev->dev);if (test_and_set_bit (BTUSB_INTR_RUNNING , &data->flags)) goto done;
@@ -1206,7 +1202,6 @@ static int btusb_close(struct hci_dev *hdev) goto failed; data->intf->needs_remote_wakeup =0 ; -device_wakeup_disable (&data->udev->dev);usb_autopm_put_interface (data->intf); failed:
drivers/clk/rockchip/clk-mmc-phase.c +1 -3
@@ -61,10 +61,8 @@ static int rockchip_mmc_get_phase(struct clk_hw *hw)u32 delay_num =0 ;/* See the comment for rockchip_mmc_set_phase below */ -if (!rate) { -pr_err ("%s: invalid clk rate\n" , __func__); +if (!rate)return -EINVAL ; - } raw_value =readl (mmc_clock->reg) >> (mmc_clock->shift);
drivers/crypto/talitos.c +50 -17
197 lines not on this page · raw message
drivers/firmware/ti_sci.c +4 -4
@@ -463,9 +463,9 @@ static int ti_sci_cmd_get_revision(struct ti_sci_info *info)struct ti_sci_xfer *xfer;int ret; -/* No need to setup flags since it is expected to respond */ xfer =ti_sci_get_one_xfer (info,TI_SCI_MSG_VERSION , -0x0 ,sizeof (struct ti_sci_msg_hdr ), +TI_SCI_FLAG_REQ_ACK_ON_PROCESSED , +sizeof (struct ti_sci_msg_hdr ),sizeof (*rev_info));if (IS_ERR (xfer)) { ret =PTR_ERR (xfer);
@@ -593,9 +593,9 @@ static int ti_sci_get_device_state(const struct ti_sci_handle *handle, info =handle_to_ti_sci_info (handle); dev = info->dev; -/* Response is expected, so need of any flags */ xfer =ti_sci_get_one_xfer (info,TI_SCI_MSG_GET_DEVICE_STATE , -0 ,sizeof (*req),sizeof (*resp)); +TI_SCI_FLAG_REQ_ACK_ON_PROCESSED , +sizeof (*req),sizeof (*resp));if (IS_ERR (xfer)) { ret =PTR_ERR (xfer);dev_err (dev,"Message alloc failed(%d)\n" , ret);
drivers/gpio/gpiolib-acpi.c +38 -4
63 lines not on this page · raw message
drivers/gpio/gpiolib.c +11 -5
@@ -524,6 +524,14 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)if (lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS )return -EINVAL ; +/* +* Do not allow both INPUT & OUTPUT flags to be set as they are +* contradictory. +*/ +if ((lflags &GPIOHANDLE_REQUEST_INPUT ) && + (lflags &GPIOHANDLE_REQUEST_OUTPUT )) +return -EINVAL ; +/* * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If * the hardware actually supports enabling both at the same time the
@@ -916,7 +924,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) }/* This is just wrong: we don't look for events on output lines */ -if (lflags &GPIOHANDLE_REQUEST_OUTPUT ) { +if ((lflags &GPIOHANDLE_REQUEST_OUTPUT ) || + (lflags &GPIOHANDLE_REQUEST_OPEN_DRAIN ) || + (lflags &GPIOHANDLE_REQUEST_OPEN_SOURCE )) { ret = -EINVAL ; goto out_free_label; }
@@ -930,10 +940,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)if (lflags &GPIOHANDLE_REQUEST_ACTIVE_LOW )set_bit (FLAG_ACTIVE_LOW , &desc->flags); -if (lflags &GPIOHANDLE_REQUEST_OPEN_DRAIN ) -set_bit (FLAG_OPEN_DRAIN , &desc->flags); -if (lflags &GPIOHANDLE_REQUEST_OPEN_SOURCE ) -set_bit (FLAG_OPEN_SOURCE , &desc->flags); ret =gpiod_direction_input (desc);if (ret)
drivers/gpu/drm/drm_panel_orientation_quirks.c +12 -0
@@ -82,6 +82,12 @@ static const struct drm_dmi_panel_orientation_data itworks_tw891 = { .orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP, }; +static const struct drm_dmi_panel_orientation_data lcd720x1280_rightside_up = { + .width =720 , + .height =1280 , + .orientation =DRM_MODE_PANEL_ORIENTATION_RIGHT_UP , +}; +static const struct drm_dmi_panel_orientation_data lcd800x1280_rightside_up = { .width =800 , .height =1280 ,
@@ -109,6 +115,12 @@ static const struct dmi_system_id orientation_data[] = { DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"), }, .driver_data = (void *)&gpd_micropc, + }, { /* GPD MicroPC (later BIOS versions with proper DMI strings) */ + .matches = { +DMI_EXACT_MATCH (DMI_SYS_VENDOR ,"GPD" ), + DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "MicroPC"), + }, + .driver_data = (void *)&lcd720x1280_rightside_up, }, { /** GPD Pocket, note that the the DMI data is less generic then * it seems, devices with a board-vendor of "AMI Corporation"
drivers/gpu/drm/mediatek/mtk_drm_drv.c +4 -1
@@ -566,12 +566,15 @@ static int mtk_drm_probe(struct platform_device *pdev) comp =devm_kzalloc (dev,sizeof (*comp),GFP_KERNEL );if (!comp) { ret = -ENOMEM ; +of_node_put (node); goto err_node; } ret =mtk_ddp_comp_init (dev, node, comp, comp_id,NULL ); -if (ret) +if (ret) { +of_node_put (node); goto err_node; + } private->ddp_comp[comp_id] = comp; }
drivers/gpu/drm/meson/meson_plane.c +16 -0
@@ -120,6 +120,13 @@ static void meson_plane_atomic_update(struct drm_plane *plane, priv->viu.osd1_blk0_cfg[0 ] |=OSD_BLK_MODE_32 |OSD_COLOR_MATRIX_32_ARGB ;break ; +case DRM_FORMAT_XBGR8888 : +/* For XRGB, replace the pixel's alpha by 0xFF */ +writel_bits_relaxed (OSD_REPLACE_EN ,OSD_REPLACE_EN , + priv->io_base +_REG (VIU_OSD1_CTRL_STAT2 )); + priv->viu.osd1_blk0_cfg[0 ] |=OSD_BLK_MODE_32 | +OSD_COLOR_MATRIX_32_ABGR ; +break ;case DRM_FORMAT_ARGB8888 :/* For ARGB, use the pixel's alpha */ writel_bits_relaxed(OSD_REPLACE_EN, 0,
@@ -127,6 +134,13 @@ static void meson_plane_atomic_update(struct drm_plane *plane, priv->viu.osd1_blk0_cfg[0 ] |=OSD_BLK_MODE_32 |OSD_COLOR_MATRIX_32_ARGB ;break ; +case DRM_FORMAT_ABGR8888 : +/* For ARGB, use the pixel's alpha */ +writel_bits_relaxed (OSD_REPLACE_EN ,0 , + priv->io_base +_REG (VIU_OSD1_CTRL_STAT2 )); + priv->viu.osd1_blk0_cfg[0 ] |=OSD_BLK_MODE_32 | +OSD_COLOR_MATRIX_32_ABGR ; +break ;case DRM_FORMAT_RGB888 : priv->viu.osd1_blk0_cfg[0 ] |=OSD_BLK_MODE_24 |OSD_COLOR_MATRIX_24_RGB ;
@@ -196,7 +210,9 @@ static const struct drm_plane_funcs meson_plane_funcs = {static const uint32_t supported_drm_formats[] = {DRM_FORMAT_ARGB8888 , +DRM_FORMAT_ABGR8888 ,DRM_FORMAT_XRGB8888 , +DRM_FORMAT_XBGR8888 ,DRM_FORMAT_RGB888 ,DRM_FORMAT_RGB565 , };
drivers/iio/adc/stm32-dfsdm-adc.c +2 -2
@@ -981,11 +981,11 @@ static int stm32_dfsdm_adc_chan_init_one(struct iio_dev *indio_dev, ch->info_mask_shared_by_all =BIT (IIO_CHAN_INFO_OVERSAMPLING_RATIO );if (adc->dev_data->type ==DFSDM_AUDIO ) { - ch->scan_type.sign ='s' ; ch->ext_info = dfsdm_adc_audio_ext_info; }else { - ch->scan_type.sign ='u' ; + ch->scan_type.shift =8 ; } + ch->scan_type.sign ='s' ; ch->scan_type.realbits =24 ; ch->scan_type.storagebits =32 ;
drivers/isdn/capi/capi.c +9 -1
@@ -688,6 +688,9 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *pposif (!cdev->ap.applid)return -ENODEV ; +if (count <CAPIMSG_BASELEN ) +return -EINVAL ; + skb =alloc_skb (count,GFP_USER );if (!skb)return -ENOMEM ;
@@ -698,7 +701,8 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos } mlen =CAPIMSG_LEN (skb->data);if (CAPIMSG_CMD (skb->data) ==CAPI_DATA_B3_REQ ) { -if ((size_t )(mlen +CAPIMSG_DATALEN (skb->data)) != count) { +if (count <CAPI_DATA_B3_REQ_LEN || + (size_t )(mlen +CAPIMSG_DATALEN (skb->data)) != count) {kfree_skb (skb);return -EINVAL ; }
@@ -711,6 +715,10 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *pposCAPIMSG_SETAPPID (skb->data, cdev->ap.applid);if (CAPIMSG_CMD (skb->data) ==CAPI_DISCONNECT_B3_RESP ) { +if (count <CAPI_DISCONNECT_B3_RESP_LEN ) { +kfree_skb (skb); +return -EINVAL ; + }mutex_lock (&cdev->lock);capincci_free (cdev,CAPIMSG_NCCI (skb->data));mutex_unlock (&cdev->lock);
drivers/mtd/nand/raw/mtk_nand.c +10 -11
@@ -863,19 +863,21 @@ static int mtk_nfc_write_oob_std(struct mtd_info *mtd, struct nand_chip *chip,return mtk_nfc_write_page_raw (mtd, chip,NULL ,1 , page); } -static int mtk_nfc_update_ecc_stats (struct mtd_info *mtd,u8 *buf,u32 sectors) +static int mtk_nfc_update_ecc_stats (struct mtd_info *mtd,u8 *buf,u32 start, +u32 sectors) {struct nand_chip *chip =mtd_to_nand (mtd);struct mtk_nfc *nfc =nand_get_controller_data (chip);struct mtk_nfc_nand_chip *mtk_nand =to_mtk_nand (chip);struct mtk_ecc_stats stats; +u32 reg_size = mtk_nand->fdm.reg_size;int rc, i; rc =nfi_readl (nfc,NFI_STA ) &STA_EMP_PAGE ;if (rc) {memset (buf,0xff , sectors * chip->ecc.size);for (i =0 ; i < sectors; i++) -memset (oob_ptr (chip, i),0xff , mtk_nand->fdm.reg_size); +memset (oob_ptr (chip, start + i),0xff , reg_size);return 0 ; }
@@ -895,7 +897,7 @@ static int mtk_nfc_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,u32 spare = mtk_nand->spare_per_sector;u32 column, sectors, start, end, reg;dma_addr_t addr; -int bitflips; +int bitflips =0 ;size_t len;u8 *buf;int rc;
@@ -962,14 +964,11 @@ static int mtk_nfc_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,if (rc <0 ) {dev_err (nfc->dev,"subpage done timeout\n" ); bitflips = -EIO ; - }else { - bitflips =0 ; -if (!raw) { - rc =mtk_ecc_wait_done (nfc->ecc,ECC_DECODE ); - bitflips = rc <0 ? -ETIMEDOUT : -mtk_nfc_update_ecc_stats (mtd, buf, sectors); -mtk_nfc_read_fdm (chip, start, sectors); - } + }else if (!raw) { + rc =mtk_ecc_wait_done (nfc->ecc,ECC_DECODE ); + bitflips = rc <0 ? -ETIMEDOUT : +mtk_nfc_update_ecc_stats (mtd, buf, start, sectors); +mtk_nfc_read_fdm (chip, start, sectors); }dma_unmap_single (nfc->dev, addr, len,DMA_FROM_DEVICE );
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +6 -2
@@ -34,6 +34,7 @@#include <net/tc_act/tc_mirred.h> #include <net/vxlan.h> #include <net/mpls.h> +#include <net/xfrm.h> #include "ixgbe.h" #include "ixgbe_common.h"
@@ -2625,7 +2626,7 @@ static void ixgbe_update_itr(struct ixgbe_q_vector *q_vector,/* 16K ints/sec to 9.2K ints/sec */ avg_wire_size *=15 ; avg_wire_size +=11452 ; - }else if (avg_wire_size <=1980 ) { + }else if (avg_wire_size <1968 ) {/* 9.2K ints/sec to 8K ints/sec */ avg_wire_size *=5 ; avg_wire_size +=22420 ;
@@ -2658,6 +2659,8 @@ static void ixgbe_update_itr(struct ixgbe_q_vector *q_vector,case IXGBE_LINK_SPEED_2_5GB_FULL :case IXGBE_LINK_SPEED_1GB_FULL :case IXGBE_LINK_SPEED_10_FULL : +if (avg_wire_size >8064 ) + avg_wire_size =8064 ; itr +=DIV_ROUND_UP (avg_wire_size,IXGBE_ITR_ADAPTIVE_MIN_INC *64 ) *IXGBE_ITR_ADAPTIVE_MIN_INC ;
@@ -8599,7 +8602,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,#endif /* IXGBE_FCOE */ #ifdef CONFIG_XFRM_OFFLOAD -if (skb->sp && !ixgbe_ipsec_tx (tx_ring, first, &ipsec_tx)) +if (xfrm_offload (skb) && + !ixgbe_ipsec_tx (tx_ring, first, &ipsec_tx)) goto out_drop;#endif tso =ixgbe_tso (tx_ring, first, &hdr_len, &ipsec_tx);
drivers/net/phy/phylink.c +3 -3
@@ -380,8 +380,8 @@ static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_stat* Local device Link partner * Pause AsymDir Pause AsymDir Result * 1 X 1 X TX+RX -* 0 1 1 1 RX -* 1 1 0 1 TX +* 0 1 1 1 TX +* 1 1 0 1 RX */ static void phylink_resolve_flow (struct phylink *pl,struct phylink_link_state *state)
@@ -402,7 +402,7 @@ static void phylink_resolve_flow(struct phylink *pl, new_pause =MLO_PAUSE_TX |MLO_PAUSE_RX ; else if (pause & MLO_PAUSE_ASYM) new_pause = state->pause &MLO_PAUSE_SYM ? -MLO_PAUSE_RX :MLO_PAUSE_TX ; +MLO_PAUSE_TX :MLO_PAUSE_RX ; }else { new_pause = pl->link_config.pause &MLO_PAUSE_TXRX_MASK ; }
drivers/net/tun.c +11 -5
@@ -801,7 +801,8 @@ static void tun_detach_all(struct net_device *dev) }static int tun_attach (struct tun_struct *tun,struct file *file, -bool skip_filter,bool napi,bool napi_frags) +bool skip_filter,bool napi,bool napi_frags, +bool publish_tun) {struct tun_file *tfile = file->private_data;struct net_device *dev = tun->dev;
@@ -881,7 +882,8 @@ static int tun_attach(struct tun_struct *tun, struct file *file,* initialized tfile; otherwise we risk using half-initialized * object. */ -rcu_assign_pointer (tfile->tun, tun); +if (publish_tun) +rcu_assign_pointer (tfile->tun, tun);rcu_assign_pointer (tun->tfiles[tun->numqueues], tfile); tun->numqueues++;tun_set_real_num_queues (tun);
@@ -2553,7 +2555,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) err =tun_attach (tun, file, ifr->ifr_flags &IFF_NOFILTER , ifr->ifr_flags &IFF_NAPI , - ifr->ifr_flags &IFF_NAPI_FRAGS ); + ifr->ifr_flags &IFF_NAPI_FRAGS , true);if (err <0 )return err;
@@ -2652,13 +2654,17 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)INIT_LIST_HEAD (&tun->disabled); err =tun_attach (tun, file, false, ifr->ifr_flags &IFF_NAPI , - ifr->ifr_flags &IFF_NAPI_FRAGS ); + ifr->ifr_flags &IFF_NAPI_FRAGS , false);if (err <0 ) goto err_free_flow; err =register_netdevice (tun->dev);if (err <0 ) goto err_detach; +/* free_netdev() won't check refcnt, to aovid race +* with dev_put() we need publish tun after registration. +*/ +rcu_assign_pointer (tfile->tun, tun); }netif_carrier_on (tun->dev);
@@ -2802,7 +2808,7 @@ static int tun_set_queue(struct file *file, struct ifreq *ifr)if (ret <0 ) goto unlock; ret =tun_attach (tun, file, false, tun->flags &IFF_NAPI , - tun->flags &IFF_NAPI_FRAGS ); + tun->flags &IFF_NAPI_FRAGS , true); }else if (ifr->ifr_flags &IFF_DETACH_QUEUE ) { tun =rtnl_dereference (tfile->tun);if (!tun || !(tun->flags &IFF_MULTI_QUEUE ) || tfile->detached)
drivers/net/usb/cdc_ether.c +10 -3
@@ -221,9 +221,16 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) goto bad_desc; } skip: -if ( rndis && - header.usb_cdc_acm_descriptor && - header.usb_cdc_acm_descriptor->bmCapabilities) { +/* Communcation class functions with bmCapabilities are not +* RNDIS. But some Wireless class RNDIS functions use +* bmCapabilities for their own purpose. The failsafe is +* therefore applied only to Communication class RNDIS +* functions. The rndis test is redundant, but a cheap +* optimization. +*/ +if (rndis &&is_rndis (&intf->cur_altsetting->desc) && + header.usb_cdc_acm_descriptor && + header.usb_cdc_acm_descriptor->bmCapabilities) {dev_dbg (&intf->dev,"ACM capabilities %02x, not really RNDIS?\n" , header.usb_cdc_acm_descriptor->bmCapabilities);
drivers/net/wireless/rsi/rsi_91x_usb.c +0 -1
@@ -643,7 +643,6 @@ static int rsi_init_usb_interface(struct rsi_hw *adapter,kfree (rsi_dev->tx_buffer); fail_eps: -kfree (rsi_dev);return status; }
drivers/nvmem/core.c +11 -4
@@ -415,10 +415,17 @@ static int nvmem_setup_compat(struct nvmem_device *nvmem,if (!config->base_dev)return -EINVAL ; -if (nvmem->read_only) - nvmem->eeprom = bin_attr_ro_root_nvmem; -else - nvmem->eeprom = bin_attr_rw_root_nvmem; +if (nvmem->read_only) { +if (config->root_only) + nvmem->eeprom = bin_attr_ro_root_nvmem; +else + nvmem->eeprom = bin_attr_ro_nvmem; + }else { +if (config->root_only) + nvmem->eeprom = bin_attr_rw_root_nvmem; +else + nvmem->eeprom = bin_attr_rw_nvmem; + } nvmem->eeprom.attr.name ="eeprom" ; nvmem->eeprom.size = nvmem->size;#ifdef CONFIG_DEBUG_LOCK_ALLOC
drivers/pci/pci-driver.c +2 -1
@@ -399,7 +399,8 @@ void __weak pcibios_free_irq(struct pci_dev *dev)#ifdef CONFIG_PCI_IOV static inline bool pci_device_can_probe (struct pci_dev *pdev) { -return (!pdev->is_virtfn || pdev->physfn->sriov->drivers_autoprobe); +return (!pdev->is_virtfn || pdev->physfn->sriov->drivers_autoprobe || + pdev->driver_override); }#else static inline bool pci_device_can_probe (struct pci_dev *pdev)
drivers/platform/x86/pmc_atom.c +8 -0
@@ -421,6 +421,14 @@ static const struct dmi_system_id critclk_systems[] = { DMI_MATCH(DMI_BOARD_NAME, "CB3163"), }, }, + { +/* pmc_plt_clk* - are used for ethernet controllers */ + .ident = "Beckhoff CB4063", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Beckhoff Automation" ), + DMI_MATCH(DMI_BOARD_NAME, "CB4063"), + }, + }, {/* pmc_plt_clk* - are used for ethernet controllers */ .ident = "Beckhoff CB6263",
fs/btrfs/tree-log.c +4 -4
@@ -5107,7 +5107,7 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans,BTRFS_I (other_inode),LOG_OTHER_INODE ,0 ,LLONG_MAX , ctx); -iput (other_inode); +btrfs_add_delayed_iput (other_inode);if (err) goto out_unlock;else
@@ -5519,7 +5519,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans, }if (btrfs_inode_in_log (BTRFS_I (di_inode), trans->transid)) { -iput (di_inode); +btrfs_add_delayed_iput (di_inode);break ; }
@@ -5531,7 +5531,7 @@ static int log_new_dir_dentries(struct btrfs_trans_handle *trans,if (!ret &&btrfs_must_commit_transaction (trans,BTRFS_I (di_inode))) ret =1 ; -iput (di_inode); +btrfs_add_delayed_iput (di_inode);if (ret) goto next_dir_inode;if (ctx->log_new_dentries) {
@@ -5678,7 +5678,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,if (!ret && ctx && ctx->log_new_dentries) ret =log_new_dir_dentries (trans, root,BTRFS_I (dir_inode), ctx); -iput (dir_inode); +btrfs_add_delayed_iput (dir_inode);if (ret) goto out; }
fs/ubifs/tnc.c +11 -5
@@ -1165,8 +1165,8 @@ static struct ubifs_znode *dirty_cow_bottom_up(struct ubifs_info *c,* o exact match, i.e. the found zero-level znode contains key @key, then %1 * is returned and slot number of the matched branch is stored in @n; * o not exact match, which means that zero-level znode does not contain -* @key, then %0 is returned and slot number of the closest branch is stored -* in @n; +* @key, then %0 is returned and slot number of the closest branch or %-1 +* is stored in @n; In this case calling tnc_next() is mandatory. * o @key is so small that it is even less than the lowest key of the * leftmost zero-level node, then %0 is returned and %0 is stored in @n. *
@@ -1883,13 +1883,19 @@ int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key,static int search_dh_cookie (struct ubifs_info *c,const union ubifs_key *key,struct ubifs_dent_node *dent,uint32_t cookie, -struct ubifs_znode **zn,int *n) +struct ubifs_znode **zn,int *n,int exact) {int err;struct ubifs_znode *znode = *zn;struct ubifs_zbranch *zbr;union ubifs_key *dkey; +if (!exact) { + err =tnc_next (c, &znode, n); +if (err) +return err; + } +for (;;) { zbr = &znode->zbranch[*n]; dkey = &zbr->key;
@@ -1931,7 +1937,7 @@ static int do_lookup_dh(struct ubifs_info *c, const union ubifs_key *key,if (unlikely (err <0 )) goto out_unlock; - err =search_dh_cookie (c, key, dent, cookie, &znode, &n); + err =search_dh_cookie (c, key, dent, cookie, &znode, &n, err); out_unlock:mutex_unlock (&c->tnc_mutex);
@@ -2718,7 +2724,7 @@ int ubifs_tnc_remove_dh(struct ubifs_info *c, const union ubifs_key *key,if (unlikely (err <0 )) goto out_free; - err =search_dh_cookie (c, key, dent, cookie, &znode, &n); + err =search_dh_cookie (c, key, dent, cookie, &znode, &n, err);if (err) goto out_free; }
include/uapi/linux/isdn/capicmd.h +1 -0
@@ -16,6 +16,7 @@#define CAPI_MSG_BASELEN 8#define CAPI_DATA_B3_REQ_LEN (CAPI_MSG_BASELEN+4+4+2+2+2)#define CAPI_DATA_B3_RESP_LEN (CAPI_MSG_BASELEN+4+2) +#define CAPI_DISCONNECT_B3_RESP_LEN (CAPI_MSG_BASELEN+4)/*----- CAPI commands -----*/ #define CAPI_ALERT 0x01
kernel/irq/resend.c +2 -0
@@ -36,6 +36,8 @@ static void resend_irqs(unsigned long arg) irq =find_first_bit (irqs_resend, nr_irqs);clear_bit (irq, irqs_resend); desc =irq_to_desc (irq); +if (!desc) +continue ;local_irq_disable (); desc->handle_irq (desc);local_irq_enable ();
kernel/module.c +17 -7
@@ -1884,7 +1884,7 @@ static void mod_sysfs_teardown(struct module *mod)mod_sysfs_fini (mod); } -#ifdef CONFIG_STRICT_MODULE_RWX +#ifdef CONFIG_ARCH_HAS_STRICT_MODULE_RWX /* * LKM RO/NX protection: protect module's text/ro-data * from modification and any data from execution.
@@ -1907,6 +1907,7 @@ static void frob_text(const struct module_layout *layout, layout->text_size >> PAGE_SHIFT); } +#ifdef CONFIG_STRICT_MODULE_RWX static void frob_rodata (const struct module_layout *layout,int (*set_memory)(unsigned long start,int num_pages)) {
@@ -1956,13 +1957,9 @@ void module_enable_ro(const struct module *mod, bool after_init)return ;frob_text (&mod->core_layout, set_memory_ro); -frob_text (&mod->core_layout, set_memory_x);frob_rodata (&mod->core_layout, set_memory_ro); -frob_text (&mod->init_layout, set_memory_ro); -frob_text (&mod->init_layout, set_memory_x); -frob_rodata (&mod->init_layout, set_memory_ro);if (after_init)
@@ -2043,11 +2040,23 @@ static void disable_ro_nx(const struct module_layout *layout)frob_writable_data (layout, set_memory_x); } -#else +#else /* !CONFIG_STRICT_MODULE_RWX */ static void disable_ro_nx (const struct module_layout *layout) { }static void module_enable_nx (const struct module *mod) { }static void module_disable_nx (const struct module *mod) { } -#endif +#endif /* CONFIG_STRICT_MODULE_RWX */ + +static void module_enable_x (const struct module *mod) +{ +frob_text (&mod->core_layout, set_memory_x); +frob_text (&mod->init_layout, set_memory_x); +} +#else /* !CONFIG_ARCH_HAS_STRICT_MODULE_RWX */ +static void disable_ro_nx (const struct module_layout *layout) { } +static void module_enable_nx (const struct module *mod) { } +static void module_disable_nx (const struct module *mod) { } +static void module_enable_x (const struct module *mod) { } +#endif /* CONFIG_ARCH_HAS_STRICT_MODULE_RWX */ #ifdef CONFIG_LIVEPATCH /*
@@ -3604,6 +3613,7 @@ static int complete_formation(struct module *mod, struct load_info *info)module_enable_ro (mod, false);module_enable_nx (mod); +module_enable_x (mod);/* Mark state as coming so strong_try_module_get() ignores us, * but kallsyms etc. can see us. */
net/bridge/br_mdb.c +1 -1
@@ -419,7 +419,7 @@ static int nlmsg_populate_rtr_fill(struct sk_buff *skb,struct nlmsghdr *nlh;struct nlattr *nest; - nlh =nlmsg_put (skb, pid, seq, type,sizeof (*bpm),NLM_F_MULTI ); + nlh =nlmsg_put (skb, pid, seq, type,sizeof (*bpm),0 );if (!nlh)return -EMSGSIZE ;
net/core/dev.c +2 -0
@@ -8562,6 +8562,8 @@ int register_netdevice(struct net_device *dev) ret =notifier_to_errno (ret);if (ret) {rollback_registered (dev); +rcu_barrier (); + dev->reg_state =NETREG_UNREGISTERED ; }/*
net/core/skbuff.c +19 -0
@@ -3530,6 +3530,25 @@ struct sk_buff *skb_segment(struct sk_buff *head_skb,int pos;int dummy; +if (list_skb && !list_skb->head_frag &&skb_headlen (list_skb) && + (skb_shinfo (head_skb)->gso_type &SKB_GSO_DODGY )) { +/* gso_size is untrusted, and we have a frag_list with a linear +* non head_frag head. +* +* (we assume checking the first list_skb member suffices; +* i.e if either of the list_skb members have non head_frag +* head, then the first one has too). +* +* If head_skb's headlen does not fit requested gso_size, it +* means that the frag_list members do NOT terminate on exact +* gso_size boundaries. Hence we cannot perform skb_frag_t page +* sharing. Therefore we must fallback to copying the frag_list +* skbs; we do so by disabling SG. +*/ +if (mss !=GSO_BY_FRAGS && mss !=skb_headlen (head_skb)) + features &= ~NETIF_F_SG ; + } +__skb_push (head_skb, doffset); proto =skb_network_protocol (head_skb, &dummy);if (unlikely (!proto))
net/ipv4/tcp_input.c +1 -1
@@ -260,7 +260,7 @@ static void tcp_ecn_accept_cwr(struct sock *sk, const struct sk_buff *skb)static void tcp_ecn_withdraw_cwr (struct tcp_sock *tp) { - tp->ecn_flags &= ~TCP_ECN_DEMAND_CWR ; + tp->ecn_flags &= ~TCP_ECN_QUEUE_CWR ; }static void __tcp_ecn_check_ce (struct sock *sk,const struct sk_buff *skb)
net/ipv6/ping.c +1 -1
@@ -228,7 +228,7 @@ static int __net_init ping_v6_proc_init_net(struct net *net)return 0 ; } -static void __net_init ping_v6_proc_exit_net (struct net *net) +static void __net_exit ping_v6_proc_exit_net(struct net *net) {remove_proc_entry ("icmp6" , net->proc_net); }
net/sched/sch_generic.c +7 -2
@@ -49,6 +49,8 @@ EXPORT_SYMBOL(default_qdisc_ops);* - updates to tree and tree walking are only done under the rtnl mutex. */ +#define SKB_XOFF_MAGIC ((struct sk_buff *)1UL) +static inline struct sk_buff *__skb_dequeue_bad_txq (struct Qdisc *q) {const struct netdev_queue *txq = q->dev_queue;
@@ -74,7 +76,7 @@ static inline struct sk_buff *__skb_dequeue_bad_txq(struct Qdisc *q) q->q.qlen--; } }else { - skb =NULL ; + skb =SKB_XOFF_MAGIC ; } }
@@ -272,8 +274,11 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate,return skb; skb =qdisc_dequeue_skb_bad_txq (q); -if (unlikely (skb)) +if (unlikely (skb)) { +if (skb ==SKB_XOFF_MAGIC ) +return NULL ; goto bulk; + } skb = q->dequeue (q);if (skb) { bulk:
net/sched/sch_hhf.c +1 -1
@@ -529,7 +529,7 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt, new_hhf_non_hh_weight =nla_get_u32 (tb[TCA_HHF_NON_HH_WEIGHT ]); non_hh_quantum = (u64 )new_quantum * new_hhf_non_hh_weight; -if (non_hh_quantum >INT_MAX ) +if (non_hh_quantum ==0 || non_hh_quantum >INT_MAX )return -EINVAL ;sch_tree_lock (sch);
net/sctp/protocol.c +1 -1
@@ -1350,7 +1350,7 @@ static int __net_init sctp_ctrlsock_init(struct net *net)return status; } -static void __net_init sctp_ctrlsock_exit (struct net *net) +static void __net_exit sctp_ctrlsock_exit(struct net *net) {/* Free the control endpoint. */ inet_ctl_sock_destroy (net->sctp.ctl_sock);
net/sctp/sm_sideeffect.c +1 -1
@@ -562,7 +562,7 @@ static void sctp_do_8_2_transport_strike(struct sctp_cmd_seq *commands,if (net->sctp.pf_enable && (transport->state ==SCTP_ACTIVE ) && (transport->error_count < transport->pathmaxrxt) && - (transport->error_count > asoc->pf_retrans)) { + (transport->error_count > transport->pf_retrans)) { sctp_assoc_control_transport(asoc, transport, SCTP_TRANSPORT_PF,
net/tipc/name_distr.c +2 -1
@@ -221,7 +221,8 @@ static void tipc_publ_purge(struct net *net, struct publication *publ, u32 addr) publ->key); } -kfree_rcu (p, rcu); +if (p) +kfree_rcu (p, rcu); }/**