From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752452AbcKHAjC (ORCPT ); Mon, 7 Nov 2016 19:39:02 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:50364 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750938AbcKHAi7 (ORCPT ); Mon, 7 Nov 2016 19:38:59 -0500 Date: Mon, 7 Nov 2016 16:38:58 -0800 From: Andrew Morton To: Maarten ter Huurne Cc: Vinod Koul , dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH] dma-debug: Avoid NULL dereference when checking sync Message-Id: <20161107163858.cc3c523690ced2ed2a10e7db@linux-foundation.org> In-Reply-To: <1477926701-14782-1-git-send-email-maarten@treewalker.org> References: <1477926701-14782-1-git-send-email-maarten@treewalker.org> X-Mailer: Sylpheed 3.4.1 (GTK+ 2.24.23; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 31 Oct 2016 16:11:41 +0100 Maarten ter Huurne wrote: > check_sync() calls bucket_find_contain(), which in turn calls > dma_get_max_seg_size(), which dereferences the device pointer. > > ... > > --- a/lib/dma-debug.c > +++ b/lib/dma-debug.c > @@ -1223,6 +1223,11 @@ static void check_sync(struct device *dev, > struct hash_bucket *bucket; > unsigned long flags; > > + if (!ref->dev) { > + err_printk(dev, NULL, "DMA-API: device driver passes NULL for device to DMA sync function; cannot check usage\n"); > + return; > + } > + > bucket = get_hash_bucket(ref, &flags); > > entry = bucket_find_contain(&bucket, ref, &flags); Well. a) who is calling check_sync() without having filled in ref.dev? How does this occur? Is this a bug in the caller? b) why does check_sync() have a `dev' argument anyway? Is there any situation in which that will differ from ref.dev?