From nobody Mon May 6 12:45:44 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1617984605; cv=none; d=zohomail.com; s=zohoarc; b=dE6/wthVjJLfOZpqu6SpJ2ZnxGMbOLMD/dGVuBzlnUMoGVPtiTZJmNd223HYrSsuOdoyzpmPz2iU4uP7xUEwVd8QLiVx0j2SZmdurU1XkksISMYO5OMA+eUbRgpdfA2vylU/SjsZfrc9yaNYjxD0u/xioOyMbDCAQ0m/6F6LAtA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1617984605; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=Omb0dVDNPA6u4nSQafyqDHEybVHGCcmblraURTu0yeE=; b=dDZ8WnPqtL8zj1omNkXLseFfF/LVZzLvNYdW6pWTv59e06pG9eLB2NGNtAk1ScaFJScTPiuilg9/ZR5mtKRaUdhvHApM81/L2b/G3QjRuA03Msnk1x7lnXEPFVtRgO6avSXsc2qZB/d3Zu4KhVqkspZzqb4HnwZ5RjYEdMV9sh4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1617984605741574.1835832387364; Fri, 9 Apr 2021 09:10:05 -0700 (PDT) Received: from localhost ([::1]:33754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lUths-0007Ud-MO for importer@patchew.org; Fri, 09 Apr 2021 12:10:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46692) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lUtcN-0001ha-Dc; Fri, 09 Apr 2021 12:04:23 -0400 Received: from forwardcorp1o.mail.yandex.net ([2a02:6b8:0:1a2d::193]:52854) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lUtcF-0006Id-3J; Fri, 09 Apr 2021 12:04:21 -0400 Received: from iva8-d077482f1536.qloud-c.yandex.net (iva8-d077482f1536.qloud-c.yandex.net [IPv6:2a02:6b8:c0c:2f26:0:640:d077:482f]) by forwardcorp1o.mail.yandex.net (Yandex) with ESMTP id BED702E1A93; Fri, 9 Apr 2021 19:04:08 +0300 (MSK) Received: from iva4-f06c35e68a0a.qloud-c.yandex.net (iva4-f06c35e68a0a.qloud-c.yandex.net [2a02:6b8:c0c:152e:0:640:f06c:35e6]) by iva8-d077482f1536.qloud-c.yandex.net (mxbackcorp/Yandex) with ESMTP id iR9BYIEsDS-480W0v17; Fri, 09 Apr 2021 19:04:08 +0300 Received: from dynamic-red3.dhcp.yndx.net (dynamic-red3.dhcp.yndx.net [2a02:6b8:0:419:7359:4dc3:71d:4c5a]) by iva4-f06c35e68a0a.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id QZcMcvrvJz-48oSai1H; Fri, 09 Apr 2021 19:04:08 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Precedence: bulk DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1617984248; bh=Omb0dVDNPA6u4nSQafyqDHEybVHGCcmblraURTu0yeE=; h=In-Reply-To:Message-Id:References:Date:Subject:To:From:Cc; b=O+HTsHqmKcWvSpLQNBo8rexyDa4Hyu6DGEz3rtZgVhP/f+pi+yf0WnbaiI7aZtrkW SSYGRdpg5ChHfrHQ8pd4wt9AYlOLi9WSbclhLpHbR/qMs+6lMoJvgffaJXneGDT1yI dTkthmj2LHvXfE9YG1QSuuwvMSI/JYSdxf+IqQ8M= Authentication-Results: iva8-d077482f1536.qloud-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Roman Kagan To: qemu-devel@nongnu.org Subject: [PATCH for-6.0 1/2] block/nbd: fix channel object leak Date: Fri, 9 Apr 2021 19:04:05 +0300 Message-Id: <20210409160406.1800272-2-rvkagan@yandex-team.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210409160406.1800272-1-rvkagan@yandex-team.ru> References: <20210409160406.1800272-1-rvkagan@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:0:1a2d::193; envelope-from=rvkagan@yandex-team.ru; helo=forwardcorp1o.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Vladimir Sementsov-Ogievskiy , qemu-block@nongnu.org, Max Reitz , yc-core@yandex-team.ru Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" nbd_free_connect_thread leaks the channel object if it hasn't been stolen. Unref it and fix the leak. Signed-off-by: Roman Kagan Reviewed-by: Vladimir Sementsov-Ogievskiy --- block/nbd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/nbd.c b/block/nbd.c index c26dc5a54f..d86df3afcb 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -385,6 +385,7 @@ static void nbd_free_connect_thread(NBDConnectThread *t= hr) { if (thr->sioc) { qio_channel_close(QIO_CHANNEL(thr->sioc), NULL); + object_unref(OBJECT(thr->sioc)); } error_free(thr->err); qapi_free_SocketAddress(thr->saddr); --=20 2.30.2 From nobody Mon May 6 12:45:44 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=yandex-team.ru ARC-Seal: i=1; a=rsa-sha256; t=1617984743; cv=none; d=zohomail.com; s=zohoarc; b=Ya8A6UujiY98VL4nZSIzNtDE9qEeFk89i32aOUYxSaWG0evXQstIv7BK/wtyTEhnX/18zbRfNza+6/yAJvnUMRf49Gd4uohygiivy8LTP7e9O7cjTVhhM24wRw4URkMK2WanoFuFYivOPTrClQrzE6ZTQVXbA6/U4feN3pSy9mE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1617984743; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=CAE/t9u5Q78GmpaAw3gIOVLp+C2NgXWIkRKdb2x0B8o=; b=HQ/QwwDIUsuAjnsCpH9t9WXbZQrupt25QGsUil2Z3z2I08DQJsiSxxctm2odynv9OhRjyHPc6lOahYo9dgYBWtlTdRtrM14PEuhlbOR7ANk+rNyqw334ESXhD/66WNYG3l4QZpD+h4rjvaNlukPXBqdmEPmPWIl9FVLnzJgGlAM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 161798474317921.660838696021074; Fri, 9 Apr 2021 09:12:23 -0700 (PDT) Received: from localhost ([::1]:41400 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lUtk5-0002KN-Ve for importer@patchew.org; Fri, 09 Apr 2021 12:12:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:46700) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lUtcV-0001n0-Bo; Fri, 09 Apr 2021 12:04:31 -0400 Received: from forwardcorp1o.mail.yandex.net ([2a02:6b8:0:1a2d::193]:52858) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lUtcF-0006Ig-6S; Fri, 09 Apr 2021 12:04:31 -0400 Received: from iva8-d077482f1536.qloud-c.yandex.net (iva8-d077482f1536.qloud-c.yandex.net [IPv6:2a02:6b8:c0c:2f26:0:640:d077:482f]) by forwardcorp1o.mail.yandex.net (Yandex) with ESMTP id 5A1892E1AA8; Fri, 9 Apr 2021 19:04:09 +0300 (MSK) Received: from iva4-f06c35e68a0a.qloud-c.yandex.net (iva4-f06c35e68a0a.qloud-c.yandex.net [2a02:6b8:c0c:152e:0:640:f06c:35e6]) by iva8-d077482f1536.qloud-c.yandex.net (mxbackcorp/Yandex) with ESMTP id mdBZILfQ2X-490KlTwQ; Fri, 09 Apr 2021 19:04:09 +0300 Received: from dynamic-red3.dhcp.yndx.net (dynamic-red3.dhcp.yndx.net [2a02:6b8:0:419:7359:4dc3:71d:4c5a]) by iva4-f06c35e68a0a.qloud-c.yandex.net (smtpcorp/Yandex) with ESMTPSA id QZcMcvrvJz-48oSrJU4; Fri, 09 Apr 2021 19:04:08 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) Precedence: bulk DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1617984249; bh=CAE/t9u5Q78GmpaAw3gIOVLp+C2NgXWIkRKdb2x0B8o=; h=In-Reply-To:Message-Id:References:Date:Subject:To:From:Cc; b=lXnYUOVGcIhnD03GPjSfEOVEA8Xfy/2Kfko0U8eoB6Oj8hNWPdwl7XOrcJ0rYLUbs W50zCv8O3rVONZwIpzEwToYdDZXSxSitP/FGMeXW6MeWy7P+r6fxSZkZCtYoaRqP+U WbQ9wYz0Hh/rsV3qujlUPeXixzTU+rJ71WmngsHg= Authentication-Results: iva8-d077482f1536.qloud-c.yandex.net; dkim=pass header.i=@yandex-team.ru From: Roman Kagan To: qemu-devel@nongnu.org Subject: [PATCH for-6.0 2/2] block/nbd: ensure ->connection_thread is always valid Date: Fri, 9 Apr 2021 19:04:06 +0300 Message-Id: <20210409160406.1800272-3-rvkagan@yandex-team.ru> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210409160406.1800272-1-rvkagan@yandex-team.ru> References: <20210409160406.1800272-1-rvkagan@yandex-team.ru> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a02:6b8:0:1a2d::193; envelope-from=rvkagan@yandex-team.ru; helo=forwardcorp1o.mail.yandex.net X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Vladimir Sementsov-Ogievskiy , qemu-block@nongnu.org, Max Reitz , yc-core@yandex-team.ru Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Simplify lifetime management of BDRVNBDState->connection_thread by delaying the possible cleanup of it until the BDRVNBDState itself goes away. This also fixes possible use-after-free in nbd_co_establish_connection when it races with nbd_co_establish_connection_cancel. Signed-off-by: Roman Kagan Reviewed-by: Vladimir Sementsov-Ogievskiy --- This is a more future-proof version of the fix for use-after-free but less intrusive than Vladimir's series so that it can go in 6.0. block/nbd.c | 58 ++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/block/nbd.c b/block/nbd.c index d86df3afcb..6e3879c0c5 100644 --- a/block/nbd.c +++ b/block/nbd.c @@ -144,16 +144,31 @@ typedef struct BDRVNBDState { NBDConnectThread *connect_thread; } BDRVNBDState; =20 +static void nbd_free_connect_thread(NBDConnectThread *thr); static int nbd_establish_connection(BlockDriverState *bs, SocketAddress *s= addr, Error **errp); static int nbd_co_establish_connection(BlockDriverState *bs, Error **errp); -static void nbd_co_establish_connection_cancel(BlockDriverState *bs, - bool detach); +static void nbd_co_establish_connection_cancel(BlockDriverState *bs); static int nbd_client_handshake(BlockDriverState *bs, Error **errp); static void nbd_yank(void *opaque); =20 static void nbd_clear_bdrvstate(BDRVNBDState *s) { + NBDConnectThread *thr =3D s->connect_thread; + bool thr_running; + + qemu_mutex_lock(&thr->mutex); + thr_running =3D thr->state =3D=3D CONNECT_THREAD_RUNNING; + if (thr_running) { + thr->state =3D CONNECT_THREAD_RUNNING_DETACHED; + } + qemu_mutex_unlock(&thr->mutex); + + /* the runaway thread will clean it up itself */ + if (!thr_running) { + nbd_free_connect_thread(thr); + } + object_unref(OBJECT(s->tlscreds)); qapi_free_SocketAddress(s->saddr); s->saddr =3D NULL; @@ -293,7 +308,7 @@ static void coroutine_fn nbd_client_co_drain_begin(Bloc= kDriverState *bs) qemu_co_sleep_wake(s->connection_co_sleep_ns_state); } =20 - nbd_co_establish_connection_cancel(bs, false); + nbd_co_establish_connection_cancel(bs); =20 reconnect_delay_timer_del(s); =20 @@ -333,7 +348,7 @@ static void nbd_teardown_connection(BlockDriverState *b= s) if (s->connection_co_sleep_ns_state) { qemu_co_sleep_wake(s->connection_co_sleep_ns_state); } - nbd_co_establish_connection_cancel(bs, true); + nbd_co_establish_connection_cancel(bs); } if (qemu_in_coroutine()) { s->teardown_co =3D qemu_coroutine_self(); @@ -534,18 +549,12 @@ nbd_co_establish_connection(BlockDriverState *bs, Err= or **errp) * nbd_co_establish_connection_cancel * Cancel nbd_co_establish_connection asynchronously: it will finish soon,= to * allow drained section to begin. - * - * If detach is true, also cleanup the state (or if thread is running, mov= e it - * to CONNECT_THREAD_RUNNING_DETACHED state). s->connect_thread becomes NU= LL if - * detach is true. */ -static void nbd_co_establish_connection_cancel(BlockDriverState *bs, - bool detach) +static void nbd_co_establish_connection_cancel(BlockDriverState *bs) { BDRVNBDState *s =3D bs->opaque; NBDConnectThread *thr =3D s->connect_thread; bool wake =3D false; - bool do_free =3D false; =20 qemu_mutex_lock(&thr->mutex); =20 @@ -556,21 +565,10 @@ static void nbd_co_establish_connection_cancel(BlockD= riverState *bs, s->wait_connect =3D false; wake =3D true; } - if (detach) { - thr->state =3D CONNECT_THREAD_RUNNING_DETACHED; - s->connect_thread =3D NULL; - } - } else if (detach) { - do_free =3D true; } =20 qemu_mutex_unlock(&thr->mutex); =20 - if (do_free) { - nbd_free_connect_thread(thr); - s->connect_thread =3D NULL; - } - if (wake) { aio_co_wake(s->connection_co); } @@ -2294,31 +2292,33 @@ static int nbd_open(BlockDriverState *bs, QDict *op= tions, int flags, return -EEXIST; } =20 + nbd_init_connect_thread(s); + /* * establish TCP connection, return error if it fails * TODO: Configurable retry-until-timeout behaviour. */ if (nbd_establish_connection(bs, s->saddr, errp) < 0) { - yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); - return -ECONNREFUSED; + ret =3D -ECONNREFUSED; + goto fail; } =20 ret =3D nbd_client_handshake(bs, errp); if (ret < 0) { - yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); - nbd_clear_bdrvstate(s); - return ret; + goto fail; } /* successfully connected */ s->state =3D NBD_CLIENT_CONNECTED; =20 - nbd_init_connect_thread(s); - s->connection_co =3D qemu_coroutine_create(nbd_connection_entry, s); bdrv_inc_in_flight(bs); aio_co_schedule(bdrv_get_aio_context(bs), s->connection_co); =20 return 0; +fail: + yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name)); + nbd_clear_bdrvstate(s); + return ret; } =20 static int nbd_co_flush(BlockDriverState *bs) --=20 2.30.2