Received: by 10.192.165.156 with SMTP id m28csp771683imm; Tue, 17 Apr 2018 20:30:50 -0700 (PDT) X-Google-Smtp-Source: AIpwx48rQ4ohE5jXNPGz9j1Y+mJNfDosFBW3+nk+YIDMsXbEsOoO1Fk4suPeTHIW0UJuqpDuYDXO X-Received: by 2002:a17:902:228:: with SMTP id 37-v6mr428894plc.141.1524022250664; Tue, 17 Apr 2018 20:30:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524022250; cv=none; d=google.com; s=arc-20160816; b=OYHiSt8N8big46Ds7ZeFS936o8mocaNqpXGa9Zz7bHzYeWPK3W9IOogfYzcu/EaY1Q GxNzm34kF171wsxvsvuSYlviQfrN7/M8z6PxDo8b29uOzPEj1nW3t8H1yD7mI87yFc9u +uXUYT8OoN4+fMDkc9wZfGZUq9W3KARcuSod7jwPKRUgCDW2tXqtd/N20AtAK2i3LtJH 6O7+BQyyUwQgVsZN/joVoLi4Jg4OVqO9yp4vTApPSvAVI8LAu5uwxdNoAXBvaChQSqd0 6TCoBP3svaFO5+8RkDi2O1AJx+YIH45/t+eGdVXgrvzq0YsMeooqvJbl4wmtKmbIKvsW Yjog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=2A6hT1RDEFCztlyfUSjBQCjUjQHpyGTbRwT5Q+KKVik=; b=Q8Q9z3kBUULN24/I80zX0SxalMAYHLch8Uf32VCrL1tcfF4YwGPC1bdeUB7OfwPJsU H9IjoSLC6iUwo+ZMY74E4WdvbrpOh+Fgb1HsSVVsXSzM3YLOPKmtXkzILpfhH7eAHh8j G5wgw5+aRDZAQNutzpmZWer2/QEeoaXPPo/CsgW1ytk71nmNGqSRHjn+74VcYRdgfv8Q NYlBeist6uUbgEsZvePaVlNWHryxijNsTxLgxpHnkIC7GhcOwsifXew47LScpLqsgity xEpEPe42l5s4ZbW9o7Jp76j84yofV9a8EVB3qbrEjkCrxCbYKs+4e8p8tHM55nsl1fKC a+eQ== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e7si241814pgr.634.2018.04.17.20.30.36; Tue, 17 Apr 2018 20:30:50 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753540AbeDRD3W (ORCPT + 99 others); Tue, 17 Apr 2018 23:29:22 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:6743 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753252AbeDRD3V (ORCPT ); Tue, 17 Apr 2018 23:29:21 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 10A4388613997; Wed, 18 Apr 2018 11:29:06 +0800 (CST) Received: from huawei.com (10.175.102.37) by DGGEMS409-HUB.china.huawei.com (10.3.19.209) with Microsoft SMTP Server id 14.3.361.1; Wed, 18 Apr 2018 11:29:02 +0800 From: Li Bin To: Al Viro , "Eric W. Biederman" , Dominik Brodowski , Andrew Morton , CC: , Subject: [PATCH] prctl: fix compat handling for prctl Date: Wed, 18 Apr 2018 11:19:04 +0800 Message-ID: <1524021544-61062-1-git-send-email-huawei.libin@huawei.com> X-Mailer: git-send-email 1.7.12.4 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.102.37] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The member auxv in prctl_mm_map structure which be shared with userspace is pointer type, but the kernel supporting COMPAT didn't handle it. This patch fix the compat handling for prctl syscall. Signed-off-by: Li Bin --- kernel/sys.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/kernel/sys.c b/kernel/sys.c index ad69218..03b9731 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1968,6 +1968,25 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map) return error; } +#ifdef CONFIG_COMPAT +struct compat_prctl_mm_map { + __u64 start_code; /* code section bounds */ + __u64 end_code; + __u64 start_data; /* data section bounds */ + __u64 end_data; + __u64 start_brk; /* heap for brk() syscall */ + __u64 brk; + __u64 start_stack; /* stack starts at */ + __u64 arg_start; /* command line arguments bounds */ + __u64 arg_end; + __u64 env_start; /* environment variables bounds */ + __u64 env_end; + compat_uptr_t auxv; /* auxiliary vector */ + __u32 auxv_size; /* vector size */ + __u32 exe_fd; /* /proc/$pid/exe link file */ +}; +#endif + #ifdef CONFIG_CHECKPOINT_RESTORE static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data_size) { @@ -1986,6 +2005,28 @@ static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data if (data_size != sizeof(prctl_map)) return -EINVAL; +#ifdef CONFIG_COMPAT + if (is_compat_task()) { + struct compat_prctl_mm_map prctl_map32; + if (copy_from_user(&prctl_map32, addr, sizeof(prctl_map32))) + return -EFAULT; + + prctl_map.start_code = prctl_map32.start_code; + prctl_map.end_code = prctl_map32.end_code; + prctl_map.start_data = prctl_map32.start_data; + prctl_map.end_data = prctl_map32.end_data; + prctl_map.start_brk = prctl_map32.start_brk; + prctl_map.brk = prctl_map32.brk; + prctl_map.start_stack = prctl_map32.start_stack; + prctl_map.arg_start = prctl_map32.arg_start; + prctl_map.arg_end = prctl_map32.arg_end; + prctl_map.env_start = prctl_map32.env_start; + prctl_map.env_end = prctl_map32.env_end; + prctl_map.auxv = compat_ptr(prctl_map32.auxv); + prctl_map.auxv_size = prctl_map32.auxv_size; + prctl_map.exe_fd = prctl_map32.exe_fd; + } else +#endif if (copy_from_user(&prctl_map, addr, sizeof(prctl_map))) return -EFAULT; -- 1.7.12.4