From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755060AbcKUUhr (ORCPT ); Mon, 21 Nov 2016 15:37:47 -0500 Received: from mx1.redhat.com ([209.132.183.28]:59942 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754873AbcKUUhq (ORCPT ); Mon, 21 Nov 2016 15:37:46 -0500 Date: Mon, 21 Nov 2016 13:37:45 -0700 From: Alex Williamson To: Eric Auger Cc: eric.auger.pro@gmail.com, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, David Hildenbrand Subject: Re: [PATCH] vfio: fix vfio_info_cap_add/shift Message-ID: <20161121133745.31fa7a1e@t450s.home> In-Reply-To: <1479709262-4707-1-git-send-email-eric.auger@redhat.com> References: <1479709262-4707-1-git-send-email-eric.auger@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 21 Nov 2016 20:37:46 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 21 Nov 2016 07:21:02 +0100 Eric Auger wrote: > Capability header next field is an offset relative to the start of > the INFO buffer. tmp->next is assigned the proper value but iterations > implemented in vfio_info_cap_add and vfio_info_cap_shift use next > as an offset between the headers. When coping with multiple capabilities > this leads to an Oops. > > Signed-off-by: Eric Auger > --- > drivers/vfio/vfio.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c > index d1d70e0..1e838d1 100644 > --- a/drivers/vfio/vfio.c > +++ b/drivers/vfio/vfio.c > @@ -1763,7 +1763,7 @@ struct vfio_info_cap_header *vfio_info_cap_add(struct vfio_info_cap *caps, > header->version = version; > > /* Add to the end of the capability chain */ > - for (tmp = caps->buf; tmp->next; tmp = (void *)tmp + tmp->next) > + for (tmp = buf; tmp->next; tmp = buf + tmp->next) > ; /* nothing */ > > tmp->next = caps->size; > @@ -1776,8 +1776,9 @@ EXPORT_SYMBOL_GPL(vfio_info_cap_add); > void vfio_info_cap_shift(struct vfio_info_cap *caps, size_t offset) > { > struct vfio_info_cap_header *tmp; > + void *buf = (void *)caps->buf; > > - for (tmp = caps->buf; tmp->next; tmp = (void *)tmp + tmp->next - offset) > + for (tmp = buf; tmp->next; tmp = buf + tmp->next - offset) > tmp->next += offset; > } > EXPORT_SYMBOL_GPL(vfio_info_cap_shift); Thanks, good to get this fixed before we start getting multiple entries in the chain and expose it via mdev. For that same reason I also don't see that this needs any sort of stable backport as the existing code works for the single entries in the tree. Applied to next branch for 4.10 with David's R-b. Thanks, Alex