From nobody Wed Nov 22 18:30:12 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Sb8tX4Xt8z51PG3; Wed, 22 Nov 2023 18:30:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Sb8tX4659z3cLF; Wed, 22 Nov 2023 18:30:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1700677812; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Z28dwRMyJiKQ6/GOULXDNSl7WfLDpQUyVsMB77XIpcA=; b=onuhkR2EbyXvJikaUcikzPV5bqOjFms+f+bUigBYSaM2Cx46qUM8/Rhtj93s4Bqt+021lb P4Yh7NIozdHmUToKaF+7I0q5ixdon592LJigsubck71PJbueHkWiihTJoFBJV1PNbAKLFj 73tDJjT5O9/HC0QvaKigLlsf3TSAmiH0TBua8wnU4rPi521fMN+J5dVF7WqlTO0ws2rtjd FPIMKwBavuZtcEMQeDcBcr1EAPUANHQtkLInwHRLlYUZNccU7Fm33P8LKHdwbtC2ZdRyR5 fI2W9YmuL+v2kRETj/XXdlPTGn4577ZicrtjpPsgH8UYprRaLtCpEEciEEn6Ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1700677812; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Z28dwRMyJiKQ6/GOULXDNSl7WfLDpQUyVsMB77XIpcA=; b=G+xoFnfZgNmzrF9zMTSbgsDjdn1gq0lq/U1OgcmX2RGJS+bwiF2OKWNqcjHj6qWJl96no9 Xl36GEDTtyu4LS9l+byuh277ANejni9I2NLinhocuj30KicvMcqM5aCyLUg98IFlCJmKfF 0tL+77R060oqnVf+iG8a6mtqR0XZOvNhvuhR3UCkZ7OcM3iHOTDDQy0R19Sh9szDswuCcE VMsalQF08BhQWBFr+hoPL4rF0RyPFm+ilm507PhFqnkclosWe0VW6HfLYcHpzb4yGfx7wx I1pknVc8YPy3FZaB9M+o3t7JJfFWExdTSg8bH0h2Jllc1TnLME8hskgKJwmGeA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1700677812; a=rsa-sha256; cv=none; b=imI2JbYLK1+WYDJvC3s/d2wwOf38xGemPQDJZ/3DbPkCPVQOD7ZhIZVfQ+TKKEYlKl/5UL fQ7ca+fOj7miwhBkJaBuS1rx14BPO20/MT8gelGy8FBDdquj3CaSHpPy+D6bCQRz8XyTIn eATQfgS+hgyvABjXaCMLWZN6f9UV7sB2x/rYvwugXhGHP9DRm064aG5enJ3kZQchBkZCVC /m9K4j9l7UP4Uut0J+nyMNGGM3Uc6x/1YSAfKiyE3QLeN/IwauCYsixyZe6C4/g3lF7S3p DcJIJ2GSJW4cmn1VbC1QoETxBz+X1dR5vLC7DO2fT2IVH8qSaLtRNlUOCzK1ag== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Sb8tX34DCzVpc; Wed, 22 Nov 2023 18:30:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3AMIUCsc041661; Wed, 22 Nov 2023 18:30:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3AMIUCCB041652; Wed, 22 Nov 2023 18:30:12 GMT (envelope-from git) Date: Wed, 22 Nov 2023 18:30:12 GMT Message-Id: <202311221830.3AMIUCCB041652@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dimitry Andric Subject: git: 4c9a0adad182 - main - compiler-rt: avoid segfaults when re-exec'ing with ASLR List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dim X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4c9a0adad18263ec8725d9bfc5f560c6ad1da8bd Auto-Submitted: auto-generated The branch main has been updated by dim: URL: https://cgit.FreeBSD.org/src/commit/?id=4c9a0adad18263ec8725d9bfc5f560c6ad1da8bd commit 4c9a0adad18263ec8725d9bfc5f560c6ad1da8bd Author: Dimitry Andric AuthorDate: 2023-11-22 18:23:06 +0000 Commit: Dimitry Andric CommitDate: 2023-11-22 18:23:06 +0000 compiler-rt: avoid segfaults when re-exec'ing with ASLR After 930a7c2ac67e ("compiler-rt: re-exec with ASLR disabled when necessary") and 96fe7c8ab0f6 ("compiler-rt: support ReExec() on FreeBSD"), binaries linked against the sanitizer libraries may segfault due to procctl(2) being intercepted. Instead, the non-intercepted internal_procctl() should be called. Similarly, the ReExec() function that re-executes the binary after turning off ASLR should not call elf_aux_info(3) and realpath(3), since these will also be intercepted. Instead, loop directly over the elf aux info vector to find the executable path, and avoid calling realpath(3) since it is actually unwanted for this use case. Fixes: 930a7c2ac67e, 96fe7c8ab0f6 MFC after: 3 days --- .../compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 2 +- .../lib/sanitizer_common/sanitizer_linux_libcdep.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp index 3f544623c6fb..ebbd14eca72f 100644 --- a/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp +++ b/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp @@ -2323,7 +2323,7 @@ void CheckASLR() { "and binaries compiled with PIE\n" "ASLR will be disabled and the program re-executed.\n"); int aslr_ctl = PROC_ASLR_FORCE_DISABLE; - CHECK_NE(procctl(P_PID, 0, PROC_ASLR_CTL, &aslr_ctl), -1); + CHECK_NE(internal_procctl(P_PID, 0, PROC_ASLR_CTL, &aslr_ctl), -1); ReExec(); } # elif SANITIZER_PPC64V2 diff --git a/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp b/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp index ff62fc4af430..58310e05b359 100644 --- a/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp +++ b/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp @@ -56,6 +56,7 @@ // that, it was never implemented. So just define it to zero. #undef MAP_NORESERVE #define MAP_NORESERVE 0 +extern const Elf_Auxinfo *__elf_aux_vector; #endif #if SANITIZER_NETBSD @@ -947,11 +948,11 @@ void ReExec() { const char *pathname = "/proc/self/exe"; #if SANITIZER_FREEBSD - char exe_path[PATH_MAX]; - if (elf_aux_info(AT_EXECPATH, exe_path, sizeof(exe_path)) == 0) { - char link_path[PATH_MAX]; - if (realpath(exe_path, link_path)) - pathname = link_path; + for (const auto *aux = __elf_aux_vector; aux->a_type != AT_NULL; aux++) { + if (aux->a_type == AT_EXECPATH) { + pathname = static_cast(aux->a_un.a_ptr); + break; + } } #elif SANITIZER_NETBSD static const int name[] = {