Linux 6.1.192
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.1.192 kernel.
All users of the 6.1 kernel series must upgrade.
The updated 6.1.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.1.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 +- drivers/block/xen-blkback/common.h | 2 ++ drivers/block/xen-blkback/xenbus.c | 31 ++++++++++++++++++++++++------- drivers/net/xen-netback/interface.c | 2 -- drivers/net/xen-netback/xenbus.c | 3 +++ 5 files changed, 30 insertions(+), 10 deletions(-)
Greg Kroah-Hartman (1):
Linux 6.1.192
Jan Beulich (1):
xen-netback: defer xenvif_mcast_addr_list_free()
Juergen Gross (2):
xen-netback: Fix UAF when reading statistics data
xen-blkback: Avoid UAF when reading I/O statistics
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 1 -SUBLEVEL = 191 +SUBLEVEL = 192 EXTRAVERSION = NAME = Curry Ramen
drivers/block/xen-blkback/common.h +2 -0
@@ -318,8 +318,10 @@ struct xen_blkif {unsigned int nr_ring_pages;bool multi_ref;/* All rings for this device. */ +rwlock_t rings_lock;struct xen_blkif_ring *rings;unsigned int nr_rings; +unsigned long buffer_squeeze_end; };
drivers/block/xen-blkback/xenbus.c +24 -7
@@ -127,15 +127,23 @@ static void xen_update_blkif_status(struct xen_blkif *blkif)return ; } -static int xen_blkif_alloc_rings (struct xen_blkif *blkif) +static int xen_blkif_alloc_rings (struct xen_blkif *blkif, +unsigned int nr_rings) {unsigned int r; +struct xen_blkif_ring *rings; - blkif->rings =kcalloc (blkif->nr_rings,sizeof (struct xen_blkif_ring ), -GFP_KERNEL ); -if (!blkif->rings) + rings =kcalloc (nr_rings,sizeof (struct xen_blkif_ring ),GFP_KERNEL ); +if (!rings)return -ENOMEM ; +write_lock (&blkif->rings_lock); + + blkif->rings = rings; + blkif->nr_rings = nr_rings; + +write_unlock (&blkif->rings_lock); +for (r =0 ; r < blkif->nr_rings; r++) {struct xen_blkif_ring *ring = &blkif->rings[r];
@@ -175,6 +183,7 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid) blkif->domid = domid;atomic_set (&blkif->refcnt,1 );init_completion (&blkif->drain_complete); +rwlock_init (&blkif->rings_lock);/* * Because freeing back to the cache may be deferred, it is not
@@ -269,6 +278,7 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif)struct pending_req *req, *n;unsigned int j, r;bool busy = false; +struct xen_blkif_ring *rings;for (r =0 ; r < blkif->nr_rings; r++) {struct xen_blkif_ring *ring = &blkif->rings[r];
@@ -335,10 +345,16 @@ static int xen_blkif_disconnect(struct xen_blkif *blkif)* blkif->rings was allocated in connect_ring, so we should free it in * here. */ -kfree (blkif->rings); +write_lock (&blkif->rings_lock); + + rings = blkif->rings; blkif->rings =NULL ; blkif->nr_rings =0 ; +write_unlock (&blkif->rings_lock); + +kfree (rings); +return 0 ; }
@@ -386,6 +402,7 @@ void xen_blkif_interface_fini(void)unsigned int i; \unsigned long long result =0 ; \ \ +read_lock (&blkif->rings_lock); \if (!blkif->rings) \ goto out; \ \
@@ -396,6 +413,7 @@ void xen_blkif_interface_fini(void) } \ \ out: \ +read_unlock (&blkif->rings_lock); \return sprintf (buf, format, result); \ } \ static DEVICE_ATTR(name, 0444, show_##name, NULL)
@@ -1104,8 +1122,7 @@ static int connect_ring(struct backend_info *be) requested_num_queues, xenblk_max_queues);return -ENOSYS ; } - blkif->nr_rings = requested_num_queues; -if (xen_blkif_alloc_rings (blkif)) +if (xen_blkif_alloc_rings (blkif, requested_num_queues))return -ENOMEM ; pr_info("%s: using %d queues, protocol %d (%s) %s\n", dev->nodename,
drivers/net/xen-netback/interface.c +0 -2
@@ -810,8 +810,6 @@ void xenvif_disconnect_data(struct xenvif *vif)xenvif_disconnect_queue (queue); } - -xenvif_mcast_addr_list_free (vif); }void xenvif_disconnect_ctrl (struct xenvif *vif)
drivers/net/xen-netback/xenbus.c +3 -0
@@ -267,6 +267,8 @@ static void backend_disconnect(struct backend_info *be) vif->num_queues =0 ;synchronize_net (); +xenvif_mcast_addr_list_free (vif); +for (queue_index =0 ; queue_index < num_queues; ++queue_index)xenvif_deinit_queue (&vif->queues[queue_index]);
@@ -837,6 +839,7 @@ static void connect(struct backend_info *be) err:if (be->vif->num_queues >0 )xenvif_disconnect_data (be->vif);/* Clean up existing queues */ +synchronize_net ();for (queue_index =0 ; queue_index < be->vif->num_queues; ++queue_index)xenvif_deinit_queue (&be->vif->queues[queue_index]);vfree (be->vif->queues);