Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp2579329lqp; Mon, 25 Mar 2024 03:22:02 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVfEWVpSeoYW6FUjtptKX+FKB9DbnGrT4YmkHky6rByFO+MHuim3+oPnsCok9+tZUuxHvSNebKtNNURljSlSmajJ21D75mR8fPZjF2baQ== X-Google-Smtp-Source: AGHT+IEob6p59rpjbjySAwzbzeps4SQXpgCzus8IvBbLQ01zOx7IMYLaHhlYCQWR1DYQPgLEsf8/ X-Received: by 2002:a17:906:e0e:b0:a46:be82:f478 with SMTP id l14-20020a1709060e0e00b00a46be82f478mr4503214eji.68.1711362121958; Mon, 25 Mar 2024 03:22:01 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711362121; cv=pass; d=google.com; s=arc-20160816; b=E8iFCaYXYW5WDxjVlx8iHExbeYIxWKElXG27s6LHBZjtWCx9j73IF95xnAMvg/z5gt eoaUuQ2ii6C/YW+wBbTWyhJL2pHFZfGEsmRI7/T0qxzZd51AEDwl0rd3Tb1gWDOOspWK 5wSks2xGQnOeEEI63IeJLh3XayuBxDBDNr6cg+EKjNsB54XLaDnPxniLsm8gWqJPbs3Q 7w7Nr9PExE3gKw2+Qmtojsoa93eGKh5/+Ww333uwPvpB3iEaYxlZoo6XOy4xtbMHO/e2 CILc0Hok9YscEsA2XwPoVJh8fKNTSSrk9DfdvCuTprDpk2FbIYocgUZVp4GVP2ioZsCS h3BQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=RpBrbNNOmPUfye6qRuNrZnA5aMSSwHaoj2aYbh+OYS0=; fh=NlTr7J05GgqtJ1/Egl3BLNnmdiZA1Agbf34GPollbGg=; b=dMEmL43E7jSv1Q/qQXP4uG+LUUQ8cBwEGFQ+WAJoe47ztktb8bvn9RClcz4Ho+wEdN X0SwfEctwE8nzpMaiK9Rm09PrsQn8mUi92NeDqxy1TqXLSwrDnTf+egLAXMJRhBBRcvW ZO3Bxh4vzfijVj2htoX5QW/o+TRVNarsMiAdaViPj3cvEuiduZvTWSEnMHSuu0y0kwGm 6FpIxigzAYzNhmzEl2GhIJNj97ybiEQymMwRccxz1jN3r0VxiGPTLo0Uw+shQCN9i1LQ alYkpvoF0DOMY9a0uu85keYtSkHWl734SLRySz9PtqaYdtNoOh5VtD2APptl1XmBHMbw FMRQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=PdeQKA3S; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-116154-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-116154-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id i13-20020a17090671cd00b00a462fa16055si2353024ejk.313.2024.03.25.03.22.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Mar 2024 03:22:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-116154-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=PdeQKA3S; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-116154-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-116154-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 880C41F32E37 for ; Mon, 25 Mar 2024 10:16:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E63273B268B; Mon, 25 Mar 2024 03:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PdeQKA3S" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 02E9E17B4EC; Sun, 24 Mar 2024 23:41:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711323719; cv=none; b=nydaFNAewMx0jOfQujNoPsRBo3ULgTz55JiKMSIGelgAjsSO8FGdWP+zBJZza5RDe0dH+lgAFB5b8WcRE2C9NiVHzIQtk5rGAxdSayNQO8xQ/NsTZCPcyyx/HKVsASruCoTZiAy5hqaIVR4IbO04zym2EDtX6Y6s1NrtFLRHpCc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711323719; c=relaxed/simple; bh=6iUDn5w6RDH9Plp/mSGm62Klq1xCk1zCrBh/vNrD6aw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=J5rN0f4mR0WyLVx+TRbzBe0Ukx49nD/3ljk5pSY4JuKppiNBz6lIKUueY39S2fLIYycPxW498FJRzxsdCljfoUlj4l1E6bOEgHSQnBBmQI4iiHtfM0oMZgT2v+g9HmaMRaOus1PW0mVL6I1YdvdzmbvcbsF2EgLR014Rw6Kzgpw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PdeQKA3S; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 24FC5C433F1; Sun, 24 Mar 2024 23:41:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1711323718; bh=6iUDn5w6RDH9Plp/mSGm62Klq1xCk1zCrBh/vNrD6aw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PdeQKA3SnS/v95QyFaScyv4lehmBss8v6JivBCaVj3ytMDsmF4Tm5wI3IyIcl6tPF cpIsECQ6MGE83XEIcYG0qCq8DCV6dSintxXIqkpos8IzmkCyxaULNVJ8tEJfXtk1fC k11hbNw8w5j6mC1TkwBmbz1Fgz9Ez0cCXvbyVls+6bkKHyQ8xFmdWfnXDWIQtVKE0L IGtdHrmYOvKujgGuUbU6KPkRt7AjgTAAgLUvEDbF6n7yNSpoYpI6DF00k1w2MadSuo U5nHLluzUy1xfjCeulyWK9eOq1cwevjXE7jat6FbvjCBunxqIcE544h5hklEaPBnv5 eYXATf3mxvvfg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= , Bui Quang Minh , Alexei Starovoitov , Sasha Levin Subject: [PATCH 5.10 092/238] bpf: Fix stackmap overflow check on 32-bit arches Date: Sun, 24 Mar 2024 19:38:00 -0400 Message-ID: <20240324234027.1354210-93-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240324234027.1354210-1-sashal@kernel.org> References: <20240324234027.1354210-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit From: Toke Høiland-Jørgensen [ Upstream commit 7a4b21250bf79eef26543d35bd390448646c536b ] The stackmap code relies on roundup_pow_of_two() to compute the number of hash buckets, and contains an overflow check by checking if the resulting value is 0. However, on 32-bit arches, the roundup code itself can overflow by doing a 32-bit left-shift of an unsigned long value, which is undefined behaviour, so it is not guaranteed to truncate neatly. This was triggered by syzbot on the DEVMAP_HASH type, which contains the same check, copied from the hashtab code. The commit in the fixes tag actually attempted to fix this, but the fix did not account for the UB, so the fix only works on CPUs where an overflow does result in a neat truncation to zero, which is not guaranteed. Checking the value before rounding does not have this problem. Fixes: 6183f4d3a0a2 ("bpf: Check for integer overflow when using roundup_pow_of_two()") Signed-off-by: Toke Høiland-Jørgensen Reviewed-by: Bui Quang Minh Message-ID: <20240307120340.99577-4-toke@redhat.com> Signed-off-by: Alexei Starovoitov Signed-off-by: Sasha Levin --- kernel/bpf/stackmap.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c index b8afea2ceeeb1..3ec76cb5f240d 100644 --- a/kernel/bpf/stackmap.c +++ b/kernel/bpf/stackmap.c @@ -115,11 +115,14 @@ static struct bpf_map *stack_map_alloc(union bpf_attr *attr) } else if (value_size / 8 > sysctl_perf_event_max_stack) return ERR_PTR(-EINVAL); - /* hash table size must be power of 2 */ - n_buckets = roundup_pow_of_two(attr->max_entries); - if (!n_buckets) + /* hash table size must be power of 2; roundup_pow_of_two() can overflow + * into UB on 32-bit arches, so check that first + */ + if (attr->max_entries > 1UL << 31) return ERR_PTR(-E2BIG); + n_buckets = roundup_pow_of_two(attr->max_entries); + cost = n_buckets * sizeof(struct stack_map_bucket *) + sizeof(*smap); err = bpf_map_charge_init(&mem, cost + attr->max_entries * (sizeof(struct stack_map_bucket) + (u64)value_size)); -- 2.43.0