Received: by 2002:a05:6a10:17d3:0:0:0:0 with SMTP id hz19csp2788203pxb; Tue, 13 Apr 2021 10:08:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJza4s13yKVWsVbiqqSgr13X9aCd/5UWkTuYHBjaibIp1WkiZszixCYwnkU78hH8eoU3wO+g X-Received: by 2002:a50:85cd:: with SMTP id q13mr36536583edh.114.1618333706334; Tue, 13 Apr 2021 10:08:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618333706; cv=none; d=google.com; s=arc-20160816; b=hfscDMEw/yhVBEyf7d0n9znfpr1xYabUX92AO9otskfYWxeRzefYVqK/u6Mp2sNTNe bibBOPc+ZNqCxhKLLaBIbl9ISfVexNKJ+3KyQ/Madtj+dyZmUgZCeMkPNhyzEU8X8Bcu qqHOZBgcOgJv2PXibSdt+PnN5D3TEQ8hDZ9lbhACJWIIV3mr4uNTL/MEdauHmIi1t80w QG2/wmmk5fYKF8iG8QYSgUPmev2xrnuMKacgwJAAVWSDYHEECdhhQpF1J/rlmSNpWT6z bW9/Aooi/6KyAIoISg2g6UPHQLPJufHPZ6m84j0UZilN9DI87VuJRkoTKueSGV4s6OoR AIMg== 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=N6M7N5he0UCmBfRJM2gLoKlS1agH4fVxwi1ZH8rnudI=; b=vKQODxvj7mCGH71uJqcPDWxU4I5JVx3HcMRXt4giGnQBiNT2xgTyAXevCSG1ttqQeA IwSCABSGrFt76qetgUcMMUA1YrRjq0q4STzJy4QOMxyMaWPYRl6qn0hspbvCbuqsuT9E rF0dsDYIi1CfE4k8SSAMZfDCO+A83JolOsPVvxaY4LiQYLYoqgTcw6775xydRd/SOfRv kXDKiRwN86evyDU0TBUQm0XwuBWvO2kzEwacKSUUSZCKBDDlAik1FsQ0RyJM5RMKcL5A 7fivSTj3aV9U6CcvDjVtkQQz3JNK5Mm1pUIpgbu9ZMo8/AmqUR8xGKHTdTUdVJ4n477M 0/Qg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=6UydZgYL; 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=kaspersky.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w18si10278131ejy.196.2021.04.13.10.08.00; Tue, 13 Apr 2021 10:08:26 -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=@kaspersky.com header.s=mail202102 header.b=6UydZgYL; 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=kaspersky.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344684AbhDMMqY (ORCPT + 99 others); Tue, 13 Apr 2021 08:46:24 -0400 Received: from mx12.kaspersky-labs.com ([91.103.66.155]:57716 "EHLO mx12.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344485AbhDMMpl (ORCPT ); Tue, 13 Apr 2021 08:45:41 -0400 Received: from relay12.kaspersky-labs.com (unknown [127.0.0.10]) by relay12.kaspersky-labs.com (Postfix) with ESMTP id 5001F75DC1; Tue, 13 Apr 2021 15:45:18 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail202102; t=1618317918; bh=N6M7N5he0UCmBfRJM2gLoKlS1agH4fVxwi1ZH8rnudI=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=6UydZgYLSmR+VfTTdA0RCHRI5OJuCL51gspL3UPz7ZGzlk5MPVUupvI8azKpeXLm/ whcW2YgBpSgsh30lIMNgfuplpEaoBsfsAqnojJnPi1rcRY8o1wTTvJ7iUr71SUv8GV RrB+Ae/gZisePHmgpi+w5RTI3dx7R0SsPSTXQgpaOA3k+RAR5Xov8YxzNhfwFqjz+A mDAIOIyKYTJPG0EANWfQR/vDCKMPByhjKhsMISw4gv0YKaihaQ8lj9EvM99jolRuo3 LqgNKxfaIdPCD0gY1KLMvb9cx9sGfdsCK5h4CiK+oi1GyutjibDarkNRVapDKaaAMc SILdCwks1nOpA== Received: from mail-hq2.kaspersky.com (unknown [91.103.66.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client CN "mail-hq2.kaspersky.com", Issuer "Kaspersky MailRelays CA G3" (verified OK)) by mailhub12.kaspersky-labs.com (Postfix) with ESMTPS id 0EED675DB7; Tue, 13 Apr 2021 15:45:18 +0300 (MSK) Received: from arseniy-pc.avp.ru (10.64.64.121) by hqmailmbx3.avp.ru (10.64.67.243) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Tue, 13 Apr 2021 15:45:17 +0300 From: Arseny Krasnov To: Stefan Hajnoczi , Stefano Garzarella , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , Jakub Kicinski , Jorgen Hansen , Andra Paraschiv , Colin Ian King , Norbert Slusarek , David Brazdil , Alexander Popov CC: , , , , , , Subject: [RFC PATCH v8 12/19] virtio/vsock: add SEQPACKET receive logic Date: Tue, 13 Apr 2021 15:45:04 +0300 Message-ID: <20210413124507.3403863-1-arseny.krasnov@kaspersky.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210413123954.3396314-1-arseny.krasnov@kaspersky.com> References: <20210413123954.3396314-1-arseny.krasnov@kaspersky.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.64.64.121] X-ClientProxiedBy: hqmailmbx2.avp.ru (10.64.67.242) To hqmailmbx3.avp.ru (10.64.67.243) X-KSE-ServerInfo: hqmailmbx3.avp.ru, 9 X-KSE-AntiSpam-Interceptor-Info: scan successful X-KSE-AntiSpam-Version: 5.9.20, Database issued on: 04/13/2021 12:26:17 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 10 X-KSE-AntiSpam-Info: Lua profiles 163057 [Apr 13 2021] X-KSE-AntiSpam-Info: Version: 5.9.20.0 X-KSE-AntiSpam-Info: Envelope from: arseny.krasnov@kaspersky.com X-KSE-AntiSpam-Info: LuaCore: 442 442 b985cb57763b61d2a20abb585d5d4cc10c315b09 X-KSE-AntiSpam-Info: {Prob_from_in_msgid} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: d41d8cd98f00b204e9800998ecf8427e.com:7.1.1;127.0.0.199:7.1.2;kaspersky.com:7.1.1;arseniy-pc.avp.ru:7.1.1 X-KSE-AntiSpam-Info: Rate: 10 X-KSE-AntiSpam-Info: Status: not_detected X-KSE-AntiSpam-Info: Method: none X-KSE-Antiphishing-Info: Clean X-KSE-Antiphishing-ScanningType: Deterministic X-KSE-Antiphishing-Method: None X-KSE-Antiphishing-Bases: 04/13/2021 12:28:00 X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 13.04.2021 10:53:00 X-KSE-BulkMessagesFiltering-Scan-Result: InTheLimit X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-BulkMessagesFiltering-Scan-Result: InTheLimit X-KLMS-Rule-ID: 52 X-KLMS-Message-Action: clean X-KLMS-AntiSpam-Status: not scanned, disabled by settings X-KLMS-AntiSpam-Interceptor-Info: not scanned X-KLMS-AntiPhishing: Clean, bases: 2021/04/13 07:05:00 X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.3.30, bases: 2021/04/13 03:14:00 #16587160 X-KLMS-AntiVirus-Status: Clean, skipped Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This modifies current receive logic for SEQPACKET support: 1) Inserts 'RW' packet to socket's rx queue, but without merging with buffer of last packet in queue. 2) Performs check for packet and socket types on receive(if mismatch, then reset connection). Signed-off-by: Arseny Krasnov Reviewed-by: Stefano Garzarella --- net/vmw_vsock/virtio_transport_common.c | 58 +++++++++++++++++-------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index 8492b8bd5df5..572869fef832 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -165,6 +165,14 @@ void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt) } EXPORT_SYMBOL_GPL(virtio_transport_deliver_tap_pkt); +static u16 virtio_transport_get_type(struct sock *sk) +{ + if (sk->sk_type == SOCK_STREAM) + return VIRTIO_VSOCK_TYPE_STREAM; + else + return VIRTIO_VSOCK_TYPE_SEQPACKET; +} + /* This function can only be used on connecting/connected sockets, * since a socket assigned to a transport is required. * @@ -966,25 +974,27 @@ virtio_transport_recv_enqueue(struct vsock_sock *vsk, goto out; } - /* Try to copy small packets into the buffer of last packet queued, - * to avoid wasting memory queueing the entire buffer with a small - * payload. - */ - if (pkt->len <= GOOD_COPY_LEN && !list_empty(&vvs->rx_queue)) { - struct virtio_vsock_pkt *last_pkt; + if (le16_to_cpu(pkt->hdr.type) == VIRTIO_VSOCK_TYPE_STREAM) { + /* Try to copy small packets into the buffer of last packet queued, + * to avoid wasting memory queueing the entire buffer with a small + * payload. + */ + if (pkt->len <= GOOD_COPY_LEN && !list_empty(&vvs->rx_queue)) { + struct virtio_vsock_pkt *last_pkt; - last_pkt = list_last_entry(&vvs->rx_queue, - struct virtio_vsock_pkt, list); + last_pkt = list_last_entry(&vvs->rx_queue, + struct virtio_vsock_pkt, list); - /* If there is space in the last packet queued, we copy the - * new packet in its buffer. - */ - if (pkt->len <= last_pkt->buf_len - last_pkt->len) { - memcpy(last_pkt->buf + last_pkt->len, pkt->buf, - pkt->len); - last_pkt->len += pkt->len; - free_pkt = true; - goto out; + /* If there is space in the last packet queued, we copy the + * new packet in its buffer. + */ + if (pkt->len <= last_pkt->buf_len - last_pkt->len) { + memcpy(last_pkt->buf + last_pkt->len, pkt->buf, + pkt->len); + last_pkt->len += pkt->len; + free_pkt = true; + goto out; + } } } @@ -1149,6 +1159,12 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt, return 0; } +static bool virtio_transport_valid_type(u16 type) +{ + return (type == VIRTIO_VSOCK_TYPE_STREAM) || + (type == VIRTIO_VSOCK_TYPE_SEQPACKET); +} + /* We are under the virtio-vsock's vsock->rx_lock or vhost-vsock's vq->mutex * lock. */ @@ -1174,7 +1190,7 @@ void virtio_transport_recv_pkt(struct virtio_transport *t, le32_to_cpu(pkt->hdr.buf_alloc), le32_to_cpu(pkt->hdr.fwd_cnt)); - if (le16_to_cpu(pkt->hdr.type) != VIRTIO_VSOCK_TYPE_STREAM) { + if (!virtio_transport_valid_type(le16_to_cpu(pkt->hdr.type))) { (void)virtio_transport_reset_no_sock(t, pkt); goto free_pkt; } @@ -1191,6 +1207,12 @@ void virtio_transport_recv_pkt(struct virtio_transport *t, } } + if (virtio_transport_get_type(sk) != le16_to_cpu(pkt->hdr.type)) { + (void)virtio_transport_reset_no_sock(t, pkt); + sock_put(sk); + goto free_pkt; + } + vsk = vsock_sk(sk); lock_sock(sk); -- 2.25.1