Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp774366pxj; Fri, 11 Jun 2021 11:07:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwDq7CsbIrZNcKJyk81azsgy6z5+PSJR7+Vbr5SVuxgIJZKzzlTy6kDRtaU/ZC4F53SbgBi X-Received: by 2002:a05:6402:270f:: with SMTP id y15mr5057255edd.88.1623434827075; Fri, 11 Jun 2021 11:07:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623434827; cv=none; d=google.com; s=arc-20160816; b=M0AXVzxVeVqC5o3b6/xVsDlco41cuOU4BuZPjuqvGsQxpyyqSfIrXs758CB1QZBxwn 5USFUEwh9hHJvA2QlT6MBGDDr62bwpYNntTlu4BhIbUG2EzOHS1Cd+xYA0GIXQxG89wk 8hmFDTdfJvTkH8FHqZ/JoNR/tEOjwe+7ZlK7GeOpVNDjbHeuUHOOQHC/EyRdxdGr+Nad Amshvad56Y0IbWZ+rSUvn3iewgE3FrUzh3ONqsJkfvVSmNW3S1zhS0VJZyFfXCDUFzf0 0OFjTbFAjGS5bGy0IPwmY9nXE7hc72iKLNyzvkcy2XmM1hz7VBYVtpQnuckibfMaiCUo ulUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=InEOMOZ7wGAOxeUq6PLoyewZ6xlseHrkNPhjJnzVF/0=; b=kf3oABVZyDqQZvEcM/W/tZGa6Olu2AuFW0avfesu4n+UDZHKVnpjkRYipOlkU+UKd/ Y/sNoExHxGsSV3I9ZvTFmQiryltS6CWD3DGjBfTedGdBhFi3KZVOoC9qb9YzRwtoiodU QZxoRQsc0ljSRMue7tVWSM+abAPOcJcY0Rc+1kOJy0Oc0CI9oJjHa76lkGJ0gvuZpLrL kYFagn8HU8Ume6vsPX6TT4dj+xv2UNNunbpZ9JCUCpnxpnmOBlwqwjdVr5CnPr2yTDOO H2nPYnuC6DQNRzHg0BfdUgEOxEelH6QcgVtgL+H835hBS09OUSvK3629hJxHM6JfZKau BM3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@arista.com header.s=google header.b=erIFfuqi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=arista.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id n6si5350573edo.119.2021.06.11.11.06.43; Fri, 11 Jun 2021 11:07:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@arista.com header.s=google header.b=erIFfuqi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=arista.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231164AbhFKSG3 (ORCPT + 99 others); Fri, 11 Jun 2021 14:06:29 -0400 Received: from mail-wm1-f41.google.com ([209.85.128.41]:42584 "EHLO mail-wm1-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231621AbhFKSGG (ORCPT ); Fri, 11 Jun 2021 14:06:06 -0400 Received: by mail-wm1-f41.google.com with SMTP id l7-20020a05600c1d07b02901b0e2ebd6deso9085218wms.1 for ; Fri, 11 Jun 2021 11:04:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=InEOMOZ7wGAOxeUq6PLoyewZ6xlseHrkNPhjJnzVF/0=; b=erIFfuqiRhByY/ZG1wQU2rUOpL/ZI8cMbtEf3/LDDrK4tyzLZIhrZSlkkEesdzKBSp t+5c06yhEfHKFdu1nnhntEzqNcWVyz1alPLM4zSTIkRvZxvynNP9oqpqoQhmJUMP6rqZ rVtD4RtHV2uuVJpMMDDKaUMB2TLhEk4Ys/S9UJT8OvKVmGbr5/RNtu3lJh4kQhsp1nFp xPBGAROpzHDXRq59gXCyhmkaI1TamTox0S2LEdBl80eA+bbwmdNDdpKySnt4Flv7GGKl qKhYv2Ci0FFgXG+IduAcazkpMjOAqH74nNV5qZU3KrUwmk5zGU+xwbHd8fKZMgvxlML4 vqVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=InEOMOZ7wGAOxeUq6PLoyewZ6xlseHrkNPhjJnzVF/0=; b=NmyI42PM/DB8wh0b11EXwph8BlF4MEAt3QXTr+zSOArVBFqNe5yjdrlmIAuZP9oLme C6qoJ2Ro9FUsVRAnfkmgFdw/kYck5sCndOzbDr7oz9uUwe0t219fgWKrhiAx2d90kfdL urY27iEZ2E9T2mcqMKC882gMBcb3ABBrO8pTeOsDWSCOKliQfSrTPObLkwipHbpapDEq ynbk93WkrJSUaHlVMhZ9UCGzFL1XjIOp+/YBMI0puRoWnim/HQXVfKtdooww+Xk5vZ3O 7b0uvo3oCSOaWr5YvLhOWutVsW6Zz5HX2N4L3BdfeU/vkb+KN5fpVMgZLHPwECA0xHwh RaAw== X-Gm-Message-State: AOAM532H8lX9cges6KQ21WwFMRlZnT1FkJNu3nxB0qYnlc+78gvn8o4l le3C5S9JQF26JYwM0BOjquAoDev7U8zQ9XS+ X-Received: by 2002:a7b:cf18:: with SMTP id l24mr20820984wmg.160.1623434579365; Fri, 11 Jun 2021 11:02:59 -0700 (PDT) Received: from localhost.localdomain ([2a02:8084:e84:2480:228:f8ff:fe6f:83a8]) by smtp.gmail.com with ESMTPSA id v15sm7425881wrw.24.2021.06.11.11.02.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Jun 2021 11:02:59 -0700 (PDT) From: Dmitry Safonov To: linux-kernel@vger.kernel.org Cc: Dmitry Safonov <0x7f454c46@gmail.com>, Dmitry Safonov , Alexander Viro , Andrew Morton , Andy Lutomirski , Arnd Bergmann , Borislav Petkov , Catalin Marinas , Christophe Leroy , Guo Ren , "H. Peter Anvin" , Ingo Molnar , Oleg Nesterov , Russell King , Thomas Bogendoerfer , Thomas Gleixner , Vincenzo Frascino , Will Deacon , x86@kernel.org Subject: [PATCH v3 07/23] vdso: Set mm->context.vdso only on success of _install_special_mapping() Date: Fri, 11 Jun 2021 19:02:26 +0100 Message-Id: <20210611180242.711399-8-dima@arista.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210611180242.711399-1-dima@arista.com> References: <20210611180242.711399-1-dima@arista.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Old pattern was: 1. set mm->context.vdso = addr; 2. try install_special_mapping() 3. on failure set mm->context.vdso = 0 The reason behind the old pattern was to make arch_vma_name() work in perf_event_mmap_event(). These days using _install_special_mapping() instead of install_special_mapping() makes old pattern obsolete: : if (vma->vm_ops && vma->vm_ops->name) { : name = (char *) vma->vm_ops->name(vma); : if (name) : goto cpy_name; Setting mm->context.vdso = 0 also makes little sense: mm_alloc() zero-fills new mm_struct. And for double-safety if arch_setup_additional_pages() fails, bprm_execve() makes sure that the half-initialized process doesn't make it way to userspace by : force_sigsegv(SIGSEGV); Let's cleanup code: set mm->context.vdso only on success, assuming that any new mm_struct is clean. Some platforms do_munmap() vvar if vdso mapping failed, but it's really necessary only on x86 where vdso/vvar pair can be mapped by userspace (see prctl_map_vdso()). On other platforms vdso/vvar is only pre-mapped by ELF loader, which as described above will make sure to not let any half-baked process out. I've left do_unmap() on !x86 in case prctl() will be supported. Signed-off-by: Dmitry Safonov --- arch/arm/kernel/vdso.c | 2 -- arch/arm64/kernel/vdso.c | 16 +++++----------- arch/nds32/kernel/vdso.c | 5 +---- arch/powerpc/kernel/vdso.c | 9 ++------- arch/sparc/vdso/vma.c | 7 ++----- 5 files changed, 10 insertions(+), 29 deletions(-) diff --git a/arch/arm/kernel/vdso.c b/arch/arm/kernel/vdso.c index 3408269d19c7..015eff0a6e93 100644 --- a/arch/arm/kernel/vdso.c +++ b/arch/arm/kernel/vdso.c @@ -238,8 +238,6 @@ void arm_install_vdso(struct mm_struct *mm, unsigned long addr) struct vm_area_struct *vma; unsigned long len; - mm->context.vdso = 0; - if (vdso_text_pagelist == NULL) return; diff --git a/arch/arm64/kernel/vdso.c b/arch/arm64/kernel/vdso.c index a8bf72320ad0..1bc8adefa293 100644 --- a/arch/arm64/kernel/vdso.c +++ b/arch/arm64/kernel/vdso.c @@ -227,34 +227,28 @@ static int __setup_additional_pages(enum vdso_abi abi, vdso_mapping_len = vdso_text_len + VVAR_NR_PAGES * PAGE_SIZE; vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0); - if (IS_ERR_VALUE(vdso_base)) { - ret = ERR_PTR(vdso_base); - goto up_fail; - } + if (IS_ERR_VALUE(vdso_base)) + return vdso_base; ret = _install_special_mapping(mm, vdso_base, VVAR_NR_PAGES * PAGE_SIZE, VM_READ|VM_MAYREAD|VM_PFNMAP, vdso_info[abi].dm); if (IS_ERR(ret)) - goto up_fail; + return PTR_ERR(ret); if (IS_ENABLED(CONFIG_ARM64_BTI_KERNEL) && system_supports_bti()) gp_flags = VM_ARM64_BTI; vdso_base += VVAR_NR_PAGES * PAGE_SIZE; - mm->context.vdso = (void *)vdso_base; ret = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ|VM_EXEC|gp_flags| VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC, vdso_info[abi].cm); if (IS_ERR(ret)) - goto up_fail; + return PTR_ERR(ret); + mm->context.vdso = (void *)vdso_base; return 0; - -up_fail: - mm->context.vdso = NULL; - return PTR_ERR(ret); } #ifdef CONFIG_COMPAT diff --git a/arch/nds32/kernel/vdso.c b/arch/nds32/kernel/vdso.c index e16009a07971..2d1d51a0fc64 100644 --- a/arch/nds32/kernel/vdso.c +++ b/arch/nds32/kernel/vdso.c @@ -175,7 +175,6 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) /*Map vdso to user space */ vdso_base += PAGE_SIZE; - mm->context.vdso = (void *)vdso_base; vma = _install_special_mapping(mm, vdso_base, vdso_text_len, VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC, @@ -185,11 +184,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) goto up_fail; } - mmap_write_unlock(mm); - return 0; + mm->context.vdso = (void *)vdso_base; up_fail: - mm->context.vdso = NULL; mmap_write_unlock(mm); return ret; } diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 717f2c9a7573..76e898b56002 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c @@ -229,13 +229,6 @@ static int __arch_setup_additional_pages(struct linux_binprm *bprm, int uses_int /* Add required alignment. */ vdso_base = ALIGN(vdso_base, VDSO_ALIGNMENT); - /* - * Put vDSO base into mm struct. We need to do this before calling - * install_special_mapping or the perf counter mmap tracking code - * will fail to recognise it as a vDSO. - */ - mm->context.vdso = (void __user *)vdso_base + vvar_size; - vma = _install_special_mapping(mm, vdso_base, vvar_size, VM_READ | VM_MAYREAD | VM_IO | VM_DONTDUMP | VM_PFNMAP, &vvar_spec); @@ -257,6 +250,8 @@ static int __arch_setup_additional_pages(struct linux_binprm *bprm, int uses_int VM_MAYWRITE | VM_MAYEXEC, vdso_spec); if (IS_ERR(vma)) do_munmap(mm, vdso_base, vvar_size, NULL); + else + mm->context.vdso = (void __user *)vdso_base + vvar_size; return PTR_ERR_OR_ZERO(vma); } diff --git a/arch/sparc/vdso/vma.c b/arch/sparc/vdso/vma.c index cc19e09b0fa1..d8a344f6c914 100644 --- a/arch/sparc/vdso/vma.c +++ b/arch/sparc/vdso/vma.c @@ -390,7 +390,6 @@ static int map_vdso(const struct vdso_image *image, } text_start = addr - image->sym_vvar_start; - current->mm->context.vdso = (void __user *)text_start; /* * MAYWRITE to allow gdb to COW and set breakpoints @@ -412,16 +411,14 @@ static int map_vdso(const struct vdso_image *image, -image->sym_vvar_start, VM_READ|VM_MAYREAD, &vvar_mapping); - if (IS_ERR(vma)) { ret = PTR_ERR(vma); do_munmap(mm, text_start, image->size, NULL); + } else { + current->mm->context.vdso = (void __user *)text_start; } up_fail: - if (ret) - current->mm->context.vdso = NULL; - mmap_write_unlock(mm); return ret; } -- 2.31.1