Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp3693088imm; Tue, 11 Sep 2018 00:01:29 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYtzVwp4NmxX1nUTPFpT7G0EslB3FVz0UzDm0vl5vcI5INg45gSv/c62iOdMTjrNXcfRtPI X-Received: by 2002:a63:2d87:: with SMTP id t129-v6mr26768654pgt.128.1536649289690; Tue, 11 Sep 2018 00:01:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536649289; cv=none; d=google.com; s=arc-20160816; b=dmEK/L1btPnQl0Ii4TnE0kEjz02KYls02xzonRbJ5CxJ7RcM9Zv1I4kC1oXvi65o1l gsnhzaHzvzjTKey8OZxnOQ9k5zfn5JPvuUEO3+ylXFFNh/ZYOjuVAnF6uHq1uTyA5Bxr djxD4Ur9rpK70xf6cm4AKFF6TYYQBDJ/NmzHl2C9lgnaG3mgtvZG/0ggRMBRfRLVlkUY 4bPZSirscawwe9vZYCsDKu40eYNluhH0XW6t7ofO7GnJ8ZvEnJjeVK+Xy4YjUxC3FbEW QSlSSF6+CMeiDdMN6NS6NZ0dFqhSOkMac5tKy4HiHETkHUNjT85KxMQE8toUyCA2XbO7 4LyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=cX3O5yjji/wFRoAYvxLKP+B2sRhPAdY7+bDMbl7qlCo=; b=m6EPsw9+ICMRyKiv/XjZt2xY2392xTknCqKpfLwBTGw8tOTFXLhTSjG3rekI6MdLgW sE7XyLw/osUC3WY79/L62zmdvD90wJLq1C+Io/jt1xjlOE6oIvVExD9Av/ovqZ0oBOwc PLSF50iw5eHs60EfZAWkalmyHcFhYowL/WpqGazNWf7KtxOxW+3gmB7IVqJt0JBFSoFR 0vifXU9zS7+qLGqcJm4o/Cx+zMlFveUNX3DnJTQCBTb6coLUandeYGEWPx+u31kHa++v QycOzIao0PM5p0hyS5F9BkbFKogRL7gKObNLRApA697M8hM7nvBraWEAqUBeFTWeMW43 555A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w21-v6si19806000pgk.206.2018.09.11.00.01.12; Tue, 11 Sep 2018 00:01:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727959AbeIKL5c (ORCPT + 99 others); Tue, 11 Sep 2018 07:57:32 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:60560 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726301AbeIKL5S (ORCPT ); Tue, 11 Sep 2018 07:57:18 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 467388577F; Tue, 11 Sep 2018 06:59:25 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-116-66.ams2.redhat.com [10.36.116.66]) by smtp.corp.redhat.com (Postfix) with ESMTP id E73E7104949E; Tue, 11 Sep 2018 06:59:24 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 5FD0B9AF3; Tue, 11 Sep 2018 08:59:22 +0200 (CEST) From: Gerd Hoffmann To: dri-devel@lists.freedesktop.org Cc: laurent.pinchart@ideasonboard.com, Gerd Hoffmann , Sumit Semwal , linux-media@vger.kernel.org (open list:DMA BUFFER SHARING FRAMEWORK), linaro-mm-sig@lists.linaro.org (moderated list:DMA BUFFER SHARING FRAMEWORK), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 08/10] udmabuf: improve udmabuf_create error handling Date: Tue, 11 Sep 2018 08:59:19 +0200 Message-Id: <20180911065921.23818-9-kraxel@redhat.com> In-Reply-To: <20180911065921.23818-1-kraxel@redhat.com> References: <20180911065921.23818-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Tue, 11 Sep 2018 06:59:25 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Tue, 11 Sep 2018 06:59:25 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'kraxel@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Reported-by: Laurent Pinchart Signed-off-by: Gerd Hoffmann --- drivers/dma-buf/udmabuf.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c index cb99a7886a..ec46513a47 100644 --- a/drivers/dma-buf/udmabuf.c +++ b/drivers/dma-buf/udmabuf.c @@ -126,7 +126,7 @@ static long udmabuf_create(struct const udmabuf_create_list *head, struct file *memfd = NULL; struct udmabuf *ubuf; struct dma_buf *buf; - pgoff_t pgoff, pgcnt, pgidx, pgbuf, pglimit; + pgoff_t pgoff, pgcnt, pgidx, pgbuf = 0, pglimit; struct page *page; int seals, ret = -EINVAL; u32 i, flags; @@ -138,32 +138,32 @@ static long udmabuf_create(struct const udmabuf_create_list *head, pglimit = (size_limit_mb * 1024 * 1024) >> PAGE_SHIFT; for (i = 0; i < head->count; i++) { if (!IS_ALIGNED(list[i].offset, PAGE_SIZE)) - goto err_free_ubuf; + goto err; if (!IS_ALIGNED(list[i].size, PAGE_SIZE)) - goto err_free_ubuf; + goto err; ubuf->pagecount += list[i].size >> PAGE_SHIFT; if (ubuf->pagecount > pglimit) - goto err_free_ubuf; + goto err; } ubuf->pages = kmalloc_array(ubuf->pagecount, sizeof(struct page *), GFP_KERNEL); if (!ubuf->pages) { ret = -ENOMEM; - goto err_free_ubuf; + goto err; } pgbuf = 0; for (i = 0; i < head->count; i++) { memfd = fget(list[i].memfd); if (!memfd) - goto err_put_pages; + goto err; if (!shmem_mapping(file_inode(memfd)->i_mapping)) - goto err_put_pages; + goto err; seals = memfd_fcntl(memfd, F_GET_SEALS, 0); if (seals == -EINVAL || (seals & SEALS_WANTED) != SEALS_WANTED || (seals & SEALS_DENIED) != 0) - goto err_put_pages; + goto err; pgoff = list[i].offset >> PAGE_SHIFT; pgcnt = list[i].size >> PAGE_SHIFT; for (pgidx = 0; pgidx < pgcnt; pgidx++) { @@ -171,13 +171,13 @@ static long udmabuf_create(struct const udmabuf_create_list *head, file_inode(memfd)->i_mapping, pgoff + pgidx); if (IS_ERR(page)) { ret = PTR_ERR(page); - goto err_put_pages; + goto err; } ubuf->pages[pgbuf++] = page; } fput(memfd); + memfd = NULL; } - memfd = NULL; exp_info.ops = &udmabuf_ops; exp_info.size = ubuf->pagecount << PAGE_SHIFT; @@ -186,7 +186,7 @@ static long udmabuf_create(struct const udmabuf_create_list *head, buf = dma_buf_export(&exp_info); if (IS_ERR(buf)) { ret = PTR_ERR(buf); - goto err_put_pages; + goto err; } flags = 0; @@ -194,10 +194,9 @@ static long udmabuf_create(struct const udmabuf_create_list *head, flags |= O_CLOEXEC; return dma_buf_fd(buf, flags); -err_put_pages: +err: while (pgbuf > 0) put_page(ubuf->pages[--pgbuf]); -err_free_ubuf: if (memfd) fput(memfd); kfree(ubuf->pages); -- 2.9.3