From patchwork Wed Apr 15 03:28:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Feng X-Patchwork-Id: 1270844 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=smartx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=smartx-com.20150623.gappssmtp.com header.i=@smartx-com.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=kUdN+5+U; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4927Cb3pmGz9sSM for ; Wed, 15 Apr 2020 13:30:19 +1000 (AEST) Received: from localhost ([::1]:42245 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYkj-0006rl-Gg for incoming@patchwork.ozlabs.org; Tue, 14 Apr 2020 23:30:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47527) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYie-0003qx-Ml for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOYid-0003Te-Kj for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:08 -0400 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]:41445) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jOYid-0003Sl-G3 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:07 -0400 Received: by mail-pg1-x542.google.com with SMTP id h69so874301pgc.8 for ; Tue, 14 Apr 2020 20:28:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:content-transfer-encoding; bh=TwgnJmPadU3PRD+Wik0Nx8aB1MFbEI3Wplly0TQHwwk=; b=kUdN+5+Uw4a2c+bhi313HV5e51yUFB6NmuLD9wajdjuyUgtmuvKwRADQxgZ1j6Rc5N JDkEz5aco2ScDAh9NWjqQe+/2u3uIOZH3QrC9eEtyuD2OKMZMx5V6Iy4C7nOg8IFI4EF BjNK7zkfnfJuoc1nyjVpiC3Xvn5LEhEtSfRwqxBD3fRxxYQXygFeDfZScq9okIshyMNM 64ro/0/DlRILQ6WkRAWEHw3GjUbMoSs8wurEpE8dXcGbZu95l3zv3P8oDrdKc7DVAUks W50AW+w+rZAyrEK3tr6zdOMpUth3axOavXa/F8vfWlaveNnckSf9z3UTxfepbVXRFYhe Xgcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :in-reply-to:references:content-transfer-encoding; bh=TwgnJmPadU3PRD+Wik0Nx8aB1MFbEI3Wplly0TQHwwk=; b=G9PEaSI3urnu7Jxoka2eUR4arL062aJxPdg5h1Obg8DoW2tWlW2xW1XDVU86TycWhD VaExuSXTZ6ItOV3kli8PqbbPqmmYWG3PUgLz/VRGW1H0bYO3c/sNxEg5H6bdINs6QzlL GNP/k7aIyNg+cYALI/yDDAMWnNj7ezf2Q80js+lL0TPMeIZZFdm3G0BCPGHd7VaQemgD ociVKZ/maOdCBHlpYwfX3Ojs8mdJTyhFCBwr4TWDxfJBiGOoZVZxAKKjvZRqBCHqtTd+ o9WiNbe36mZB3KP6AlcAgGGncBrbIA3yyilZa0ZmyDICVJwIp+UC27rtFR+WwjOIu/Ng sOMg== MIME-Version: 1.0 X-Gm-Message-State: AGi0PuZf3V3b6rpdg3TnTy+ElHnmY3cfBThOvs5phUKMs9BW9AdmxZzt O4yOxzSMzN9Gc2khXDcjQ4kpGXg/RMZ7wqBTX/UgseuSnT/usPncrGdXQSH58a3raz1KmiAfoXu GpgYIOHlm X-Google-Smtp-Source: APiQypJV/JQFC25bGpCrV2bQ7xJrTDyM/NxV0I+OcWIy8Vcn9GO4JkuiF3SrPfKkYjnkuTp200CbcQ== X-Received: by 2002:a63:2e44:: with SMTP id u65mr6130125pgu.142.1586921285512; Tue, 14 Apr 2020 20:28:05 -0700 (PDT) Received: from 31_216.localdomain ([47.240.167.159]) by smtp.gmail.com with ESMTPSA id d21sm5915061pjs.3.2020.04.14.20.28.03 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Apr 2020 20:28:04 -0700 (PDT) From: Li Feng To: kyle@smartx.com, Raphael Norwitz , "Michael S. Tsirkin" , Kevin Wolf , Max Reitz , qemu-block@nongnu.org (open list:Block layer core), qemu-devel@nongnu.org (open list:All patches CC here) Subject: [PATCH 1/4] vhost-user-blk: delay vhost_user_blk_disconnect Date: Wed, 15 Apr 2020 11:28:23 +0800 Message-Id: <20200415032826.16701-2-fengli@smartx.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200415032826.16701-1-fengli@smartx.com> References: <20200415032826.16701-1-fengli@smartx.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::542 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Feng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Since commit b0a335e351103bf92f3f9d0bd5759311be8156ac, a socket write may trigger a disconnect events, calling vhost_user_blk_disconnect() and clearing all the vhost_dev strutures. Then the next socket read will encounter an invalid pointer to vhost_dev. Signed-off-by: Li Feng --- hw/block/vhost-user-blk.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 17df5338e7..776b9af3eb 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -349,11 +349,24 @@ static void vhost_user_blk_disconnect(DeviceState *dev) vhost_dev_cleanup(&s->dev); } +static void vhost_user_blk_event(void *opaque, QEMUChrEvent event); + +static void vhost_user_blk_chr_closed_bh(void *opaque) +{ + DeviceState *dev = opaque; + VirtIODevice *vdev = VIRTIO_DEVICE(dev); + VHostUserBlk *s = VHOST_USER_BLK(vdev); + vhost_user_blk_disconnect(dev); + qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event, + NULL, (void *)dev, NULL, true); +} + static void vhost_user_blk_event(void *opaque, QEMUChrEvent event) { DeviceState *dev = opaque; VirtIODevice *vdev = VIRTIO_DEVICE(dev); VHostUserBlk *s = VHOST_USER_BLK(vdev); + AioContext *ctx; switch (event) { case CHR_EVENT_OPENED: @@ -363,7 +376,16 @@ static void vhost_user_blk_event(void *opaque, QEMUChrEvent event) } break; case CHR_EVENT_CLOSED: - vhost_user_blk_disconnect(dev); + /* + * a close event may happen during a read/write, but vhost + * code assumes the vhost_dev remains setup, so delay the + * stop & clear to idle. + */ + ctx = qemu_get_current_aio_context(); + + qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, NULL, + NULL, NULL, NULL, false); + aio_bh_schedule_oneshot(ctx, vhost_user_blk_chr_closed_bh, opaque); break; case CHR_EVENT_BREAK: case CHR_EVENT_MUX_IN: From patchwork Wed Apr 15 03:28:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Feng X-Patchwork-Id: 1270843 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=smartx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=smartx-com.20150623.gappssmtp.com header.i=@smartx-com.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=bgz5SE2t; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49279t26nmz9sQx for ; Wed, 15 Apr 2020 13:28:50 +1000 (AEST) Received: from localhost ([::1]:42222 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYjI-000471-68 for incoming@patchwork.ozlabs.org; Tue, 14 Apr 2020 23:28:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47583) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYio-00041z-N3 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOYif-0003Ug-TC for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:18 -0400 Received: from mail-pl1-x641.google.com ([2607:f8b0:4864:20::641]:40427) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jOYif-0003UA-Ny for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:09 -0400 Received: by mail-pl1-x641.google.com with SMTP id t16so742387plo.7 for ; Tue, 14 Apr 2020 20:28:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:content-transfer-encoding; bh=j2LhT5uQ0fJJClfhlcXSfO9u/S+aep09+Z3mpktX+PU=; b=bgz5SE2tAIwwNNnOaUxhsGTyPx08kcySl6JATdrZJoJD60M7U3uDszAEXmeVde/gdV dpRn2kq7v7vIrKIY9ZrHu8JjU7lX4ViTG6uyQyH+dtPeBb+ZWYkQSWdo0TZ+e4cbXq1p i1Brefz8axhgTPkzuAB8OTkvu9v9TWHx72fZGA1tL1bshRNbQSgMI8WOORk9ZNqvEWmi 69BgfFPkcBRAUBlRtjqrMqaUB05HsJWl0QLO0s+6U5I+f5sViewblBHxK6nDerSAioSv X3ERW4ngBB0yQ8CIuaabbk8ctoJRhjDRYlf/R/nqMA6pr+w1A7TSuho+XNucnaIReDOx 5YQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :in-reply-to:references:content-transfer-encoding; bh=j2LhT5uQ0fJJClfhlcXSfO9u/S+aep09+Z3mpktX+PU=; b=igCVzuntqUd74WmBHJXV6nqgM3vpy6pNmk6B730Wr+/Lwv7E/xpkyomRJX9msQKRBu C6tiTMBAmo6VJXWKfiZ0LMWX7uuze4M5hGhsQqYuVnAyb1kOPtulWhWaaqUlZdO4fYwm FMMGhkYbflFTn91hS0A22P0eDtnKQMo5t/Bi+1L0bFwjeplz5zRhakpbs271oQUzZsha MJWoYBkHyJwwchFcp826DCq2njHWsLlF/LKxCdDF7Og9tFgvwr6ISGUT9VR6lZ1wPYkY FcWtwb6bldFq8ifqRJmYdUkQOaYOgDpFX0YVnG8dvsYsCwbk8izqEqoLT95iShdRYrEv 0FDg== MIME-Version: 1.0 X-Gm-Message-State: AGi0PuYUkGNx4VW+Jo51PK7c4zzzSPgZFQDAmUxWXylxzv84ACLjLBbU 5ATjHX+f/Go779tqtrLzLUc0Fv3qHwS2OVO70MXFe4sjrh82QVy37VzjflJ5tAIIH1LEuO85btj v1Gu7pgtQ X-Google-Smtp-Source: APiQypIvXyurEEzQ/wpJZDe2amP9l2W8Hu54jKFgqZ+nwt7v1X8eaD2e7r11PjH6V4EL+CujWeJrYA== X-Received: by 2002:a17:90a:a484:: with SMTP id z4mr3795954pjp.77.1586921288428; Tue, 14 Apr 2020 20:28:08 -0700 (PDT) Received: from 31_216.localdomain ([47.240.167.159]) by smtp.gmail.com with ESMTPSA id d21sm5915061pjs.3.2020.04.14.20.28.05 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Apr 2020 20:28:07 -0700 (PDT) From: Li Feng To: kyle@smartx.com, Raphael Norwitz , "Michael S. Tsirkin" , Kevin Wolf , Max Reitz , qemu-block@nongnu.org (open list:Block layer core), qemu-devel@nongnu.org (open list:All patches CC here) Subject: [PATCH 2/4] vhost-user-blk: fix invalid memory access Date: Wed, 15 Apr 2020 11:28:24 +0800 Message-Id: <20200415032826.16701-3-fengli@smartx.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200415032826.16701-1-fengli@smartx.com> References: <20200415032826.16701-1-fengli@smartx.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::641 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Feng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" when s->inflight is freed, vhost_dev_free_inflight may try to access s->inflight->addr, it will retrigger the following issue. ==7309==ERROR: AddressSanitizer: heap-use-after-free on address 0x604001020d18 at pc 0x555555ce948a bp 0x7fffffffb170 sp 0x7fffffffb160 READ of size 8 at 0x604001020d18 thread T0 #0 0x555555ce9489 in vhost_dev_free_inflight /root/smartx/qemu-el7/qemu-test/hw/virtio/vhost.c:1473 #1 0x555555cd86eb in virtio_reset /root/smartx/qemu-el7/qemu-test/hw/virtio/virtio.c:1214 #2 0x5555560d3eff in virtio_pci_reset hw/virtio/virtio-pci.c:1859 #3 0x555555f2ac53 in device_set_realized hw/core/qdev.c:893 #4 0x5555561d572c in property_set_bool qom/object.c:1925 #5 0x5555561de8de in object_property_set_qobject qom/qom-qobject.c:27 #6 0x5555561d99f4 in object_property_set_bool qom/object.c:1188 #7 0x555555e50ae7 in qdev_device_add /root/smartx/qemu-el7/qemu-test/qdev-monitor.c:626 #8 0x555555e51213 in qmp_device_add /root/smartx/qemu-el7/qemu-test/qdev-monitor.c:806 #9 0x555555e8ff40 in hmp_device_add /root/smartx/qemu-el7/qemu-test/hmp.c:1951 #10 0x555555be889a in handle_hmp_command /root/smartx/qemu-el7/qemu-test/monitor.c:3404 #11 0x555555beac8b in monitor_command_cb /root/smartx/qemu-el7/qemu-test/monitor.c:4296 #12 0x555556433eb7 in readline_handle_byte util/readline.c:393 #13 0x555555be89ec in monitor_read /root/smartx/qemu-el7/qemu-test/monitor.c:4279 #14 0x5555563285cc in tcp_chr_read chardev/char-socket.c:470 #15 0x7ffff670b968 in g_main_context_dispatch (/lib64/libglib-2.0.so.0+0x4a968) #16 0x55555640727c in glib_pollfds_poll util/main-loop.c:215 #17 0x55555640727c in os_host_main_loop_wait util/main-loop.c:238 #18 0x55555640727c in main_loop_wait util/main-loop.c:497 #19 0x555555b2d0bf in main_loop /root/smartx/qemu-el7/qemu-test/vl.c:2013 #20 0x555555b2d0bf in main /root/smartx/qemu-el7/qemu-test/vl.c:4776 #21 0x7fffdd2eb444 in __libc_start_main (/lib64/libc.so.6+0x22444) #22 0x555555b3767a (/root/smartx/qemu-el7/qemu-test/x86_64-softmmu/qemu-system-x86_64+0x5e367a) 0x604001020d18 is located 8 bytes inside of 40-byte region [0x604001020d10,0x604001020d38) freed by thread T0 here: #0 0x7ffff6f00508 in __interceptor_free (/lib64/libasan.so.4+0xde508) #1 0x7ffff671107d in g_free (/lib64/libglib-2.0.so.0+0x5007d) previously allocated by thread T0 here: #0 0x7ffff6f00a88 in __interceptor_calloc (/lib64/libasan.so.4+0xdea88) #1 0x7ffff6710fc5 in g_malloc0 (/lib64/libglib-2.0.so.0+0x4ffc5) SUMMARY: AddressSanitizer: heap-use-after-free /root/smartx/qemu-el7/qemu-test/hw/virtio/vhost.c:1473 in vhost_dev_free_inflight Shadow bytes around the buggy address: 0x0c08801fc150: fa fa 00 00 00 00 04 fa fa fa fd fd fd fd fd fa 0x0c08801fc160: fa fa fd fd fd fd fd fd fa fa 00 00 00 00 04 fa 0x0c08801fc170: fa fa 00 00 00 00 00 01 fa fa 00 00 00 00 04 fa 0x0c08801fc180: fa fa 00 00 00 00 00 01 fa fa 00 00 00 00 00 01 0x0c08801fc190: fa fa 00 00 00 00 00 fa fa fa 00 00 00 00 04 fa =>0x0c08801fc1a0: fa fa fd[fd]fd fd fd fa fa fa fd fd fd fd fd fa 0x0c08801fc1b0: fa fa fd fd fd fd fd fa fa fa fd fd fd fd fd fa 0x0c08801fc1c0: fa fa 00 00 00 00 00 fa fa fa fd fd fd fd fd fd 0x0c08801fc1d0: fa fa 00 00 00 00 00 01 fa fa fd fd fd fd fd fa 0x0c08801fc1e0: fa fa fd fd fd fd fd fa fa fa fd fd fd fd fd fd 0x0c08801fc1f0: fa fa 00 00 00 00 00 01 fa fa fd fd fd fd fd fa Shadow byte legend (one shadow byte represents 8 application bytes): Addressable: 00 Partially addressable: 01 02 03 04 05 06 07 Heap left redzone: fa Freed heap region: fd Stack left redzone: f1 Stack mid redzone: f2 Stack right redzone: f3 Stack after return: f5 Stack use after scope: f8 Global redzone: f9 Global init order: f6 Poisoned by user: f7 Container overflow: fc Array cookie: ac Intra object redzone: bb ASan internal: fe Left alloca redzone: ca Right alloca redzone: cb ==7309==ABORTING Signed-off-by: Li Feng Reviewed-by: Raphael Norwitz --- hw/block/vhost-user-blk.c | 4 ++++ hw/virtio/vhost.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 776b9af3eb..19e79b96e4 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -463,7 +463,9 @@ reconnect: virtio_err: g_free(s->vhost_vqs); + s->vhost_vqs = NULL; g_free(s->inflight); + s->inflight = NULL; for (i = 0; i < s->num_queues; i++) { virtio_delete_queue(s->virtqs[i]); } @@ -484,7 +486,9 @@ static void vhost_user_blk_device_unrealize(DeviceState *dev, Error **errp) vhost_dev_cleanup(&s->dev); vhost_dev_free_inflight(s->inflight); g_free(s->vhost_vqs); + s->vhost_vqs = NULL; g_free(s->inflight); + s->inflight = NULL; for (i = 0; i < s->num_queues; i++) { virtio_delete_queue(s->virtqs[i]); diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c index 01ebe12f28..aff98a0ede 100644 --- a/hw/virtio/vhost.c +++ b/hw/virtio/vhost.c @@ -1514,7 +1514,7 @@ void vhost_dev_set_config_notifier(struct vhost_dev *hdev, void vhost_dev_free_inflight(struct vhost_inflight *inflight) { - if (inflight->addr) { + if (inflight && inflight->addr) { qemu_memfd_free(inflight->addr, inflight->size, inflight->fd); inflight->addr = NULL; inflight->fd = -1; From patchwork Wed Apr 15 03:28:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Feng X-Patchwork-Id: 1270845 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=smartx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=smartx-com.20150623.gappssmtp.com header.i=@smartx-com.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=rhvuh+n0; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4927Dp01GNz9sQx for ; Wed, 15 Apr 2020 13:31:21 +1000 (AEST) Received: from localhost ([::1]:42284 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYlj-0008Al-Sl for incoming@patchwork.ozlabs.org; Tue, 14 Apr 2020 23:31:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47553) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYij-0003vX-4g for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOYii-0003VR-7a for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:13 -0400 Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]:45653) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jOYii-0003VB-1m for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:12 -0400 Received: by mail-pl1-x643.google.com with SMTP id t4so733822plq.12 for ; Tue, 14 Apr 2020 20:28:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:content-transfer-encoding; bh=7QrF3lqnF8J6N38bFem6LFl6ts/NWaHVdZgVmsDDT/8=; b=rhvuh+n0LI9F/aDAXM7keiZ++BeWK0sIaxx3ZNxVaMPMdxIEhH2o8np7hw4V9riKxB TiHUV8N3yOxzX0LwYQnlnLks8y/5usVAG4R5lAn4M7q0Dc9bNmvKZ/38w3x/l6ui0Vbn iZ4caRLh64BVaY9CiW8fIah8cjmKvE399fZWqHcwgsN4jn/bUOLqisjqsE0cbBD1gddG LKmpxSJsEcsScAvEtO9YyZaPKOYDpIEnWjy0UYchi/pFw6Jz6oFuc5IXG1F70kztbEfl f6BbUNQ9JFvVwXPy6sgxMonRzBfcHiDbyTzUSBezFwDFgV4xfWHBZ7bveVhWUnfTYZ5Y o2Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :in-reply-to:references:content-transfer-encoding; bh=7QrF3lqnF8J6N38bFem6LFl6ts/NWaHVdZgVmsDDT/8=; b=uFbwqw2AqReGCDtCoIF3eBRoIIJLJAZvV5YNOJWVNnHHbrBUXRTAMPYaH59Hhs2PbM PhaCGRnqz3qt/7Ewe/j0L/xTnvKZ3RCSQar/Ew318urmDhn+1Ta8ek0VGc428rawMs80 Y1r919Q1k6tKnsYxdgtMcYJRkHWd+8phi5VwoCtKsBcv6UffcGwqL391rLr1d49VFcBM P0JdxljnObFv/Flos36614WoItiLZJ3OM5nPF8NfJIg84xxY73SahlFuHvSePukIchzx ptkcUK7wTaPpt3MAzq9G/D+V92VX2AeXfn8iZYYXxXTk6nTUy8rvBnghgDVYbni2dXrn o1RA== MIME-Version: 1.0 X-Gm-Message-State: AGi0Pubmm5XQS5Kxm4CJKWytM/72SztuXIAlEvsd7u+KHkkww0CeDav0 ODlLafko9I7XcDkeqIozeITsdYZkOah2YakfgqWTWf2hJ04JeAg8RogmBeYEJUSZCPt/6AKEpNf mbb/FYrZL X-Google-Smtp-Source: APiQypL8yMIrHuYc6CsLq+cP2DLYGggxNSzC/75KshAyFMXdrb3tkk/9D5J+5AWxBAtxN4awGDwxpA== X-Received: by 2002:a17:90a:fe8:: with SMTP id 95mr3815506pjz.45.1586921290457; Tue, 14 Apr 2020 20:28:10 -0700 (PDT) Received: from 31_216.localdomain ([47.240.167.159]) by smtp.gmail.com with ESMTPSA id d21sm5915061pjs.3.2020.04.14.20.28.08 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Apr 2020 20:28:10 -0700 (PDT) From: Li Feng To: kyle@smartx.com, =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , qemu-devel@nongnu.org (open list:All patches CC here) Subject: [PATCH 3/4] char-socket: avoid double call tcp_chr_free_connection Date: Wed, 15 Apr 2020 11:28:25 +0800 Message-Id: <20200415032826.16701-4-fengli@smartx.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200415032826.16701-1-fengli@smartx.com> References: <20200415032826.16701-1-fengli@smartx.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::643 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Feng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" double call tcp_chr_free_connection generates a crash. Signed-off-by: Li Feng --- chardev/char-socket.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 185fe38dda..43aab8f24b 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -476,6 +476,11 @@ static void tcp_chr_disconnect_locked(Chardev *chr) SocketChardev *s = SOCKET_CHARDEV(chr); bool emit_close = s->state == TCP_CHARDEV_STATE_CONNECTED; + /* avoid re-enter when socket read/write error and disconnect event. */ + if (s->state == TCP_CHARDEV_STATE_DISCONNECTED) { + return; + } + tcp_chr_free_connection(chr); if (s->listener) { From patchwork Wed Apr 15 03:28:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Li Feng X-Patchwork-Id: 1270842 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=smartx.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=smartx-com.20150623.gappssmtp.com header.i=@smartx-com.20150623.gappssmtp.com header.a=rsa-sha256 header.s=20150623 header.b=uOC7xMkg; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49279p1b0Lz9sQx for ; Wed, 15 Apr 2020 13:28:46 +1000 (AEST) Received: from localhost ([::1]:42220 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYjE-000427-2z for incoming@patchwork.ozlabs.org; Tue, 14 Apr 2020 23:28:44 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47571) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jOYim-0003zD-11 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jOYik-0003Wd-S6 for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:15 -0400 Received: from mail-pl1-x642.google.com ([2607:f8b0:4864:20::642]:41644) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jOYik-0003WG-NM for qemu-devel@nongnu.org; Tue, 14 Apr 2020 23:28:14 -0400 Received: by mail-pl1-x642.google.com with SMTP id d24so744447pll.8 for ; Tue, 14 Apr 2020 20:28:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=smartx-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:to:cc:subject:date:message-id:in-reply-to :references:content-transfer-encoding; bh=b6O9MOPsS5sqJwwRSOtIH4vxPCnN0SubzzVkQkgHtWE=; b=uOC7xMkgTRK3uL5lWMJprvE4cZXzrsuX/xuqArrJ0W6B75tletpxKX46xDiAsQmfDJ vNLHTzkwcQJ2NauINYSoTSVgTd0/CvqVh2leLzqVKxzexzU/SrUtOZYBO2czXDofrlX/ LV3pDstcCJQSArYL3xrSnuQZd9jFcTcvujVNiVj8Dop9YtQxi3cidovoZ9BbQUQZ64je Lk7fT+2ee97TxRgzUr2kODul1O3pEP/l69UlE43sVAC6ReHSl+9VSyoHV1jI+EBIF9bj UpCVHbCjrpdZOE8enBfW1IqQsKxkDo5U0/W0ysm5HU5n/SPJvRe7RbfkPKsZgWeVkw/h Yz7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :in-reply-to:references:content-transfer-encoding; bh=b6O9MOPsS5sqJwwRSOtIH4vxPCnN0SubzzVkQkgHtWE=; b=BVqaSHPU4kjTVKyc/enl4zixLsSZcYj4ht24UYtS5e23O1hYu1xx6W0IgB9PO6RZtw uGxRnMTtEL5RS7sBgsP+N5090d/7y3B6FBVZqXaJILDfgvfglOQR+OLnG6euT7B0xIxJ ou2xSqXcXWip91avx6acgMg0H5O3RT2xO2UwZFs0FpXxQ4QfXKLlEd35YumwAb5CYgYN e0z37PCjKXnyaIlwI8C+7gqwKJMQzttmNO0NVb1ZUoYyA2VMTk1HuF7jkV3mRuGvThDW jT0z0ghGnk7iQLbsamzYLVPNDFfEkXBfGeUjEVeSuXFy5FDdryFSv409iHyGH3nwrTmf iQug== MIME-Version: 1.0 X-Gm-Message-State: AGi0PuZMfp33RBshug4WZBLi9bW+ShplbhLfeSNqS/b1einYnLclmlEg y/BywBtkumrxcUTgo971RMsY/nuXx6tSrHso/eqNvqj33ohmryc32nRs7YNZbXTNPipw49Tv6Jn 9WBPG4AP7 X-Google-Smtp-Source: APiQypLPo/eiQ8JgedI0yKEnD504kyhFcjFFqgZwQuQJG1GlQZ49O9vbKix5//mHOeunCdmvYeglcQ== X-Received: by 2002:a17:902:8d89:: with SMTP id v9mr3026092plo.83.1586921293772; Tue, 14 Apr 2020 20:28:13 -0700 (PDT) Received: from 31_216.localdomain ([47.240.167.159]) by smtp.gmail.com with ESMTPSA id d21sm5915061pjs.3.2020.04.14.20.28.11 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 14 Apr 2020 20:28:13 -0700 (PDT) From: Li Feng To: kyle@smartx.com, Raphael Norwitz , "Michael S. Tsirkin" , Kevin Wolf , Max Reitz , qemu-block@nongnu.org (open list:Block layer core), qemu-devel@nongnu.org (open list:All patches CC here) Subject: [PATCH 4/4] vhost-user-blk: fix crash in realize process Date: Wed, 15 Apr 2020 11:28:26 +0800 Message-Id: <20200415032826.16701-5-fengli@smartx.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20200415032826.16701-1-fengli@smartx.com> References: <20200415032826.16701-1-fengli@smartx.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4864:20::642 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Li Feng Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The crash could be reproduced like this: 1. break vhost_user_write; 2. kill the vhost-user-blk target; 3. let qemu continue running; 4. start vhost-user-blk; 5. see crash! This fix makes changes: 1. set s->connected to true after vhost_dev_init; 2. call vhost_dev_get_config when s->connected is true, otherwise the hdev->host_ops will be nullptr. Signed-off-by: Li Feng --- hw/block/vhost-user-blk.c | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/hw/block/vhost-user-blk.c b/hw/block/vhost-user-blk.c index 19e79b96e4..35386b7cb7 100644 --- a/hw/block/vhost-user-blk.c +++ b/hw/block/vhost-user-blk.c @@ -303,8 +303,6 @@ static int vhost_user_blk_connect(DeviceState *dev) if (s->connected) { return 0; } - s->connected = true; - s->dev.nvqs = s->num_queues; s->dev.vqs = s->vhost_vqs; s->dev.vq_index = 0; @@ -318,6 +316,11 @@ static int vhost_user_blk_connect(DeviceState *dev) strerror(-ret)); return ret; } + /* + * set true util vhost_dev_init return ok, because CLOSE event may happen + * in vhost_dev_init routine. + */ + s->connected = true; /* restore vhost state */ if (virtio_device_started(vdev, vdev->status)) { @@ -401,6 +404,7 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp) VHostUserBlk *s = VHOST_USER_BLK(vdev); Error *err = NULL; int i, ret; + bool reconnect; if (!s->chardev.chr) { error_setg(errp, "vhost-user-blk: chardev is mandatory"); @@ -433,27 +437,26 @@ static void vhost_user_blk_device_realize(DeviceState *dev, Error **errp) s->inflight = g_new0(struct vhost_inflight, 1); s->vhost_vqs = g_new0(struct vhost_virtqueue, s->num_queues); s->connected = false; + reconnect = false; - qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event, - NULL, (void *)dev, NULL, true); - -reconnect: - if (qemu_chr_fe_wait_connected(&s->chardev, &err) < 0) { - error_report_err(err); - goto virtio_err; - } - - /* check whether vhost_user_blk_connect() failed or not */ - if (!s->connected) { - goto reconnect; - } - - ret = vhost_dev_get_config(&s->dev, (uint8_t *)&s->blkcfg, - sizeof(struct virtio_blk_config)); - if (ret < 0) { - error_report("vhost-user-blk: get block config failed"); - goto reconnect; - } + do { + if (qemu_chr_fe_wait_connected(&s->chardev, &err) < 0) { + error_report_err(err); + goto virtio_err; + } + qemu_chr_fe_set_handlers(&s->chardev, NULL, NULL, vhost_user_blk_event, + NULL, (void *)dev, NULL, true); + if (s->connected) { + ret = vhost_dev_get_config(&s->dev, (uint8_t *)&s->blkcfg, + sizeof(struct virtio_blk_config)); + if (ret < 0) { + error_report("vhost-user-blk: get block config failed"); + reconnect = true; + } else { + reconnect = false; + } + } + } while (!s->connected || reconnect); if (s->blkcfg.num_queues != s->num_queues) { s->blkcfg.num_queues = s->num_queues;