Linux 4.4.289
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.289 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.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/mach-imx/pm-imx6.c | 2 + arch/x86/kernel/cpu/perf_event.c | 1 arch/xtensa/kernel/irq.c | 2 - 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/class/cdc-acm.c | 8 ++++ fs/nfsd/nfs4xdr.c | 19 ++++++----- mm/gup.c | 48 +++++++++++++++++++++++----- mm/huge_memory.c | 10 +---- mm/memory.c | 12 ++++--- net/ipv6/netfilter/ip6_tables.c | 1 net/mac80211/rx.c | 3 + net/netlink/af_netlink.c | 14 +++++--- net/sched/sch_fifo.c | 3 + 19 files changed, 109 insertions(+), 39 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
Colin Ian King (1):
scsi: virtio_scsi: Fix spelling mistake "Unsupport" -> "Unsupported"
Eric Dumazet (2):
net_sched: fix NULL deref in fifo_set_limit()
netlink: annotate data races around nlk->bound
Greg Kroah-Hartman (1):
Linux 4.4.289
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
Lorenzo Stoakes (1):
mm: check VMA flags to avoid invalid PROT_NONE NUMA balancing
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
Pavel Skripkin (1):
phy: mdio: fix memory leak
Trond Myklebust (1):
nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero
YueHaibing (1):
mac80211: Drop frames from invalid MAC address in ad-hoc mode
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 288 +SUBLEVEL = 289 EXTRAVERSION = NAME = Blurry Fish Butt
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>
@@ -604,6 +605,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/x86/kernel/cpu/perf_event.c +1 -0
@@ -2001,6 +2001,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/hid/hid-apple.c +7 -0
@@ -301,12 +301,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
@@ -6574,7 +6574,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
@@ -264,6 +264,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
@@ -118,7 +118,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
@@ -342,7 +342,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); } }
@@ -395,7 +395,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/class/cdc-acm.c +8 -0
@@ -348,6 +348,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);
@@ -407,11 +410,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
@@ -2988,15 +2988,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:
mm/gup.c +40 -8
92 lines not on this page · raw message
mm/huge_memory.c +3 -7
@@ -1268,13 +1268,12 @@ out_unlock: }/* -* 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,
@@ -1341,9 +1340,6 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,bool was_writable;int flags =0 ; -/* A PROT_NONE fault should not end up here */ -BUG_ON (!(vma->vm_flags & (VM_READ |VM_EXEC |VM_WRITE ))); - ptl =pmd_lock (mm, pmdp);if (unlikely (!pmd_same (pmd, *pmdp))) goto out_unlock;
mm/memory.c +7 -5
@@ -3209,9 +3209,6 @@ static int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,bool was_writable =pte_write (pte);int flags =0 ; -/* A PROT_NONE fault should not end up here */ -BUG_ON (!(vma->vm_flags & (VM_READ |VM_EXEC |VM_WRITE ))); -/* * The "pte" at this point cannot be used safely without * validation through pte_unmap_same(). It's of NUMA type but
@@ -3304,6 +3301,11 @@ static int wp_huge_pmd(struct mm_struct *mm, struct vm_area_struct *vma,return VM_FAULT_FALLBACK ; } +static inline bool vma_is_accessible (struct vm_area_struct *vma) +{ +return vma->vm_flags & (VM_READ |VM_EXEC |VM_WRITE ); +} +/* * These routines also need to handle stuff like marking pages dirty * and/or accessed for architectures that don't do it in hardware (most
@@ -3350,7 +3352,7 @@ static int handle_pte_fault(struct mm_struct *mm, pte, pmd, flags, entry); } -if (pte_protnone (entry)) +if (pte_protnone (entry) &&vma_is_accessible (vma))return do_numa_page (mm, vma, address, entry, pte, pmd); ptl =pte_lockptr (mm, pmd);
@@ -3425,7 +3427,7 @@ static int __handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,if (pmd_trans_splitting (orig_pmd))return 0 ; -if (pmd_protnone (orig_pmd)) +if (pmd_protnone (orig_pmd) &&vma_is_accessible (vma))return do_huge_pmd_numa_page (mm, vma, address, orig_pmd, pmd);
net/ipv6/netfilter/ip6_tables.c +1 -0
@@ -339,6 +339,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
@@ -3447,7 +3447,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 ;