Linux 4.4.285
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.285 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/s390/net/bpf_jit_comp.c | 50 +++++++++++----------- block/blk-throttle.c | 1 drivers/base/power/wakeirq.c | 6 +- drivers/dma/Kconfig | 2 drivers/dma/acpi-dma.c | 11 +++- drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c | 2 drivers/parisc/dino.c | 18 +++---- drivers/thermal/samsung/exynos_tmu.c | 1 fs/ceph/caps.c | 2 fs/nilfs2/sysfs.c | 26 ++++------- include/net/sctp/structs.h | 2 kernel/profile.c | 21 ++++----- kernel/sys.c | 7 --- net/9p/trans_virtio.c | 4 + net/sctp/bind_addr.c | 20 ++++---- net/sctp/input.c | 9 +++ net/sctp/ipv6.c | 7 ++- net/sctp/protocol.c | 7 ++- net/sctp/sm_make_chunk.c | 42 +++++++++++------- 20 files changed, 137 insertions(+), 103 deletions(-)
Andy Shevchenko (2):
dmaengine: acpi-dma: check for 64-bit MMIO address
dmaengine: acpi: Avoid comparison GSI with Linux vIRQ
Cyrill Gorcunov (1):
prctl: allow to setup brk for et_dyn executables
Dan Carpenter (1):
thermal/drivers/exynos: Fix an error code in exynos_tmu_probe()
Greg Kroah-Hartman (1):
Linux 4.4.285
Guenter Roeck (2):
parisc: Move pci_dev_is_behind_card_dino to where it is used drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV
Ilya Leoshkevich (1):
s390/bpf: Fix optimizing out zero-extensions
Jeff Layton (1):
ceph: lockdep annotations for try_nonblocking_invalidate
Johannes Berg (1):
dmaengine: ioat: depends on !UML
Li Jinlin (1):
blk-throttle: fix UAF by deleteing timer in blk_throtl_exit()
Marcelo Ricardo Leitner (3):
sctp: validate chunk size in __rcv_asconf_lookup
sctp: add param size validation for SCTP_PARAM_SET_PRIMARY
sctp: validate from_addr_param return
Nanyong Sun (6):
nilfs2: fix memory leak in nilfs_sysfs_create_device_group
nilfs2: fix NULL pointer in nilfs_##name##_attr_release
nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group
nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group
nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group
nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group
Pavel Skripkin (1):
profiling: fix shift-out-of-bounds bugs
Tony Lindgren (1):
PM / wakeirq: Fix unbalanced IRQ enable for wakeirq
Xie Yongji (1):
9p/trans_virtio: Remove sysfs file on probe failure
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 284 +SUBLEVEL = 285 EXTRAVERSION = NAME = Blurry Fish Butt
arch/s390/net/bpf_jit_comp.c +26 -24
92 lines not on this page · raw message
block/blk-throttle.c +1 -0
@@ -1588,6 +1588,7 @@ int blk_throtl_init(struct request_queue *q)void blk_throtl_exit (struct request_queue *q) {BUG_ON (!q->td); +del_timer_sync (&q->td->service_queue.pending_timer);throtl_shutdown_wq (q);blkcg_deactivate_policy (q, &blkcg_policy_throtl);kfree (q->td);
drivers/base/power/wakeirq.c +4 -2
@@ -320,7 +320,8 @@ void dev_pm_arm_wake_irq(struct wake_irq *wirq)return ;if (device_may_wakeup (wirq->dev)) { -if (wirq->status &WAKE_IRQ_DEDICATED_ALLOCATED ) +if (wirq->status &WAKE_IRQ_DEDICATED_ALLOCATED && + !pm_runtime_status_suspended (wirq->dev))enable_irq (wirq->irq);enable_irq_wake (wirq->irq);
@@ -342,7 +343,8 @@ void dev_pm_disarm_wake_irq(struct wake_irq *wirq)if (device_may_wakeup (wirq->dev)) {disable_irq_wake (wirq->irq); -if (wirq->status &WAKE_IRQ_DEDICATED_ALLOCATED ) +if (wirq->status &WAKE_IRQ_DEDICATED_ALLOCATED && + !pm_runtime_status_suspended (wirq->dev))disable_irq_nosync (wirq->irq); } }
drivers/dma/Kconfig +1 -1
@@ -239,7 +239,7 @@ config INTEL_IDMA64 config INTEL_IOATDMA tristate "Intel I/OAT DMA support" - depends on PCI && X86_64 + depends on PCI && X86_64 && !UML select DMA_ENGINE select DMA_ENGINE_RAID select DCA
drivers/dma/acpi-dma.c +9 -2
@@ -15,6 +15,7 @@#include <linux/device.h> #include <linux/err.h> #include <linux/module.h> +#include <linux/kernel.h> #include <linux/list.h> #include <linux/mutex.h> #include <linux/slab.h>
@@ -71,8 +72,14 @@ static int acpi_dma_parse_resource_group(const struct acpi_csrt_group *grp, si = (const struct acpi_csrt_shared_info *)&grp[1 ]; -/* Match device by MMIO and IRQ */ -if (si->mmio_base_low != mem || si->gsi_interrupt != irq) +/* Match device by MMIO */ +if (si->mmio_base_low !=lower_32_bits (mem) || + si->mmio_base_high !=upper_32_bits (mem)) +return 0 ; + +/* Match device by Linux vIRQ */ + ret =acpi_register_gsi (NULL , si->gsi_interrupt, si->interrupt_mode, si->interrupt_polarity); +if (ret != irq)return 0 ; dev_dbg(&adev->dev, "matches with %.4s%04X (rev %u)\n",
drivers/gpu/drm/nouveau/nvkm/engine/device/ctrl.c +1 -1
@@ -56,7 +56,7 @@ nvkm_control_mthd_pstate_info(struct nvkm_control *ctrl, void *data, u32 size) args->v0.count =0 ; args->v0.ustate_ac =NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE ; args->v0.ustate_dc =NVIF_CONTROL_PSTATE_INFO_V0_USTATE_DISABLE ; - args->v0.pwrsrc = -ENOSYS ; + args->v0.pwrsrc = -ENODEV ; args->v0.pstate =NVIF_CONTROL_PSTATE_INFO_V0_PSTATE_UNKNOWN ; }
drivers/parisc/dino.c +9 -9
@@ -160,15 +160,6 @@ struct dino_device (struct dino_device *)__pdata; }) -/* Check if PCI device is behind a Card-mode Dino. */ -static int pci_dev_is_behind_card_dino (struct pci_dev *dev) -{ -struct dino_device *dino_dev; - - dino_dev =DINO_DEV (parisc_walk_tree (dev->bus->bridge)); -return is_card_dino (&dino_dev->hba.dev->id); -} -/* * Dino Configuration Space Accessor Functions */
@@ -452,6 +443,15 @@ static void quirk_cirrus_cardbus(struct pci_dev *dev)DECLARE_PCI_FIXUP_ENABLE (PCI_VENDOR_ID_CIRRUS ,PCI_DEVICE_ID_CIRRUS_6832 , quirk_cirrus_cardbus );#ifdef CONFIG_TULIP +/* Check if PCI device is behind a Card-mode Dino. */ +static int pci_dev_is_behind_card_dino (struct pci_dev *dev) +{ +struct dino_device *dino_dev; + + dino_dev =DINO_DEV (parisc_walk_tree (dev->bus->bridge)); +return is_card_dino (&dino_dev->hba.dev->id); +} +static void pci_fixup_tulip (struct pci_dev *dev) {if (!pci_dev_is_behind_card_dino (dev))
drivers/thermal/samsung/exynos_tmu.c +1 -0
@@ -1347,6 +1347,7 @@ static int exynos_tmu_probe(struct platform_device *pdev) data->sclk =devm_clk_get (&pdev->dev,"tmu_sclk" );if (IS_ERR (data->sclk)) {dev_err (&pdev->dev,"Failed to get sclk\n" ); + ret =PTR_ERR (data->sclk); goto err_clk; }else { ret =clk_prepare_enable (data->sclk);
fs/ceph/caps.c +2 -0
@@ -1545,6 +1545,8 @@ static int __mark_caps_flushing(struct inode *inode,* try to invalidate mapping pages without blocking. */ static int try_nonblocking_invalidate (struct inode *inode) + __releases(ci->i_ceph_lock) + __acquires(ci->i_ceph_lock) {struct ceph_inode_info *ci =ceph_inode (inode);u32 invalidating_gen = ci->i_rdcache_gen;
fs/nilfs2/sysfs.c +11 -15
@@ -73,11 +73,9 @@ static const struct sysfs_ops nilfs_##name##_attr_ops = { \#define NILFS_DEV_INT_GROUP_TYPE (name, parent_name) \ static void nilfs_##name##_attr_release(struct kobject *kobj) \ { \ - struct nilfs_sysfs_##parent_name##_subgroups *subgroups; \ - struct the_nilfs *nilfs = container_of(kobj->parent, \ - struct the_nilfs, \ - ns_##parent_name##_kobj); \ - subgroups = nilfs->ns_##parent_name##_subgroups; \ + struct nilfs_sysfs_##parent_name##_subgroups *subgroups = container_of(kobj, \ + struct nilfs_sysfs_##parent_name##_subgroups, \ + sg_##name##_kobj); \ complete(&subgroups->sg_##name##_kobj_unregister); \ } \ static struct kobj_type nilfs_##name##_ktype = { \
@@ -103,12 +101,12 @@ static int nilfs_sysfs_create_##name##_group(struct the_nilfs *nilfs) \ err = kobject_init_and_add(kobj, &nilfs_##name##_ktype, parent, \ #name); \ if (err) \ - return err; \ - return 0; \ + kobject_put(kobj); \ + return err; \ } \ static void nilfs_sysfs_delete_##name##_group(struct the_nilfs *nilfs) \ { \ - kobject_del(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \ + kobject_put(&nilfs->ns_##parent_name##_subgroups->sg_##name##_kobj); \ }/************************************************************************
@@ -219,14 +217,14 @@ int nilfs_sysfs_create_snapshot_group(struct nilfs_root *root) }if (err) -return err; +kobject_put (&root->snapshot_kobj); -return 0 ; +return err; }void nilfs_sysfs_delete_snapshot_group (struct nilfs_root *root) { -kobject_del (&root->snapshot_kobj); +kobject_put (&root->snapshot_kobj); }/************************************************************************
@@ -1008,7 +1006,7 @@ int nilfs_sysfs_create_device_group(struct super_block *sb) err =kobject_init_and_add (&nilfs->ns_dev_kobj, &nilfs_dev_ktype,NULL ,"%s" , sb->s_id);if (err) - goto free_dev_subgroups; + goto cleanup_dev_kobject; err =nilfs_sysfs_create_mounted_snapshots_group (nilfs);if (err)
@@ -1045,9 +1043,7 @@ delete_mounted_snapshots_group:nilfs_sysfs_delete_mounted_snapshots_group (nilfs); cleanup_dev_kobject: -kobject_del (&nilfs->ns_dev_kobj); - -free_dev_subgroups: +kobject_put (&nilfs->ns_dev_kobj);kfree (nilfs->ns_dev_subgroups); failed_create_device_group:
include/net/sctp/structs.h +1 -1
@@ -469,7 +469,7 @@ struct sctp_af { int saddr);void (*from_sk) (union sctp_addr *,struct sock *sk); -void (*from_addr_param) (union sctp_addr *, +bool (*from_addr_param) (union sctp_addr *,union sctp_addr_param *,__be16 port,int iif); int (*to_addr_param) (const union sctp_addr *,
kernel/profile.c +11 -10
@@ -38,7 +38,8 @@ struct profile_hit {#define NR_PROFILE_GRP (NR_PROFILE_HIT/PROFILE_GRPSZ)static atomic_t *prof_buffer; -static unsigned long prof_len, prof_shift; +static unsigned long prof_len; +static unsigned short int prof_shift;int prof_on__read_mostly ;EXPORT_SYMBOL_GPL (prof_on);
@@ -63,8 +64,8 @@ int profile_setup(char *str)if (str[strlen (sleepstr)] ==',' ) str +=strlen (sleepstr) +1 ;if (get_option (&str, &par)) - prof_shift = par; -pr_info ("kernel sleep profiling enabled (shift: %ld)\n" , + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); +pr_info ("kernel sleep profiling enabled (shift: %u)\n" , prof_shift);#else pr_warn ("kernel sleep profiling requires CONFIG_SCHEDSTATS\n" );
@@ -74,21 +75,21 @@ int profile_setup(char *str)if (str[strlen (schedstr)] ==',' ) str +=strlen (schedstr) +1 ;if (get_option (&str, &par)) - prof_shift = par; -pr_info ("kernel schedule profiling enabled (shift: %ld)\n" , + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); +pr_info ("kernel schedule profiling enabled (shift: %u)\n" , prof_shift); }else if (!strncmp (str, kvmstr,strlen (kvmstr))) { prof_on =KVM_PROFILING ;if (str[strlen (kvmstr)] ==',' ) str +=strlen (kvmstr) +1 ;if (get_option (&str, &par)) - prof_shift = par; -pr_info ("kernel KVM profiling enabled (shift: %ld)\n" , + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); +pr_info ("kernel KVM profiling enabled (shift: %u)\n" , prof_shift); }else if (get_option (&str, &par)) { - prof_shift = par; + prof_shift =clamp (par,0 ,BITS_PER_LONG -1 ); prof_on =CPU_PROFILING ; -pr_info ("kernel profiling enabled (shift: %ld)\n" , +pr_info ("kernel profiling enabled (shift: %u)\n" , prof_shift); }return 1 ;
@@ -475,7 +476,7 @@ read_profile(struct file *file, char __user *buf, size_t count, loff_t *ppos)unsigned long p = *ppos;ssize_t read;char *pnt; -unsigned int sample_step =1 << prof_shift; +unsigned long sample_step =1UL << prof_shift;profile_flip_buffers ();if (p >= (prof_len+1 )*sizeof (unsigned int ))
kernel/sys.c +0 -7
@@ -1774,13 +1774,6 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map) error = -EINVAL ; -/* -* @brk should be after @end_data in traditional maps. -*/ -if (prctl_map->start_brk <= prctl_map->end_data || - prctl_map->brk <= prctl_map->end_data) - goto out; -/* * Neither we should allow to override limits if they set. */
net/9p/trans_virtio.c +3 -1
@@ -605,7 +605,7 @@ static int p9_virtio_probe(struct virtio_device *vdev) chan->vc_wq =kmalloc (sizeof (wait_queue_head_t),GFP_KERNEL );if (!chan->vc_wq) { err = -ENOMEM ; - goto out_free_tag; + goto out_remove_file; }init_waitqueue_head (chan->vc_wq); chan->ring_bufs_avail =1 ;
@@ -623,6 +623,8 @@ static int p9_virtio_probe(struct virtio_device *vdev)return 0 ; +out_remove_file: +sysfs_remove_file (&vdev->dev.kobj, &dev_attr_mount_tag.attr); out_free_tag:kfree (tag); out_free_vq:
net/sctp/bind_addr.c +11 -9
@@ -284,19 +284,15 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, rawaddr = (union sctp_addr_param *)raw_addr_list; af =sctp_get_af_specific (param_type2af (param->type)); -if (unlikely (!af)) { +if (unlikely (!af) || + !af->from_addr_param (&addr, rawaddr,htons (port),0 )) { retval = -EINVAL ; -sctp_bind_addr_clean (bp); -break ; + goto out_err; } - af->from_addr_param (&addr, rawaddr,htons (port),0 ); retval =sctp_add_bind_addr (bp, &addr,SCTP_ADDR_SRC , gfp); -if (retval) { -/* Can't finish building the list, clean up. */ -sctp_bind_addr_clean (bp); -break ; - } +if (retval) + goto out_err; len =ntohs (param->length); addrs_len -= len;
@@ -304,6 +300,12 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list, }return retval; + +out_err: +if (retval) +sctp_bind_addr_clean (bp); + +return retval; }/********************************************************************
net/sctp/input.c +7 -2
@@ -972,7 +972,8 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,if (!af)continue ; - af->from_addr_param (paddr, params.addr, sh->source,0 ); +if (!af->from_addr_param (paddr, params.addr, sh->source,0 )) +continue ; asoc =__sctp_lookup_association (net, laddr, paddr, &transport);if (asoc)
@@ -1008,6 +1009,9 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(union sctp_addr_param *param;union sctp_addr paddr; +if (ntohs (ch->length) <sizeof (*asconf) +sizeof (struct sctp_paramhdr )) +return NULL ; +/* Skip over the ADDIP header and find the Address parameter */ param = (union sctp_addr_param *)(asconf +1 );
@@ -1015,7 +1019,8 @@ static struct sctp_association *__sctp_rcv_asconf_lookup(if (unlikely (!af))return NULL ; - af->from_addr_param (&paddr, param, peer_port,0 ); +if (af->from_addr_param (&paddr, param, peer_port,0 )) +return NULL ;return __sctp_lookup_association (net, laddr, &paddr, transportp); }
net/sctp/ipv6.c +6 -1
@@ -488,15 +488,20 @@ static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk) }/* Initialize a sctp_addr from an address parameter. */ -static void sctp_v6_from_addr_param (union sctp_addr *addr, +static bool sctp_v6_from_addr_param (union sctp_addr *addr,union sctp_addr_param *param,__be16 port,int iif) { +if (ntohs (param->v6.param_hdr.length) <sizeof (struct sctp_ipv6addr_param )) +return false; + addr->v6.sin6_family =AF_INET6 ; addr->v6.sin6_port = port; addr->v6.sin6_flowinfo =0 ;/* BUG */ addr->v6.sin6_addr = param->v6.addr; addr->v6.sin6_scope_id = iif; + +return true; }/* Initialize an address parameter from a sctp_addr and return the length
net/sctp/protocol.c +6 -1
@@ -272,14 +272,19 @@ static void sctp_v4_to_sk_daddr(union sctp_addr *addr, struct sock *sk) }/* Initialize a sctp_addr from an address parameter. */ -static void sctp_v4_from_addr_param (union sctp_addr *addr, +static bool sctp_v4_from_addr_param (union sctp_addr *addr,union sctp_addr_param *param,__be16 port,int iif) { +if (ntohs (param->v4.param_hdr.length) <sizeof (struct sctp_ipv4addr_param )) +return false; + addr->v4.sin_family =AF_INET ; addr->v4.sin_port = port; addr->v4.sin_addr.s_addr = param->v4.addr.s_addr;memset (addr->v4.sin_zero,0 ,sizeof (addr->v4.sin_zero)); + +return true; }/* Initialize an address parameter from a sctp_addr and return the length
net/sctp/sm_make_chunk.c +26 -16
82 lines not on this page · raw message