From patchwork Sun Mar 5 20:09:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arseniy Krasnov X-Patchwork-Id: 64344 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp1526564wrd; Sun, 5 Mar 2023 12:57:08 -0800 (PST) X-Google-Smtp-Source: AK7set8GKhCje6dWPqiofhjjsnCTygG0qtJn4Y/QONbU+V9/7aNkoFl29UjhbxQ//B3SJTs+bUbW X-Received: by 2002:a17:902:708c:b0:19a:9686:ea8b with SMTP id z12-20020a170902708c00b0019a9686ea8bmr8186457plk.28.1678049828387; Sun, 05 Mar 2023 12:57:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1678049828; cv=none; d=google.com; s=arc-20160816; b=AAJICCbxFZxbUYKE3Rj16FpXcQlALWw56hiTLvoVpSylEyWYwY2LOU1zBLwOadyjUA OL6e7rAp87wPklAsxJMq4OcdGluFgYqp8L7jbNwfJeLyWumImMZbOyhuVCQmAWt6K2nl hIchYdlCi8sq32qebgdsGVawBrZP42EoBhXiiDmUFo+q5HrRHSt8qCoUW10KTTvcwgc6 YbZcH9Q5Nw4rD5m0orJmJhAtcU96//zrVxWxwdOlI40SGIfdR+h/50u3UtEFyQ+peYMn G8zewWShnitf34PYzM9QOUh0zMlEtMqApbD/DX4qbH2eBr0d0McelNd07uRixDfh4ebz hGMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:subject:from:cc:to :in-reply-to:content-language:user-agent:mime-version:date :message-id:dkim-signature; bh=LBlyx/TJwFonLBm4/UgbK3j5G7h+oxv2IfiFYdPacyQ=; b=V5U+AFcK0tr7RuDvxOs+JhNdBR3r4+4dh+x3RUmDihMkP8AqRf83cmq0DxFkSH9yvk z1TsweMB5udDFk8OwWb7QXa2p/dWQKlnSZXgGz+tqlDC4HZmurMWKcQ3/SwSaaQI07ub N9aUL3aFbhiPDuPSVid8J6V2+feVCkyEQ384ak7hia2Lz+S43imQMQRiBO9UP93/bTa+ PQ+aLYuMdLgEqmjlT/4uwVkJ/SlzEMRFHRp0TJqwDIPjy4DS+Cqu+CxfCOa3WWm5PcgH 01OHTFiuvvFx3NdlP4MNXs0E1fJNsjqe0pCdw4/ep/ICo7/8+PD80as6tcuDmm5vng/U 6SJA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sberdevices.ru header.s=mail header.b=Ufyh+Um3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=sberdevices.ru Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o10-20020a1709026b0a00b00186892f9f29si7717825plk.488.2023.03.05.12.56.54; Sun, 05 Mar 2023 12:57:08 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@sberdevices.ru header.s=mail header.b=Ufyh+Um3; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=sberdevices.ru Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229742AbjCEUMt (ORCPT + 99 others); Sun, 5 Mar 2023 15:12:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55334 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229542AbjCEUMr (ORCPT ); Sun, 5 Mar 2023 15:12:47 -0500 Received: from mx.sberdevices.ru (mx.sberdevices.ru [45.89.227.171]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50CC816891; Sun, 5 Mar 2023 12:12:46 -0800 (PST) Received: from s-lin-edge02.sberdevices.ru (localhost [127.0.0.1]) by mx.sberdevices.ru (Postfix) with ESMTP id B88B55FD04; Sun, 5 Mar 2023 23:12:44 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sberdevices.ru; s=mail; t=1678047164; bh=LBlyx/TJwFonLBm4/UgbK3j5G7h+oxv2IfiFYdPacyQ=; h=Message-ID:Date:MIME-Version:To:From:Subject:Content-Type; b=Ufyh+Um3BnhTeU4iJIGmbF32wZXu2nh7hbxlNDCDYDjZk6CW95jlcZzVg8HmUlED1 IzuDAqifRJeIbCMQ1yENpcmoHesh6ADUFZtQyxLMGPX+wYuuRUY/fZd2TISEynOQ4T nFq7aX/MnjIBtD71GhYyeUBir+NI+qyY+K8kMHkJ6Wguhgx8K7ptM59q0xPhQ45nnO rZytQjJzr0JRvflPoQXfN/LLyZjCglfrnFUIm8ZPo2ttSmzSjKS7PXVRG5DgRhCunb wHLaV+Mscmb0GuLN8BRHTWtNv/frAgO9xUidKM4FbnWVAv5BBAJ8K9bSiR+1F6oEQC o73ge+Tal2PmQ== Received: from S-MS-EXCH01.sberdevices.ru (S-MS-EXCH01.sberdevices.ru [172.16.1.4]) by mx.sberdevices.ru (Postfix) with ESMTP; Sun, 5 Mar 2023 23:12:44 +0300 (MSK) Message-ID: <33c2a09f-7f0e-d416-8009-bbb6a67ec752@sberdevices.ru> Date: Sun, 5 Mar 2023 23:09:50 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 Content-Language: en-US In-Reply-To: To: Stefan Hajnoczi , Stefano Garzarella , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Bobby Eshleman CC: , , , , , , From: Arseniy Krasnov Subject: [RFC PATCH v2 4/4] test/vsock: invalid buffer tests X-Originating-IP: [172.16.1.6] X-ClientProxiedBy: S-MS-EXCH02.sberdevices.ru (172.16.1.5) To S-MS-EXCH01.sberdevices.ru (172.16.1.4) X-KSMG-Rule-ID: 4 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiPhishing: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 1.1.2.30, bases: 2023/03/05 16:13:00 #20917262 X-KSMG-AntiVirus-Status: Clean, skipped X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759562777237136574?= X-GMAIL-MSGID: =?utf-8?q?1759562777237136574?= This adds STREAM and SEQPACKET tests for invalid buffer handling. It tries to read data to NULL buffer (data already presents in socket's queue), on fail kernel will free skbuff with data and next read with MSG_DONTWAIT flag must return EAGAIN which means that skbuff was dropped and socket's queue is empty. Signed-off-by: Arseniy Krasnov --- tools/testing/vsock/vsock_test.c | 106 +++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/tools/testing/vsock/vsock_test.c b/tools/testing/vsock/vsock_test.c index 67e9f9df3a8c..a17794a2d66c 100644 --- a/tools/testing/vsock/vsock_test.c +++ b/tools/testing/vsock/vsock_test.c @@ -860,6 +860,102 @@ static void test_stream_poll_rcvlowat_client(const struct test_opts *opts) close(fd); } +static void test_inv_buf_client(const struct test_opts *opts, bool stream) +{ + unsigned char data[512] = {0}; + ssize_t ret; + int fd; + + if (stream) + fd = vsock_stream_connect(opts->peer_cid, 1234); + else + fd = vsock_seqpacket_connect(opts->peer_cid, 1234); + + if (fd < 0) { + perror("connect"); + exit(EXIT_FAILURE); + } + + control_expectln("SENDDONE"); + + /* Use invalid buffer here. */ + ret = recv(fd, NULL, sizeof(data), 0); + if (ret != -1) { + fprintf(stderr, "expected recv(2) failure, got %zi\n", ret); + exit(EXIT_FAILURE); + } + + if (errno != ENOMEM) { + fprintf(stderr, "unexpected recv(2) errno %d\n", errno); + exit(EXIT_FAILURE); + } + + /* Now use valid buffer, but socket's queue must be empty. */ + ret = recv(fd, data, sizeof(data), MSG_DONTWAIT); + if (ret != -1) { + fprintf(stderr, "expected recv(2) failure, got %zi\n", ret); + exit(EXIT_FAILURE); + } + + if (errno != EAGAIN) { + fprintf(stderr, "unexpected recv(2) errno %d\n", errno); + exit(EXIT_FAILURE); + } + + control_writeln("DONE"); + + close(fd); +} + +static void test_inv_buf_server(const struct test_opts *opts, bool stream) +{ + unsigned char data[512] = {0}; + ssize_t res; + int fd; + + if (stream) + fd = vsock_stream_accept(VMADDR_CID_ANY, 1234, NULL); + else + fd = vsock_seqpacket_accept(VMADDR_CID_ANY, 1234, NULL); + + if (fd < 0) { + perror("accept"); + exit(EXIT_FAILURE); + } + + res = send(fd, data, sizeof(data), 0); + if (res != sizeof(data)) { + fprintf(stderr, "unexpected send(2) result %zi\n", res); + exit(EXIT_FAILURE); + } + + control_writeln("SENDDONE"); + + control_expectln("DONE"); + + close(fd); +} + +static void test_stream_inv_buf_client(const struct test_opts *opts) +{ + test_inv_buf_client(opts, true); +} + +static void test_stream_inv_buf_server(const struct test_opts *opts) +{ + test_inv_buf_server(opts, true); +} + +static void test_seqpacket_inv_buf_client(const struct test_opts *opts) +{ + test_inv_buf_client(opts, false); +} + +static void test_seqpacket_inv_buf_server(const struct test_opts *opts) +{ + test_inv_buf_server(opts, false); +} + static struct test_case test_cases[] = { { .name = "SOCK_STREAM connection reset", @@ -920,6 +1016,16 @@ static struct test_case test_cases[] = { .run_client = test_seqpacket_bigmsg_client, .run_server = test_seqpacket_bigmsg_server, }, + { + .name = "SOCK_STREAM test invalid buffer", + .run_client = test_stream_inv_buf_client, + .run_server = test_stream_inv_buf_server, + }, + { + .name = "SOCK_SEQPACKET test invalid buffer", + .run_client = test_seqpacket_inv_buf_client, + .run_server = test_seqpacket_inv_buf_server, + }, {}, };