From nobody Tue Nov 18 09:18:27 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 ARC-Seal: i=1; a=rsa-sha256; t=1609153152; cv=none; d=zohomail.com; s=zohoarc; b=Oc3ieVFeQX69MqVQ1i8fFHpB1Y/RLxk5JLpeS5XgEIDbNWaVg+B+elzTG/Q8oOCEjQAxnYkh0eH5iWrCTnPsr/ThryAzKzdW7QCm7xU0FO8QrpADeowq2FbhGcs/u6XFcDKiF2DSg9iTk1P5ihQlUiJNZS3Nz4d4ao1bVWIjRm8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1609153152; h=Content-Type: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=8bJ6do8x2rxUfcwEtaI3U8yxFU1IkipNzl0L0h7L11I=; b=aN7qOenDXSv6fzFwG0BH345p6TTIy2sawTXuWNUxL8Fw6S+QDHVMHcU918tqf9yCyBKiCDnX1N1U/tnvT5dEcea0IWygrpEq1qmzUmPpQgi3+xOhRlDrLDFi2sg83uS5fTipy0lRVQ9NHCuH77Vz3ULH6ptQ3YeQAs6d8U0tdYU= ARC-Authentication-Results: i=1; mx.zohomail.com; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1609153152922668.0522495573326; Mon, 28 Dec 2020 02:59:12 -0800 (PST) Received: from localhost ([::1]:59240 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ktoUV-0003op-CE for importer@patchew.org; Mon, 28 Dec 2020 04:06:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:36874) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ktoT3-0002bK-IW; Mon, 28 Dec 2020 04:05:29 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:2577) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ktoT0-0002Xn-HR; Mon, 28 Dec 2020 04:05:29 -0500 Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.59]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4D4BSl6HqxzhyRG; Mon, 28 Dec 2020 17:04:39 +0800 (CST) Received: from DESKTOP-EDHIELA.china.huawei.com (10.174.187.50) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.498.0; Mon, 28 Dec 2020 17:05:08 +0800 From: g00517791 To: , Subject: [PATCH v2 2/3] savevm: Fix memory leak of vmstate_configuration Date: Mon, 28 Dec 2020 17:00:52 +0800 Message-ID: <20201228090053.346-3-gaojinhao@huawei.com> X-Mailer: git-send-email 2.29.2.windows.2 In-Reply-To: <20201228090053.346-1-gaojinhao@huawei.com> References: <20201228090053.346-1-gaojinhao@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.174.187.50] X-CFilter-Loop: Reflected 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=45.249.212.32; envelope-from=gaojinhao@huawei.com; helo=szxga06-in.huawei.com X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, 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 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefan Berger , Jason Wang , "Michael S . Tsirkin" , Greg Kurz , "Dr . David Alan Gilbert" , Juan Quintela , wanghaibin.wang@huawei.com, =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , zhukeqian1@huawei.com, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" From: Jinhao Gao When VM migrate VMState of configuration, the fields(name and capabilities) of configuration having a flag of VMS_ALLOC need to allocate memory. If the src doesn't free memory of capabilities in SaveState after save VMState of configuration, or the dst doesn't free memory of name and capabilities in p= ost load of configuration, it may result in memory leak of name and capabilitie= s. We free memory in configuration_post_save and configuration_post_load func, which prevents memory leak. Signed-off-by: Jinhao Gao Reviewed-by: Michael S. Tsirkin --- migration/savevm.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/migration/savevm.c b/migration/savevm.c index 5f937a2762..13f1a5dab7 100644 --- a/migration/savevm.c +++ b/migration/savevm.c @@ -314,6 +314,16 @@ static int configuration_pre_save(void *opaque) return 0; } =20 +static int configuration_post_save(void *opaque) +{ + SaveState *state =3D opaque; + + g_free(state->capabilities); + state->capabilities =3D NULL; + state->caps_count =3D 0; + return 0; +} + static int configuration_pre_load(void *opaque) { SaveState *state =3D opaque; @@ -364,24 +374,36 @@ static int configuration_post_load(void *opaque, int = version_id) { SaveState *state =3D opaque; const char *current_name =3D MACHINE_GET_CLASS(current_machine)->name; + int ret =3D 0; =20 if (strncmp(state->name, current_name, state->len) !=3D 0) { error_report("Machine type received is '%.*s' and local is '%s'", (int) state->len, state->name, current_name); - return -EINVAL; + ret =3D -EINVAL; + goto out; } =20 if (state->target_page_bits !=3D qemu_target_page_bits()) { error_report("Received TARGET_PAGE_BITS is %d but local is %d", state->target_page_bits, qemu_target_page_bits()); - return -EINVAL; + ret =3D -EINVAL; + goto out; } =20 if (!configuration_validate_capabilities(state)) { - return -EINVAL; + ret =3D -EINVAL; + goto out; } =20 - return 0; +out: + g_free((void *)state->name); + state->name =3D NULL; + state->len =3D 0; + g_free(state->capabilities); + state->capabilities =3D NULL; + state->caps_count =3D 0; + + return ret; } =20 static int get_capability(QEMUFile *f, void *pv, size_t size, @@ -515,6 +537,7 @@ static const VMStateDescription vmstate_configuration = =3D { .pre_load =3D configuration_pre_load, .post_load =3D configuration_post_load, .pre_save =3D configuration_pre_save, + .post_save =3D configuration_post_save, .fields =3D (VMStateField[]) { VMSTATE_UINT32(len, SaveState), VMSTATE_VBUFFER_ALLOC_UINT32(name, SaveState, 0, NULL, len), --=20 2.23.0