Received: by 10.192.165.156 with SMTP id m28csp108068imm; Wed, 18 Apr 2018 18:17:53 -0700 (PDT) X-Google-Smtp-Source: AIpwx481lo75pJVkh+2k22owzjVHN+BR9bLvmS332iSSoGDR8pp20prEXcihvTWPDJVAf+pIaVit X-Received: by 2002:a17:902:6b03:: with SMTP id o3-v6mr4029434plk.213.1524100673114; Wed, 18 Apr 2018 18:17:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524100673; cv=none; d=google.com; s=arc-20160816; b=rHbnYIbd8Jt/QHb3YFxBXGRHsdCIymBu1JhBWrEpfI74+KRQXr2VPxrNx1YP4smfn4 UtQbMWmysYjJgl23pimHWicAA9XEkSJ9+vaNk8/+E/69t/UQdHlHZZJHEZGS+vZj+3tA PxyNMaVouDjSd3CdqNCmzogYPUkktpY+JA6uIHAjVvBXLbFGG1DSfrd27j4xfOp+3E79 BDfhOObo7ZcT3dwQrRG+mogajISpNBh0qbBBBLj8tMc/iCIkDrZSX7m/PjGE7lAa8GN3 lHXe/dCCVG1PVlYQAV67yQQf+2tf2RQcfI6AlxznExZhVf9vUd0tTFoXxduRMJ3XUx26 +RFg== 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=7jV0otkyWQ3J3fmCbKssZGchyAuSVEn5PGsidagefGQ=; b=QgXpQOZ0i2OWvBE4XWMH8i/4h5ciJa2/hvUTlp6zugSXBL65eLUo4aE88iUNUG0JNF mAngKyR6SuYUjHTaDLosQ1T9Fpc5L9zFtWn4MWMrrDU+XzvVKsX/qsf0cSmtTa2+WBDy GcqwGG/9u1RyCIRFaJpiDOUe/5S32Ck/IQvP/yZFEY4hb3vk3GOnnJjyf/SlLe3BGhtk h83pkdtzattozAxxiLqH86vFpJ+adUdJ5LMybk4fpBo2w8CI4MAlLKL5rNQyL/UNDXXZ nLa6hDRTCrb1VLXre+ZKTtXm4IEk2LLX3jrFmoh0FW0sdMu0R5pVGTDR38UVG/sQabN9 Wcag== 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 p1-v6si2276461plb.355.2018.04.18.18.17.39; Wed, 18 Apr 2018 18:17:53 -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 S1752826AbeDSBQQ (ORCPT + 99 others); Wed, 18 Apr 2018 21:16:16 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:40338 "EHLO huawei.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1752738AbeDSBQP (ORCPT ); Wed, 18 Apr 2018 21:16:15 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 07F6E552C3E3; Thu, 19 Apr 2018 09:16:11 +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; Thu, 19 Apr 2018 09:16:03 +0800 From: Li Bin To: Al Viro , "Eric W. Biederman" , Dominik Brodowski , Andrew Morton , Andy Lutomirski , CC: , Subject: [PATCH v2] prctl: fix compat handling for prctl Date: Thu, 19 Apr 2018 09:06:06 +0800 Message-ID: <1524099966-43544-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 | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/kernel/sys.c b/kernel/sys.c index ad69218..d4259938 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1969,6 +1969,26 @@ static int validate_prctl_map(struct prctl_mm_map *prctl_map) } #ifdef CONFIG_CHECKPOINT_RESTORE + +#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 + static int prctl_set_mm_map(int opt, const void __user *addr, unsigned long data_size) { struct prctl_mm_map prctl_map = { .exe_fd = (u32)-1, }; @@ -1986,6 +2006,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 (in_compat_syscall()) { + 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