Linux 4.9.287
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.9.287 kernel.
All users of the 4.9 kernel series must upgrade.
The updated 4.9.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.9.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 - arch/arm/boot/dts/omap3430-sdp.dts | 2 - arch/arm/mach-imx/pm-imx6.c | 2 + arch/powerpc/boot/dts/fsl/t1023rdb.dts | 2 - arch/x86/events/core.c | 1 arch/xtensa/kernel/irq.c | 2 - drivers/gpu/drm/nouveau/nouveau_debugfs.c | 1 drivers/hid/hid-apple.c | 7 ++++ drivers/net/ethernet/intel/i40e/i40e_main.c | 2 - drivers/net/phy/mdio_bus.c | 7 ++++ drivers/ptp/ptp_pch.c | 1 drivers/scsi/ses.c | 2 - drivers/scsi/virtio_scsi.c | 4 +- drivers/usb/Kconfig | 3 - drivers/usb/class/cdc-acm.c | 8 ++++ fs/nfsd/nfs4xdr.c | 19 ++++++----- fs/overlayfs/dir.c | 10 ++++- kernel/bpf/stackmap.c | 3 + mm/gup.c | 48 +++++++++++++++++++++++----- mm/huge_memory.c | 7 +--- net/bridge/br_netlink.c | 2 - net/core/rtnetlink.c | 2 - net/ipv6/netfilter/ip6_tables.c | 1 net/mac80211/rx.c | 3 + net/netlink/af_netlink.c | 14 +++++--- net/sched/sch_fifo.c | 3 + 26 files changed, 117 insertions(+), 41 deletions(-)
Anand K Mistry (1):
perf/x86: Reset destroy callback on event init failure
Andy Shevchenko (1):
ptp_pch: Load module automatically if ID matches
Ben Hutchings (1):
Partially revert "usb: Kconfig: using select for USB_COMMON dependency"
Colin Ian King (1):
scsi: virtio_scsi: Fix spelling mistake "Unsupport" -> "Unsupported"
Eric Dumazet (4):
net_sched: fix NULL deref in fifo_set_limit()
net: bridge: use nla_total_size_64bit() in br_get_linkxstats_size()
netlink: annotate data races around nlk->bound
rtnetlink: fix if_nlmsg_stats_size() under estimation
Greg Kroah-Hartman (1):
Linux 4.9.287
Jeremy Sowden (1):
netfilter: ip6_tables: zero-initialize fragment offset
Jiapeng Chong (1):
scsi: ses: Fix unsigned comparison with less than zero
Jiri Benc (1):
i40e: fix endless loop under rtnl
Johan Hovold (2):
USB: cdc-acm: fix racy tty buffer accesses
USB: cdc-acm: fix break reporting
Linus Torvalds (1):
gup: document and work around "COW can break either way" issue
Max Filippov (1):
xtensa: call irqchip_init only when CONFIG_USE_OF is selected
Mizuho Mori (1):
HID: apple: Fix logical maximum and usage maximum of Magic Keyboard JIS
Oleksij Rempel (1):
ARM: imx6: disable the GIC CPU interface before calling stby-poweroff sequence
Pali Rohár (1):
powerpc/fsl/dts: Fix phy-connection-type for fm1mac3
Pavel Skripkin (1):
phy: mdio: fix memory leak
Roger Quadros (1):
ARM: dts: omap3430-sdp: Fix NAND device node
Tatsuhiko Yasumatsu (1):
bpf: Fix integer overflow in prealloc_elems_and_freelist()
Trond Myklebust (1):
nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero
Yang Yingliang (1):
drm/nouveau/debugfs: fix file release memory leak
YueHaibing (1):
mac80211: Drop frames from invalid MAC address in ad-hoc mode
Zheng Liang (1):
ovl: fix missing negative dentry check in ovl_rename()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 9 -SUBLEVEL = 286 +SUBLEVEL = 287 EXTRAVERSION = NAME = Roaring Lionus
arch/arm/boot/dts/omap3430-sdp.dts +1 -1
@@ -104,7 +104,7 @@ nand@1,0 { compatible = "ti,omap2-nand"; - reg = <0 0 4>; /* CS0, offset 0, IO size 4 */ + reg = <1 0 4>; /* CS1, offset 0, IO size 4 */ interrupt-parent = <&gpmc>; interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */ <1 IRQ_TYPE_NONE>; /* termcount */
arch/arm/mach-imx/pm-imx6.c +2 -0
@@ -15,6 +15,7 @@#include <linux/io.h> #include <linux/irq.h> #include <linux/genalloc.h> +#include <linux/irqchip/arm-gic.h> #include <linux/mfd/syscon.h> #include <linux/mfd/syscon/imx6q-iomuxc-gpr.h> #include <linux/of.h>
@@ -606,6 +607,7 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdatastatic void imx6_pm_stby_poweroff (void ) { +gic_cpu_if_down (0 );imx6_set_lpm (STOP_POWER_OFF );imx6q_suspend_finish (0 );
arch/powerpc/boot/dts/fsl/t1023rdb.dts +1 -1
@@ -125,7 +125,7 @@ fm1mac3: ethernet@e4000 { phy-handle = <&sgmii_aqr_phy3>; - phy-connection-type = "sgmii-2500"; + phy-connection-type = "2500base-x"; sleep = <&rcpm 0x20000000>; };
arch/x86/events/core.c +1 -0
@@ -2075,6 +2075,7 @@ static int x86_pmu_event_init(struct perf_event *event)if (err) {if (event->destroy) event->destroy (event); + event->destroy =NULL ; }if (ACCESS_ONCE (x86_pmu.attr_rdpmc))
arch/xtensa/kernel/irq.c +1 -1
@@ -144,7 +144,7 @@ unsigned xtensa_get_ext_irq_no(unsigned irq)void __init init_IRQ (void ) { -#ifdef CONFIG_OF +#ifdef CONFIG_USE_OF irqchip_init ();#else #ifdef CONFIG_HAVE_SMP
drivers/gpu/drm/nouveau/nouveau_debugfs.c +1 -0
@@ -178,6 +178,7 @@ static const struct file_operations nouveau_pstate_fops = { .open = nouveau_debugfs_pstate_open, .read = seq_read, .write = nouveau_debugfs_pstate_set, + .release = single_release, };static struct drm_info_list nouveau_debugfs_list[] = {
drivers/hid/hid-apple.c +7 -0
@@ -302,12 +302,19 @@ static int apple_event(struct hid_device *hdev, struct hid_field *field,/* * MacBook JIS keyboard has wrong logical maximum +* Magic Keyboard JIS has wrong logical maximum */ static __u8 *apple_report_fixup (struct hid_device *hdev,__u8 *rdesc,unsigned int *rsize) {struct apple_sc *asc =hid_get_drvdata (hdev); +if (*rsize >=71 && rdesc[70 ] ==0x65 && rdesc[64 ] ==0x65 ) { +hid_info (hdev, +"fixing up Magic Keyboard JIS report descriptor\n" ); + rdesc[64 ] = rdesc[70 ] =0xe7 ; + } +if ((asc->quirks &APPLE_RDESC_JIS ) && *rsize >=60 && rdesc[53 ] ==0x65 && rdesc[59 ] ==0x65 ) { hid_info(hdev,
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -6646,7 +6646,7 @@ static int i40e_get_capabilities(struct i40e_pf *pf)if (pf->hw.aq.asq_last_status ==I40E_AQ_RC_ENOMEM ) {/* retry with a larger buffer */ buf_len = data_size; - }else if (pf->hw.aq.asq_last_status !=I40E_AQ_RC_OK ) { + }else if (pf->hw.aq.asq_last_status !=I40E_AQ_RC_OK || err) { dev_info(&pf->pdev->dev, "capability discovery failed, err %s aq_err %s\n", i40e_stat_str(&pf->hw, err),
drivers/net/phy/mdio_bus.c +7 -0
@@ -316,6 +316,13 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner) bus->dev.groups =NULL ;dev_set_name (&bus->dev,"%s" , bus->id); +/* We need to set state to MDIOBUS_UNREGISTERED to correctly release +* the device in mdiobus_free() +* +* State will be updated later in this function in case of success +*/ + bus->state =MDIOBUS_UNREGISTERED ; + err =device_register (&bus->dev);if (err) {pr_err ("mii_bus %s failed to register\n" , bus->id);
drivers/ptp/ptp_pch.c +1 -0
@@ -698,6 +698,7 @@ static const struct pci_device_id pch_ieee1588_pcidev_id[] = { }, {0} }; +MODULE_DEVICE_TABLE (pci, pch_ieee1588_pcidev_id);static struct pci_driver pch_driver = { .name =KBUILD_MODNAME ,
drivers/scsi/ses.c +1 -1
@@ -120,7 +120,7 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,static int ses_send_diag (struct scsi_device *sdev,int page_code,void *buf,int bufflen) { -u32 result; +int result;unsigned char cmd[] = {SEND_DIAGNOSTIC ,
drivers/scsi/virtio_scsi.c +2 -2
@@ -343,7 +343,7 @@ static void virtscsi_handle_transport_reset(struct virtio_scsi *vscsi, }break ;default : -pr_info ("Unsupport virtio scsi event reason %x\n" , event->reason); +pr_info ("Unsupported virtio scsi event reason %x\n" , event->reason); } }
@@ -396,7 +396,7 @@ static void virtscsi_handle_event(struct work_struct *work)virtscsi_handle_param_change (vscsi, event);break ;default : -pr_err ("Unsupport virtio scsi event %x\n" , event->event); +pr_err ("Unsupported virtio scsi event %x\n" , event->event); }virtscsi_kick_event (vscsi, event_node); }
drivers/usb/Kconfig +1 -2
@@ -160,8 +160,7 @@ source "drivers/usb/gadget/Kconfig" config USB_LED_TRIG bool "USB LED Triggers" - depends on LEDS_CLASS && LEDS_TRIGGERS - select USB_COMMON + depends on LEDS_CLASS && USB_COMMON && LEDS_TRIGGERS help This option adds LED triggers for USB host and/or gadget activity.
drivers/usb/class/cdc-acm.c +8 -0
@@ -349,6 +349,9 @@ static void acm_ctrl_irq(struct urb *urb) acm->iocount.overrun++;spin_unlock (&acm->read_lock); +if (newctrl &ACM_CTRL_BRK ) +tty_flip_buffer_push (&acm->port); +if (difference)wake_up_all (&acm->wioctl);
@@ -408,11 +411,16 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)static void acm_process_read_urb (struct acm *acm,struct urb *urb) { +unsigned long flags; +if (!urb->actual_length)return ; +spin_lock_irqsave (&acm->read_lock, flags);tty_insert_flip_string (&acm->port, urb->transfer_buffer, urb->actual_length); +spin_unlock_irqrestore (&acm->read_lock, flags); +tty_flip_buffer_push (&acm->port); }
fs/nfsd/nfs4xdr.c +11 -8
@@ -3028,15 +3028,18 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen, goto fail; cd->rd_maxcount -= entry_bytes;/* -* RFC 3530 14.2.24 describes rd_dircount as only a "hint", so -* let's always let through the first entry, at least: +* RFC 3530 14.2.24 describes rd_dircount as only a "hint", and +* notes that it could be zero. If it is zero, then the server +* should enforce only the rd_maxcount value. */ -if (!cd->rd_dircount) - goto fail; - name_and_cookie =4 +4 *XDR_QUADLEN (namlen) +8 ; -if (name_and_cookie > cd->rd_dircount && cd->cookie_offset) - goto fail; - cd->rd_dircount -=min (cd->rd_dircount, name_and_cookie); +if (cd->rd_dircount) { + name_and_cookie =4 +4 *XDR_QUADLEN (namlen) +8 ; +if (name_and_cookie > cd->rd_dircount && cd->cookie_offset) + goto fail; + cd->rd_dircount -=min (cd->rd_dircount, name_and_cookie); +if (!cd->rd_dircount) + cd->rd_maxcount =0 ; + } cd->cookie_offset = cookie_offset; skip_entry:
fs/overlayfs/dir.c +7 -3
@@ -926,9 +926,13 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old, goto out_dput; } }else { -if (!d_is_negative (newdentry) && - (!new_opaque || !ovl_is_whiteout (newdentry))) - goto out_dput; +if (!d_is_negative (newdentry)) { +if (!new_opaque || !ovl_is_whiteout (newdentry)) + goto out_dput; + }else { +if (flags &RENAME_EXCHANGE ) + goto out_dput; + } }if (olddentry == trap)
kernel/bpf/stackmap.c +2 -1
@@ -28,7 +28,8 @@ struct bpf_stack_map {static int prealloc_elems_and_freelist (struct bpf_stack_map *smap) { -u32 elem_size =sizeof (struct stack_map_bucket ) + smap->map.value_size; +u64 elem_size =sizeof (struct stack_map_bucket ) + + (u64 )smap->map.value_size;int err; smap->elems =bpf_map_area_alloc (elem_size * smap->map.max_entries);
mm/gup.c +40 -8
92 lines not on this page · raw message
mm/huge_memory.c +3 -4
@@ -1135,13 +1135,12 @@ int do_huge_pmd_wp_page(struct fault_env *fe, pmd_t orig_pmd) }/* -* FOLL_FORCE can write to even unwritable pmd's, but only -* after we've gone through a COW cycle and they are dirty. +* FOLL_FORCE or a forced COW break can write even to unwritable pmd's, +* but only after we've gone through a COW cycle and they are dirty. */ static inline bool can_follow_write_pmd (pmd_t pmd,unsigned int flags) { -return pmd_write (pmd) || - ((flags &FOLL_FORCE ) && (flags &FOLL_COW ) &&pmd_dirty (pmd)); +return pmd_write (pmd) || ((flags &FOLL_COW ) &&pmd_dirty (pmd)); } struct page *follow_trans_huge_pmd(struct vm_area_struct *vma,
net/bridge/br_netlink.c +1 -1
@@ -1298,7 +1298,7 @@ static size_t br_get_linkxstats_size(const struct net_device *dev, int attr) }return numvls *nla_total_size (sizeof (struct bridge_vlan_xstats )) + -nla_total_size (sizeof (struct br_mcast_stats )) + +nla_total_size_64bit (sizeof (struct br_mcast_stats )) +nla_total_size (0 ); }
net/core/rtnetlink.c +1 -1
@@ -3900,7 +3900,7 @@ static int rtnl_fill_statsinfo(struct sk_buff *skb, struct net_device *dev,static size_t if_nlmsg_stats_size (const struct net_device *dev,u32 filter_mask) { -size_t size =0 ; +size_t size =NLMSG_ALIGN (sizeof (struct if_stats_msg ));if (stats_attr_valid (filter_mask,IFLA_STATS_LINK_64 ,0 )) size +=nla_total_size_64bit (sizeof (struct rtnl_link_stats64 ));
net/ipv6/netfilter/ip6_tables.c +1 -0
@@ -290,6 +290,7 @@ ip6t_do_table(struct sk_buff *skb,* things we don't know, ie. tcp syn flag or ports). If the * rule is also a fragment-specific rule, non-fragments won't * match it. */ + acpar.fragoff =0 ; acpar.hotdrop = false; acpar.net = state->net; acpar.in = state->in;
net/mac80211/rx.c +2 -1
@@ -3692,7 +3692,8 @@ static bool ieee80211_accept_frame(struct ieee80211_rx_data *rx)if (!bssid)return false;if (ether_addr_equal (sdata->vif.addr, hdr->addr2) || -ether_addr_equal (sdata->u.ibss.bssid, hdr->addr2)) +ether_addr_equal (sdata->u.ibss.bssid, hdr->addr2) || + !is_valid_ether_addr (hdr->addr2))return false;if (ieee80211_is_beacon (hdr->frame_control))return true;
net/netlink/af_netlink.c +10 -4
@@ -574,7 +574,10 @@ static int netlink_insert(struct sock *sk, u32 portid)/* We need to ensure that the socket is hashed and visible. */ smp_wmb (); -nlk_sk (sk)->bound = portid; +/* Paired with lockless reads from netlink_bind(), +* netlink_connect() and netlink_sendmsg(). +*/ +WRITE_ONCE (nlk_sk (sk)->bound, portid); err:release_sock (sk);
@@ -993,7 +996,8 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr,else if (nlk->ngroups <8 *sizeof (groups)) groups &= (1UL << nlk->ngroups) -1 ; - bound = nlk->bound; +/* Paired with WRITE_ONCE() in netlink_insert() */ + bound =READ_ONCE (nlk->bound);if (bound) {/* Ensure nlk->portid is up-to-date. */ smp_rmb ();
@@ -1073,8 +1077,9 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr,/* No need for barriers here as we return to user-space without * using any of the bound attributes. +* Paired with WRITE_ONCE() in netlink_insert(). */ -if (!nlk->bound) +if (!READ_ONCE (nlk->bound)) err =netlink_autobind (sock);if (err ==0 ) {
@@ -1821,7 +1826,8 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) dst_group = nlk->dst_group; } -if (!nlk->bound) { +/* Paired with WRITE_ONCE() in netlink_insert() */ +if (!READ_ONCE (nlk->bound)) { err =netlink_autobind (sock);if (err) goto out;
net/sched/sch_fifo.c +3 -0
@@ -151,6 +151,9 @@ int fifo_set_limit(struct Qdisc *q, unsigned int limit)if (strncmp (q->ops->id +1 ,"fifo" ,4 ) !=0 )return 0 ; +if (!q->ops->change) +return 0 ; + nla =kmalloc (nla_attr_size (sizeof (struct tc_fifo_qopt )),GFP_KERNEL );if (nla) { nla->nla_type =RTM_NEWQDISC ;