Linux 4.19.200
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.19.200 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/arm/boot/dts/versatile-ab.dts | 5 - arch/arm/boot/dts/versatile-pb.dts | 2 arch/x86/kvm/x86.c | 13 +- drivers/firmware/arm_scmi/driver.c | 12 +- drivers/iio/dac/ds4424.c | 6 - fs/cifs/smb2ops.c | 4 fs/hfs/bfind.c | 14 ++ fs/hfs/bnode.c | 25 ++++- fs/hfs/btree.h | 7 + fs/hfs/super.c | 10 +- include/net/af_unix.h | 1 include/net/busy_poll.h | 2 include/net/sctp/constants.h | 4 kernel/workqueue.c | 20 ++-- net/802/garp.c | 14 ++ net/802/mrp.c | 14 ++ net/Makefile | 2 net/core/sock.c | 2 net/sctp/protocol.c | 3 net/unix/Kconfig | 5 + net/unix/Makefile | 2 net/unix/af_unix.c | 102 +++++++++------------ net/unix/garbage.c | 68 -------------- net/unix/scm.c | 148 +++++++++++++++++++++++++++++++ net/unix/scm.h | 10 ++ tools/testing/selftests/vm/userfaultfd.c | 2 27 files changed, 328 insertions(+), 171 deletions(-)
Cristian Marussi (1):
firmware: arm_scmi: Fix range check for the maximum number of pending messages
Desmond Cheong Zhi Xi (3):
hfs: add missing clean-up in hfs_fill_super
hfs: fix high memory mapping in hfs_bnode_read
hfs: add lock nesting notation to hfs_find_init
Eric Dumazet (1):
net: annotate data race around sk_ll_usec
Greg Kroah-Hartman (2):
selftest: fix build error in tools/testing/selftests/vm/userfaultfd.c Linux 4.19.200
Hyunchul Lee (1):
cifs: fix the out of range assignment to bit fields in parse_server_interfaces
Jens Axboe (1):
net: split out functions related to registering inflight socket files
Maxim Levitsky (1):
KVM: x86: determine if an exception has an error code only when injecting it.
Miklos Szeredi (1):
af_unix: fix garbage collect vs MSG_PEEK
Ruslan Babayev (1):
iio: dac: ds4422/ds4424 drop of_node check
Sudeep Holla (2):
firmware: arm_scmi: Fix possible scmi_linux_errmap buffer overflow
ARM: dts: versatile: Fix up interrupt controller node names
Xin Long (1):
sctp: move 198 addresses from unusable to private scope
Yang Yingliang (3):
workqueue: fix UAF in pwq_unbound_release_workfn() net/802/mrp: fix memleak in mrp_request_join() net/802/garp: fix memleak in garp_request_join()
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 19 -SUBLEVEL = 199 +SUBLEVEL = 200 EXTRAVERSION = NAME = "People's Front"
arch/arm/boot/dts/versatile-ab.dts +2 -3
@@ -192,16 +192,15 @@ #size-cells = <1>; ranges; - vic: intc@10140000 { + vic: interrupt-controller@10140000 { compatible = "arm,versatile-vic"; interrupt-controller; #interrupt-cells = <1>; reg = <0x10140000 0x1000>; - clear-mask = <0xffffffff>; valid-mask = <0xffffffff>; }; - sic: intc@10003000 { + sic: interrupt-controller@10003000 { compatible = "arm,versatile-sic"; interrupt-controller; #interrupt-cells = <1>;
arch/arm/boot/dts/versatile-pb.dts +1 -1
@@ -7,7 +7,7 @@ amba { /* The Versatile PB is using more SIC IRQ lines than the AB */ - sic: intc@10003000 { + sic: interrupt-controller@10003000 { clear-mask = <0xffffffff>; /* * Valid interrupt lines mask according to
arch/x86/kvm/x86.c +9 -4
@@ -416,8 +416,6 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,if (!vcpu->arch.exception.pending && !vcpu->arch.exception.injected) { queue: -if (has_error && !is_protmode (vcpu)) - has_error = false;if (reinject) {/* * On vmentry, vcpu->arch.exception.pending is only
@@ -7114,6 +7112,13 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu) kvm_x86_ops->update_cr8_intercept (vcpu, tpr, max_irr); } +static void kvm_inject_exception (struct kvm_vcpu *vcpu) +{ +if (vcpu->arch.exception.error_code && !is_protmode (vcpu)) + vcpu->arch.exception.error_code = false; + kvm_x86_ops->queue_exception (vcpu); +} +static int inject_pending_event (struct kvm_vcpu *vcpu) {int r;
@@ -7121,7 +7126,7 @@ static int inject_pending_event(struct kvm_vcpu *vcpu)/* try to reinject previous events if any */ if (vcpu->arch.exception.injected) - kvm_x86_ops->queue_exception (vcpu); +kvm_inject_exception (vcpu);/* * Do not inject an NMI or interrupt if there is a pending * exception. Exceptions and interrupts are recognized at
@@ -7175,7 +7180,7 @@ static int inject_pending_event(struct kvm_vcpu *vcpu)kvm_update_dr7 (vcpu); } - kvm_x86_ops->queue_exception (vcpu); +kvm_inject_exception (vcpu); }/* Don't consider new event if we re-injected an event */
drivers/firmware/arm_scmi/driver.c +7 -5
@@ -48,7 +48,6 @@ enum scmi_error_codes {SCMI_ERR_GENERIC =-8 ,/* Generic Error */ SCMI_ERR_HARDWARE =-9 ,/* Hardware Error */ SCMI_ERR_PROTOCOL = -10,/* Protocol Error */ - SCMI_ERR_MAX };/* List of all SCMI devices active in system */
@@ -168,8 +167,10 @@ static const int scmi_linux_errmap[] = {static inline int scmi_to_linux_errno (int errno) { -if (errno <SCMI_SUCCESS && errno >SCMI_ERR_MAX ) -return scmi_linux_errmap[-errno]; +int err_idx = -errno; + +if (err_idx >=SCMI_SUCCESS && err_idx <ARRAY_SIZE (scmi_linux_errmap)) +return scmi_linux_errmap[err_idx];return -EIO ; }
@@ -628,8 +629,9 @@ static int scmi_xfer_info_init(struct scmi_info *sinfo)struct scmi_xfers_info *info = &sinfo->minfo;/* Pre-allocated messages, no more than what hdr.seq can support */ -if (WARN_ON (desc->max_msg >=MSG_TOKEN_MAX )) { -dev_err (dev,"Maximum message of %d exceeds supported %ld\n" , +if (WARN_ON (!desc->max_msg || desc->max_msg >MSG_TOKEN_MAX )) { +dev_err (dev, +"Invalid maximum messages %d, not in range [1 - %lu]\n" , desc->max_msg,MSG_TOKEN_MAX );return -EINVAL ; }
drivers/iio/dac/ds4424.c +0 -6
@@ -236,12 +236,6 @@ static int ds4424_probe(struct i2c_client *client, indio_dev->dev.of_node = client->dev.of_node; indio_dev->dev.parent = &client->dev; -if (!client->dev.of_node) { -dev_err (&client->dev, -"Not found DT.\n" ); -return -ENODEV ; - } - data->vcc_reg =devm_regulator_get (&client->dev,"vcc" );if (IS_ERR (data->vcc_reg)) { dev_err(&client->dev,
fs/cifs/smb2ops.c +2 -2
@@ -386,8 +386,8 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf, p = buf;while (bytes_left >=sizeof (*p)) { info->speed =le64_to_cpu (p->LinkSpeed); - info->rdma_capable =le32_to_cpu (p->Capability &RDMA_CAPABLE ); - info->rss_capable =le32_to_cpu (p->Capability &RSS_CAPABLE ); + info->rdma_capable =le32_to_cpu (p->Capability &RDMA_CAPABLE ) ?1 :0 ; + info->rss_capable =le32_to_cpu (p->Capability &RSS_CAPABLE ) ?1 :0 ;cifs_dbg (FYI ,"%s: adding iface %zu\n" , __func__, *iface_count);cifs_dbg (FYI ,"%s: speed %zu bps\n" , __func__, info->speed);
fs/hfs/bfind.c +13 -1
@@ -25,7 +25,19 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd) fd->key = ptr + tree->max_key_len +2 ;hfs_dbg (BNODE_REFS ,"find_init: %d (%p)\n" , tree->cnid,__builtin_return_address (0 )); -mutex_lock (&tree->tree_lock); +switch (tree->cnid) { +case HFS_CAT_CNID : +mutex_lock_nested (&tree->tree_lock,CATALOG_BTREE_MUTEX ); +break ; +case HFS_EXT_CNID : +mutex_lock_nested (&tree->tree_lock,EXTENTS_BTREE_MUTEX ); +break ; +case HFS_ATTR_CNID : +mutex_lock_nested (&tree->tree_lock,ATTR_BTREE_MUTEX ); +break ; +default : +return -EINVAL ; + }return 0 ; }
fs/hfs/bnode.c +20 -5
@@ -15,16 +15,31 @@#include "btree.h" -void hfs_bnode_read (struct hfs_bnode *node,void *buf, -int off,int len) +void hfs_bnode_read (struct hfs_bnode *node,void *buf,int off,int len) {struct page *page; +int pagenum; +int bytes_read; +int bytes_to_read; +void *vaddr; off += node->page_offset; - page = node->page[0 ]; + pagenum = off >>PAGE_SHIFT ; + off &= ~PAGE_MASK ;/* compute page offset for the first page */ -memcpy (buf,kmap (page) + off, len); -kunmap (page); +for (bytes_read =0 ; bytes_read < len; bytes_read += bytes_to_read) { +if (pagenum >= node->tree->pages_per_bnode) +break ; + page = node->page[pagenum]; + bytes_to_read =min_t (int, len - bytes_read,PAGE_SIZE - off); + + vaddr =kmap_atomic (page); +memcpy (buf + bytes_read, vaddr + off, bytes_to_read); +kunmap_atomic (vaddr); + + pagenum++; + off =0 ;/* page offset only applies to the first page */ + } }u16 hfs_bnode_read_u16 (struct hfs_bnode *node,int off)
fs/hfs/btree.h +7 -0
@@ -13,6 +13,13 @@ typedef int (*btree_keycmp)(const btree_key *, const btree_key *);#define NODE_HASH_SIZE 256 +/* B-tree mutex nested subclasses */ +enum hfs_btree_mutex_classes { +CATALOG_BTREE_MUTEX , +EXTENTS_BTREE_MUTEX , +ATTR_BTREE_MUTEX , +}; +/* A HFS BTree held in memory */ struct hfs_btree {struct super_block *sb;
fs/hfs/super.c +5 -5
@@ -427,14 +427,12 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)if (!res) {if (fd.entrylength >sizeof (rec) || fd.entrylength <0 ) { res = -EIO ; - goto bail; + goto bail_hfs_find; }hfs_bnode_read (fd.bnode, &rec, fd.entryoffset, fd.entrylength); } -if (res) { -hfs_find_exit (&fd); - goto bail_no_root; - } +if (res) + goto bail_hfs_find; res = -EINVAL ; root_inode =hfs_iget (sb, &fd.search_key->cat, &rec);hfs_find_exit (&fd);
@@ -450,6 +448,8 @@ static int hfs_fill_super(struct super_block *sb, void *data, int silent)/* everything's okay */ return 0 ; +bail_hfs_find: +hfs_find_exit (&fd); bail_no_root:pr_err ("get root inode failed\n" ); bail:
include/net/af_unix.h +1 -0
@@ -10,6 +10,7 @@void unix_inflight (struct user_struct *user,struct file *fp);void unix_notinflight (struct user_struct *user,struct file *fp); +void unix_destruct_scm (struct sk_buff *skb);void unix_gc (void );void wait_for_unix_gc (void );struct sock *unix_get_socket (struct file *filp);
include/net/busy_poll.h +1 -1
@@ -48,7 +48,7 @@ static inline bool net_busy_loop_on(void)static inline bool sk_can_busy_loop (const struct sock *sk) { -return sk->sk_ll_usec && !signal_pending (current); +return READ_ONCE (sk->sk_ll_usec) && !signal_pending (current); }bool sk_busy_loop_end (void *p,unsigned long start_time);
include/net/sctp/constants.h +1 -3
@@ -348,8 +348,7 @@ enum {#define SCTP_SCOPE_POLICY_MAX SCTP_SCOPE_POLICY_LINK/* Based on IPv4 scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>, -* SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 198.18.0.0/24, -* 192.88.99.0/24. +* SCTP IPv4 unusable addresses: 0.0.0.0/8, 224.0.0.0/4, 192.88.99.0/24. * Also, RFC 8.4, non-unicast addresses are not considered valid SCTP * addresses. */
@@ -357,7 +356,6 @@ enum { ((htonl (INADDR_BROADCAST ) == a) || \ipv4_is_multicast (a) || \ipv4_is_zeronet (a) || \ -ipv4_is_test_198 (a) || \ipv4_is_anycast_6to4 (a))/* Flags used for the bind address copy functions. */
kernel/workqueue.c +13 -7
@@ -3498,15 +3498,21 @@ static void pwq_unbound_release_workfn(struct work_struct *work) unbound_release_work);struct workqueue_struct *wq = pwq->wq;struct worker_pool *pool = pwq->pool; -bool is_last; +bool is_last = false; -if (WARN_ON_ONCE (!(wq->flags &WQ_UNBOUND ))) -return ; +/* +* when @pwq is not linked, it doesn't hold any reference to the +* @wq, and @wq is invalid to access. +*/ +if (!list_empty (&pwq->pwqs_node)) { +if (WARN_ON_ONCE (!(wq->flags &WQ_UNBOUND ))) +return ; -mutex_lock (&wq->mutex); -list_del_rcu (&pwq->pwqs_node); - is_last =list_empty (&wq->pwqs); -mutex_unlock (&wq->mutex); +mutex_lock (&wq->mutex); +list_del_rcu (&pwq->pwqs_node); + is_last =list_empty (&wq->pwqs); +mutex_unlock (&wq->mutex); + }mutex_lock (&wq_pool_mutex);put_unbound_pool (pool);
net/802/garp.c +14 -0
@@ -206,6 +206,19 @@ static void garp_attr_destroy(struct garp_applicant *app, struct garp_attr *attrkfree (attr); } +static void garp_attr_destroy_all (struct garp_applicant *app) +{ +struct rb_node *node, *next; +struct garp_attr *attr; + +for (node =rb_first (&app->gid); + next = node ?rb_next (node) :NULL , node !=NULL ; + node = next) { + attr = rb_entry(node, struct garp_attr, node); +garp_attr_destroy (app, attr); + } +} +static int garp_pdu_init (struct garp_applicant *app) {struct sk_buff *skb;
@@ -612,6 +625,7 @@ void garp_uninit_applicant(struct net_device *dev, struct garp_application *applspin_lock_bh (&app->lock);garp_gid_event (app,GARP_EVENT_TRANSMIT_PDU ); +garp_attr_destroy_all (app);garp_pdu_queue (app);spin_unlock_bh (&app->lock);
net/802/mrp.c +14 -0
@@ -295,6 +295,19 @@ static void mrp_attr_destroy(struct mrp_applicant *app, struct mrp_attr *attr)kfree (attr); } +static void mrp_attr_destroy_all (struct mrp_applicant *app) +{ +struct rb_node *node, *next; +struct mrp_attr *attr; + +for (node =rb_first (&app->mad); + next = node ?rb_next (node) :NULL , node !=NULL ; + node = next) { + attr = rb_entry(node, struct mrp_attr, node); +mrp_attr_destroy (app, attr); + } +} +static int mrp_pdu_init (struct mrp_applicant *app) {struct sk_buff *skb;
@@ -898,6 +911,7 @@ void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)spin_lock_bh (&app->lock);mrp_mad_event (app,MRP_EVENT_TX ); +mrp_attr_destroy_all (app);mrp_pdu_queue (app);spin_unlock_bh (&app->lock);
net/Makefile +1 -1
@@ -18,7 +18,7 @@ obj-$(CONFIG_NETFILTER) += netfilter/ obj-$(CONFIG_INET) += ipv4/ obj-$(CONFIG_TLS) += tls/ obj-$(CONFIG_XFRM) += xfrm/ -obj-$(CONFIG_UNIX) += unix/ +obj-$(CONFIG_UNIX_SCM) += unix/ obj-$(CONFIG_NET) += ipv6/ obj-$(CONFIG_BPFILTER) += bpfilter/ obj-$(CONFIG_PACKET) += packet/
net/core/sock.c +1 -1
@@ -989,7 +989,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,if (val <0 ) ret = -EINVAL ;else - sk->sk_ll_usec = val; + WRITE_ONCE(sk->sk_ll_usec, val); }break ;#endif
net/sctp/protocol.c +2 -1
@@ -412,7 +412,8 @@ static enum sctp_scope sctp_v4_scope(union sctp_addr *addr) retval =SCTP_SCOPE_LINK ; }else if (ipv4_is_private_10 (addr->v4.sin_addr.s_addr) ||ipv4_is_private_172 (addr->v4.sin_addr.s_addr) || -ipv4_is_private_192 (addr->v4.sin_addr.s_addr)) { +ipv4_is_private_192 (addr->v4.sin_addr.s_addr) || +ipv4_is_test_198 (addr->v4.sin_addr.s_addr)) { retval =SCTP_SCOPE_PRIVATE ; }else { retval =SCTP_SCOPE_GLOBAL ;
net/unix/Kconfig +5 -0
@@ -19,6 +19,11 @@ config UNIX Say Y unless you know what you are doing. +config UNIX_SCM + bool + depends on UNIX + default y + config UNIX_DIAG tristate "UNIX: socket monitoring interface" depends on UNIX
net/unix/Makefile +2 -0
@@ -10,3 +10,5 @@ unix-$(CONFIG_SYSCTL) += sysctl_net_unix.o obj-$(CONFIG_UNIX_DIAG) += unix_diag.o unix_diag-y := diag.o + +obj-$(CONFIG_UNIX_SCM) += scm.o
net/unix/af_unix.c +45 -57
130 lines not on this page · raw message
net/unix/garbage.c +2 -66
79 lines not on this page · raw message
net/unix/scm.c new file +148 -0
148 lines not on this page · raw message
net/unix/scm.h new file +10 -0
@@ -0,0 +1,10 @@ +#ifndef NET_UNIX_SCM_H +#define NET_UNIX_SCM_H + +extern struct list_head gc_inflight_list; +extern spinlock_t unix_gc_lock; + +int unix_attach_fds (struct scm_cookie *scm,struct sk_buff *skb); +void unix_detach_fds (struct scm_cookie *scm,struct sk_buff *skb); + +#endif
tools/testing/selftests/vm/userfaultfd.c +1 -1
@@ -131,7 +131,7 @@ static void anon_allocate_area(void **alloc_area) { *alloc_area =mmap (NULL , nr_pages * page_size,PROT_READ |PROT_WRITE ,MAP_ANONYMOUS |MAP_PRIVATE ,-1 ,0 ); -if (*alloc_area ==MAP_FAILED ) +if (*alloc_area ==MAP_FAILED ) {fprintf (stderr,"mmap of anonymous memory failed" ); *alloc_area =NULL ; }