Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp7153771ybi; Mon, 8 Jul 2019 15:44:13 -0700 (PDT) X-Google-Smtp-Source: APXvYqy+dAXFcjFv9Vb1hG19NLo4fQ6/MjV4Jzla3ACUKPbdBId3ChKaMAUkOdh1y7iExUgYxK4T X-Received: by 2002:a17:902:7894:: with SMTP id q20mr26881511pll.339.1562625853562; Mon, 08 Jul 2019 15:44:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562625853; cv=none; d=google.com; s=arc-20160816; b=uT/PMp7hhUaTsj605FOHwli/Vf7o784moRpgHIc7LQi826KxQ9QTko46XfB/b/5JR9 +rHgaN7Vhi3UyEEzJ8ymYYe/Yg6KpdoVhqAf0DVikl2rgHTMVbsYys65CdGVR2pd5V3d dnWgvJbwoB6p2R1TJTEciK/Efx2sJZdUlqftGVFROcviSD0XR18GxSbVhi6xJcEdBNFq PCOWfU2S+FuaKvvwMwMEJ8n/RvTMLWww1y8jQEtzhRjbgR9QT2LcQe/2LEuOWcB3T4jH DDHvV8lHnvo3cz3LVf1dlIKpOPHAY2ks7zEhoq6e/kYXQ7F/EsUT5YWn3G0i4l9uOb5b OL7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=sQGKbunRlrvdVKbp02vEGwvG8+xrq5xUVQ5fY/+t4TE=; b=BCYfwxc5Mt7Qr1kMEOFVqDbtP5xwtVe5ZbV6a2OPEOoZ116tSHwWVUaq30wpWcM9WJ CkuS3VA6dI+CvS4+x14h2yndQeAstDvCNXbIz6I4GgAAPN2FwYGOQ92u0w6i2jCUy0WM 1nb2xoa0TJImJO5vyVXUtgtwbeH9EL0fXiuVuVw3vtDjtnNCt5Zy6UYrageNCp2Hzv5J p9mocx1qYMIe6XyfQGzmIpFzQI18Mz2w4ZaTEVnj5YVWbByq7o0ff0+TwhEc7Ed3qBr6 Feg6o5HIPOuleMEXUc2vgeeCJ4+k1AVbsPNMx6FZn30BckLvQ2QquFqaE+0D/x0j3v4/ Tpgg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kinvolk.io header.s=google header.b=SJBZLbfj; 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 f8si8384082pgi.191.2019.07.08.15.43.58; Mon, 08 Jul 2019 15:44:13 -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; dkim=pass header.i=@kinvolk.io header.s=google header.b=SJBZLbfj; 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 S2403948AbfGHQcH (ORCPT + 99 others); Mon, 8 Jul 2019 12:32:07 -0400 Received: from mail-wm1-f53.google.com ([209.85.128.53]:40933 "EHLO mail-wm1-f53.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2403831AbfGHQcD (ORCPT ); Mon, 8 Jul 2019 12:32:03 -0400 Received: by mail-wm1-f53.google.com with SMTP id v19so147147wmj.5 for ; Mon, 08 Jul 2019 09:32:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kinvolk.io; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=sQGKbunRlrvdVKbp02vEGwvG8+xrq5xUVQ5fY/+t4TE=; b=SJBZLbfj73WvztsTVCyOaGzkao16f0cK4Qd3O7+93OdYSwxGMZrFSA+QNEXHIq4q52 QTqMGAMrkclA3q+GV20vV9rDe5T7Aq+vjBeSxnO4sxrsd425CRXW6cWA9wOzNeN23mBb DH4d4tYhyv4Fh9Zq0DD9xa42KhSbQp1I9es+s= 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=sQGKbunRlrvdVKbp02vEGwvG8+xrq5xUVQ5fY/+t4TE=; b=Dmci1x2avNKmMKrcUoUAZ+R8VmJnGCG2lsJeRuS8GWrViQFxW7QYaIcG1cRCIWNpOp ZQlnfpl3p+D1nvoiOhfRhyXfQQ4XxSO+qDhXKyjJEFdod8iqoRDknwCKRe7f6mLWI28Q XHfXoTZhVkqQ6aH4nfUNxPP11nEnfo0sB5LzwWBbB2Vus3M9qOuGcfCTH0pNvewGaUvt 4ET7cI1eFmc0hT2YMEaVJeQlUaCNxVqDijZv6oeKNMIEDB4jlwryMzGKyIToFikyXV7t olydqnwg89SXZVwy+rnsljO00/RCxLASP2+7FKSs4FjO+nLCbwk/APvu6ECyE3VTD0/M AtdA== X-Gm-Message-State: APjAAAWa147+mhyjHaLvbqbGEgBPZ+tXR7owO7xbQxLeCgU3WXJmq5bU +g3b3QX8oJvRUOs2E6V8c1PSNj28lyg= X-Received: by 2002:a1c:cc0d:: with SMTP id h13mr17034505wmb.119.1562603521360; Mon, 08 Jul 2019 09:32:01 -0700 (PDT) Received: from localhost.localdomain (ip5f5aedbe.dynamic.kabel-deutschland.de. [95.90.237.190]) by smtp.gmail.com with ESMTPSA id e6sm18255086wrw.23.2019.07.08.09.32.00 (version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256); Mon, 08 Jul 2019 09:32:00 -0700 (PDT) From: Krzesimir Nowak To: linux-kernel@vger.kernel.org Cc: Alban Crequy , =?UTF-8?q?Iago=20L=C3=B3pez=20Galeiras?= , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , "David S. Miller" , Jakub Kicinski , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , netdev@vger.kernel.org, bpf@vger.kernel.org, xdp-newbies@vger.kernel.org, Krzesimir Nowak Subject: [bpf-next v3 12/12] selftests/bpf: Test correctness of narrow 32bit read on 64bit field Date: Mon, 8 Jul 2019 18:31:21 +0200 Message-Id: <20190708163121.18477-13-krzesimir@kinvolk.io> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190708163121.18477-1-krzesimir@kinvolk.io> References: <20190708163121.18477-1-krzesimir@kinvolk.io> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Test the correctness of the 32bit narrow reads by reading both halves of the 64 bit field and doing a binary or on them to see if we get the original value. It succeeds as it should, but with the commit e2f7fc0ac695 ("bpf: fix undefined behavior in narrow load handling") reverted, the test fails with a following message: > $ sudo ./test_verifier > ... > #967/p 32bit loads of a 64bit field (both least and most significant words) FAIL retval -1985229329 != 0 > verification time 17 usec > stack depth 0 > processed 8 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0 > ... > Summary: 1519 PASSED, 0 SKIPPED, 1 FAILED Signed-off-by: Krzesimir Nowak --- tools/testing/selftests/bpf/test_verifier.c | 19 +++++++++++++++++ .../testing/selftests/bpf/verifier/var_off.c | 21 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c index 484ea8842b06..2a20280a4a44 100644 --- a/tools/testing/selftests/bpf/test_verifier.c +++ b/tools/testing/selftests/bpf/test_verifier.c @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -343,6 +344,24 @@ static void bpf_fill_perf_event_test_run_check(struct bpf_test *self) self->fill_insns = NULL; } +static void bpf_fill_32bit_loads(struct bpf_test *self) +{ + compiletime_assert( + sizeof(struct bpf_perf_event_data) <= TEST_CTX_LEN, + "buffer for ctx is too short to fit struct bpf_perf_event_data"); + compiletime_assert( + sizeof(struct bpf_perf_event_value) <= TEST_DATA_LEN, + "buffer for data is too short to fit struct bpf_perf_event_value"); + + struct bpf_perf_event_data ctx = { + .sample_period = 0x0123456789abcdef, + }; + + memcpy(self->ctx, &ctx, sizeof(ctx)); + free(self->fill_insns); + self->fill_insns = NULL; +} + /* BPF_SK_LOOKUP contains 13 instructions, if you need to fix up maps */ #define BPF_SK_LOOKUP(func) \ /* struct bpf_sock_tuple tuple = {} */ \ diff --git a/tools/testing/selftests/bpf/verifier/var_off.c b/tools/testing/selftests/bpf/verifier/var_off.c index 8504ac937809..3f8bee0a50ef 100644 --- a/tools/testing/selftests/bpf/verifier/var_off.c +++ b/tools/testing/selftests/bpf/verifier/var_off.c @@ -246,3 +246,24 @@ .result = ACCEPT, .prog_type = BPF_PROG_TYPE_LWT_IN, }, +{ + "32bit loads of a 64bit field (both least and most significant words)", + .insns = { + BPF_LDX_MEM(BPF_W, BPF_REG_4, BPF_REG_1, offsetof(struct bpf_perf_event_data, sample_period)), + BPF_LDX_MEM(BPF_W, BPF_REG_5, BPF_REG_1, offsetof(struct bpf_perf_event_data, sample_period) + 4), + BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, offsetof(struct bpf_perf_event_data, sample_period)), + BPF_ALU64_IMM(BPF_LSH, BPF_REG_5, 32), + BPF_ALU64_REG(BPF_OR, BPF_REG_4, BPF_REG_5), + BPF_ALU64_REG(BPF_XOR, BPF_REG_4, BPF_REG_6), + BPF_MOV64_REG(BPF_REG_0, BPF_REG_4), + BPF_EXIT_INSN(), + }, + .result = ACCEPT, + .prog_type = BPF_PROG_TYPE_PERF_EVENT, + .ctx = { 0, }, + .ctx_len = sizeof(struct bpf_perf_event_data), + .data = { 0, }, + .data_len = sizeof(struct bpf_perf_event_value), + .fill_helper = bpf_fill_32bit_loads, + .override_data_out_len = true, +}, -- 2.20.1