From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753180AbdECOMa (ORCPT ); Wed, 3 May 2017 10:12:30 -0400 Received: from foss.arm.com ([217.140.101.70]:56712 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751462AbdECOM0 (ORCPT ); Wed, 3 May 2017 10:12:26 -0400 Date: Wed, 3 May 2017 15:12:21 +0100 From: Catalin Marinas To: Robin Murphy Cc: linux-kernel@vger.kernel.org, a.hajda@samsung.com, Laura Abbott , geert@linux-m68k.org, linux-arm-kernel@lists.infradead.org, Greg Kroah-Hartman Subject: Re: [PATCH] arm64: Do not leave an invalid area->pages pointer in dma_common_contiguous_remap() Message-ID: <20170503141221.GA23620@e104818-lin.cambridge.arm.com> References: <1493144543-2497-1-git-send-email-catalin.marinas@arm.com> <9ae0fc6b-1da5-760b-9e92-f03bfcf77cd3@arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9ae0fc6b-1da5-760b-9e92-f03bfcf77cd3@arm.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 03, 2017 at 01:10:26PM +0100, Robin Murphy wrote: > On 25/04/17 19:22, Catalin Marinas wrote: > > The dma_common_pages_remap() function allocates a vm_struct object and > > initialises the pages pointer to value passed as argument. However, when > > this function is called dma_common_contiguous_remap(), the pages array > > is only temporarily allocated, being freed shortly after > > dma_common_contiguous_remap() returns. Architecture code checking the > > validity of an area->pages pointer would incorrectly dereference already > > freed pointers. This has been exposed by the arm64 commit 44176bb38fa4 > > ("arm64: Add support for DMA_ATTR_FORCE_CONTIGUOUS to IOMMU"). > > > > Fixes: 513510ddba96 ("common: dma-mapping: introduce common remapping functions") > > Cc: Laura Abbott > > Cc: Greg Kroah-Hartman > > Reported-by: Andrzej Hajda > > Signed-off-by: Catalin Marinas > > --- > > > > This is for correctness since once the arm64's mmap and get_sgtable ops > > are fixed for DMA_ATTR_FORCE_CONTIGUOUS, we would no longer see the > > issue. Anyway, it's better to get this fixed in case others trip over a > > similar issue. I added a "Fixes" tag for completeness but I'm not sure > > it's worth back-porting. > > > > drivers/base/dma-mapping.c | 29 ++++++++++++++++++++++------- > > 1 file changed, 22 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c > > index efd71cf4fdea..ab7071041141 100644 > > --- a/drivers/base/dma-mapping.c > > +++ b/drivers/base/dma-mapping.c > > @@ -277,8 +277,8 @@ EXPORT_SYMBOL(dma_common_mmap); > > * remaps an array of PAGE_SIZE pages into another vm_area > > * Cannot be used in non-sleeping contexts > > */ > > Nit: the above comment ends up in the wrong place now (it should still > belong to dma_common_pages_remap()). Good point, thanks. I'll send a v2 to Greg as we don't really have a dependency on this on arm64 (once the DMA_ATTR_FORCE_CONTIGUOUS patch is fixed or reverted). -- Catalin