From nobody Tue Sep 9 19:11:26 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1738290728; cv=none; d=zohomail.com; s=zohoarc; b=J2tUgEpNVj1ZNh3ytS8MMOqYSLw6tyXbDpKR6UWk+0N3/D+5fKYFiLhx3AKYiS2+aES0iB0A2KA0ldlhI1k7rJJWnS6JR1PRNJFLjWWKW/0geTNd4Yx0tlODEcuY6gyliW4IBRPcir9DUNOfvLCz4PbSLt0fey6QW8hPT+6GlQk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1738290728; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=wNzQybQsHbUyQ+u1uskMYPdPyIrTE0lYc7PhlRgbi/I=; b=DZKmEeL9JQo2+6EK94lDkxtGOyHor6jAiyo0ZfclFK1zocL3f7O+bUUSZgDSddEwnM4T57ah6iRMEAwTW3f9DJBulweLgArmUEv+HDw2Tyuv4OGr3ux8G3ZvWASDJwBfc3ZZ368tKfp43sq+kzRa255WUZC0A2zQjfd1xbb30kY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738290728647322.00970684245056; Thu, 30 Jan 2025 18:32:08 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id ED8361D00; Thu, 30 Jan 2025 21:32:07 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id D11411D20; Thu, 30 Jan 2025 21:31:19 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 19A8E1CD2; Thu, 30 Jan 2025 21:31:16 -0500 (EST) Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 4C7071CCF for ; Thu, 30 Jan 2025 21:31:15 -0500 (EST) Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-5d3d14336f0so2242178a12.3 for ; Thu, 30 Jan 2025 18:31:15 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d9443c01a7336-21de31f5a60sm20415385ad.61.2025.01.30.18.31.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2025 18:31:13 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1738290674; x=1738895474; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=ol2IacikHWZQwFx7f8//3jPXZ9ImuW0G1h2PSIlo/jk=; b=HTYxOjLhHGMP8eLl3ufJ/c4g87y7MqU8mf1bn9+abO9dJQNc9NlHJfJuIekhRxfqXe EL5C4gqkM7KAMMp4vrDk+yIsf7WeYZBvCtVlpfUulN02zfJ2YjAyoj8+hjOVy2t5tesI 0cEgTpwYz4vEjK95uSoZJ61ayBEHLEHnE+THbCRGOr8yzy3AydvLFOBH0dzMJbEsz7Ti 776+peOVtkH5Md5xxuz1j4C4s4jD3pjEFw6HvH2iXBnGlHVT/H4Fj3i7TdyLe3d1OHm+ GKyc+JL+EMb92o74kSFebbC1cDsmkW2wuuICdt6zCdw1v2Eus1c7QRXtviD7+SxpDkHF Zarw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738290674; x=1738895474; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ol2IacikHWZQwFx7f8//3jPXZ9ImuW0G1h2PSIlo/jk=; b=qsXjDTHqYwyMWa+OUVILYR45v4Jfw2wqdYGoYOxtLuTG+S+JC1ub1s1ilsZHvVUED5 Vl6ojEAk5jFanjmTTGK99AVMuDJncnjkjWvwkXpojPRsyFmwixXmekjoCLs1IeItKCU/ 7w6/rmf83RQkNWiEr5ZpCdvlnJlU2s+7I+fmrMWvGN0AJhiNQEpDeQOpBKO/TBdb/1MK Vh2UGod/BTo6Gf6Y8l3342o6qhPb9TCNBCrnA8PbIqtnZPHpyyhAJVdmLDUo1KDzYbDD e6mEwnAnp5fEzwHVwfCNjWvGP//sUcj3pXL+EXzu/GotjYPz0L6H0UWtIAsV1NrC6gI3 y6aw== X-Gm-Message-State: AOJu0YyRJOjLE11svaQqpttXP78jNIJwuNlKZxcG1yDjV8thzZ7KnlBx Hsmy4XY6gH56ERwNYP8JId5iqGPisV9YdUTq1LT301ocUWor8a+GecpN3tH4p0NiA5C1ktC/gQE 4 X-Gm-Gg: ASbGncs20qGp3jPgYzUbZUVUOrlSfems6lA24N+Ht3yPbBP5qb8qZ9mvg9ZhjWBli48 WszV+qf4wvTfPYEuJV3FjHVLAMNy8zArmuUgV/FvgyOgSYrsrRjYFo9urdzdSIPiTaZJtWSa79M suci0TQ7Oh9aOV3tqkJeTL/+5crPtZcW/0CmgQXwIhsB5FQWKaVfNqtTYqOgprk+3WDjAXiYMab TeLyi31W1aPepG5sNQfCn/wMW+2PiLY6y75llpjUb1i3yj27amAHmXlQp7lgWIsqHZnSUbWnjc8 Eh/fSHOweeijdRdGZ+WY/XqHvTuR6z0T/A== X-Google-Smtp-Source: AGHT+IGMECMR0pzeeQvg4VdmphXGiMcOS1e5SjGj4exBBahAzy1it0PFrDrH2yfxokMJFpTRAyY38w== X-Received: by 2002:a17:907:9726:b0:ab6:cdc4:e825 with SMTP id a640c23a62f3a-ab6cfda40e6mr913949366b.40.1738290674115; Thu, 30 Jan 2025 18:31:14 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V2 1/3] qemu: Move unlinking corrupt save image file to caller Date: Thu, 30 Jan 2025 19:29:02 -0700 Message-ID: <20250131023110.20024-2-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250131023110.20024-1-jfehlig@suse.com> References: <20250131023110.20024-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: CMVX6HTTWBV5XZBOKATKXUP533ZKHLZ5 X-Message-ID-Hash: CMVX6HTTWBV5XZBOKATKXUP533ZKHLZ5 X-MailFrom: jfehlig@suse.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738290730121019000 Content-Type: text/plain; charset="utf-8" qemuDomainObjRestore is the only caller of qemuSaveImageOpen that requests an unlink of a corrupted save image. Provide a function to check for a corrupt image and move unlinking it to qemuDomainObjRestore. Signed-off-by: Jim Fehlig Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 23 ++++++++++----- src/qemu/qemu_saveimage.c | 59 +++++++++++++++++++++------------------ src/qemu/qemu_saveimage.h | 8 ++++-- src/qemu/qemu_snapshot.c | 3 +- 4 files changed, 55 insertions(+), 38 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index da714f1975..2e80ce7921 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5777,7 +5777,7 @@ qemuDomainRestoreInternal(virConnectPtr conn, =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0, - &wrapperFd, false, false); + &wrapperFd, false); if (fd < 0) goto cleanup; =20 @@ -5912,7 +5912,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, false, false); + false, NULL, false); =20 if (fd < 0) goto cleanup; @@ -5949,7 +5949,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, state =3D 0; =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, true, false); + false, NULL, true); =20 if (fd < 0) goto cleanup; @@ -6030,7 +6030,7 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, uns= igned int flags) } =20 if ((fd =3D qemuSaveImageOpen(driver, priv->qemuCaps, path, &def, &dat= a, - false, NULL, false, false)) < 0) + false, NULL, false)) < 0) goto cleanup; =20 ret =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, def, flags); @@ -6094,10 +6094,19 @@ qemuDomainObjRestore(virConnectPtr conn, virFileWrapperFd *wrapperFd =3D NULL; =20 fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - bypass_cache, &wrapperFd, false, true); + bypass_cache, &wrapperFd, false); if (fd < 0) { - if (fd =3D=3D -3) - ret =3D 1; + if (qemuSaveImageIsCorrupt(driver, path)) { + if (unlink(path) < 0) { + virReportSystemError(errno, + _("cannot remove corrupt file: %1$s"), + path); + ret =3D -1; + } else { + virResetLastError(); + ret =3D 1; + } + } goto cleanup; } =20 diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 69617e07eb..385ac8a649 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -520,6 +520,35 @@ qemuSaveImageGetCompressionProgram(const char *imageFo= rmat, return -1; } =20 +/** + * qemuSaveImageIsCorrupt: + * @driver: qemu driver data + * @path: path of the save image + * + * Returns true if the save image file identified by @path does not exist = or + * has a corrupt header. Returns false otherwise. + */ + +bool +qemuSaveImageIsCorrupt(virQEMUDriver *driver, const char *path) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + VIR_AUTOCLOSE fd =3D -1; + virQEMUSaveHeader header; + + if ((fd =3D qemuDomainOpenFile(cfg, NULL, path, O_RDONLY, NULL)) < 0) + return true; + + if (saferead(fd, &header, sizeof(header)) !=3D sizeof(header)) + return true; + + if (memcmp(header.magic, QEMU_SAVE_MAGIC, sizeof(header.magic)) !=3D 0= || + memcmp(header.magic, QEMU_SAVE_PARTIAL, sizeof(header.magic)) =3D= =3D 0) + return true; + + return false; +} + =20 /** * qemuSaveImageOpen: @@ -531,11 +560,10 @@ qemuSaveImageGetCompressionProgram(const char *imageF= ormat, * @bypass_cache: bypass cache when opening the file * @wrapperFd: returns the file wrapper structure * @open_write: open the file for writing (for updates) - * @unlink_corrupt: remove the image file if it is corrupted * * Returns the opened fd of the save image file and fills the appropriate = fields - * on success. On error returns -1 on most failures, -3 if corrupt image w= as - * unlinked (no error raised). + * on success. On error returns -1 on most failures, -3 if a corrupt image= was + * detected. */ int qemuSaveImageOpen(virQEMUDriver *driver, @@ -545,8 +573,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, - bool open_write, - bool unlink_corrupt) + bool open_write) { g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); VIR_AUTOCLOSE fd =3D -1; @@ -580,17 +607,6 @@ qemuSaveImageOpen(virQEMUDriver *driver, =20 header =3D &data->header; if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { - if (unlink_corrupt) { - if (unlink(path) < 0) { - virReportSystemError(errno, - _("cannot remove corrupt file: %1$s"), - path); - return -1; - } else { - return -3; - } - } - virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read qemu header")); return -1; @@ -598,17 +614,6 @@ qemuSaveImageOpen(virQEMUDriver *driver, =20 if (memcmp(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)) !=3D= 0) { if (memcmp(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)= ) =3D=3D 0) { - if (unlink_corrupt) { - if (unlink(path) < 0) { - virReportSystemError(errno, - _("cannot remove corrupt file: %1= $s"), - path); - return -1; - } else { - return -3; - } - } - virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("save image is incomplete")); return -1; diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 0e58dd14b6..dc49f8463f 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -69,6 +69,11 @@ qemuSaveImageStartVM(virConnectPtr conn, virDomainAsyncJob asyncJob) ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5) ATTRIBUTE_NONNULL(6); =20 +bool +qemuSaveImageIsCorrupt(virQEMUDriver *driver, + const char *path) + ATTRIBUTE_NONNULL(2); + int qemuSaveImageOpen(virQEMUDriver *driver, virQEMUCaps *qemuCaps, @@ -77,8 +82,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, - bool open_write, - bool unlink_corrupt) + bool open_write) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); =20 int diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 5273348aeb..b9c3983472 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2379,8 +2379,7 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, memdata->path =3D snapdef->memorysnapshotfile; memdata->fd =3D qemuSaveImageOpen(driver, NULL, memdata->path, &savedef, &memdata->data, - false, NULL, - false, false); + false, NULL, false); =20 if (memdata->fd < 0) return -1; --=20 2.43.0 From nobody Tue Sep 9 19:11:26 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1738290772; cv=none; d=zohomail.com; s=zohoarc; b=A6Hj5fUX053Zldi9TqUGUTxqf0lPyguyIV5zPEvnFPw+8rCoyV4Azugit2CDu0NUy64ClmXomAYeVFRvyBhZxQeDH78dvK9U26m0ojuhDPg/2gxPSrxZ6vrpSYIwbfVv5UbZIO/yBlaP0Jerz7sExS5yxcUeRRCGB269O/2zJAc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1738290772; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=q0mwgibkfIF3TYNUOvoY92m+bSFxCco7AZ1JCCcZMpg=; b=BfVYQFe6UlEbKNHId4JP5pfE1mI7BiDUAN5qoZ1mU1DrLQalo5uUWaZvjU+CEzP5+EU1FDGj38dhjAwwU2O0lXDjRagClQbbAUdssYGNW2QUthEJemHwgY9olDiXU5EASOq0+IBDNCgwwUnqEf4qE59A2P4w1T/Er11vvzek6s4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738290772595496.48561209347577; Thu, 30 Jan 2025 18:32:52 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id EAAA81D87; Thu, 30 Jan 2025 21:32:51 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 178FA1D7C; Thu, 30 Jan 2025 21:31:23 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 2668B1CD0; Thu, 30 Jan 2025 21:31:18 -0500 (EST) Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 200591CCF for ; Thu, 30 Jan 2025 21:31:17 -0500 (EST) Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5dc82e38c10so383709a12.3 for ; Thu, 30 Jan 2025 18:31:17 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-72fe631bea6sm2168055b3a.22.2025.01.30.18.31.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2025 18:31:15 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1738290676; x=1738895476; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=FOGFz0R89I+3XlhdqrkY22tFKN4smXuqaSck1w1ygKU=; b=YuxCqOax2BeMmI8pm3VwHLbiU3hnxmZIV4hqhULkHcK20a5bXzz7xXJEPtjDpstST1 3DrmAUc85RFfSV9dycI1fWz04GZYCm3L3Y705u9NDo/7PP1duE2MSVAi6J49Nf5tBxpW 7pVuAsN2miKOLcnB0UIQXyPk0GZ9l+YwTQ1vbfTzTijdndXpQRiFMmlNzb5z4OqZDP/b qheit5czpvqDFyCtakucHHVNYH/4UUU32zegzEYcyqY8X1l6t0H7B9NkbMsJSXGSFY5W rKH5yE1ayN+E4nMBLDoE0AApW3DrLwG3smvD1TCCOAel7BW2b6IDyGnNCsgYSisp1S/D Rxbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738290676; x=1738895476; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FOGFz0R89I+3XlhdqrkY22tFKN4smXuqaSck1w1ygKU=; b=STNzvAyILXQl/p5zUasDQ4U+5gqZqbU/bnUxIy7YuRLft1AD2HeIoKOMtelwcBnDOj XmFLbsmStEpkwG1ni9AVIQlPJgeKCY0pxw3swj1VNOYPCJ1dhhSj8qUdd8ZrBTPEsnBC G+ivCXuI5fwWKz8BjSc5CrOT36JxZp6jIqwYOOtK/hzeFuGKCbGeX+DMd7EOHO/NxtfL vlI3OTw2eFxmJCUg9OG/MoHV29lpqYmdu5GEWGIL2n7y8MhYJfdSzwrUttCeboB9Aj7Q 8CjdSP/Z1Bf9flKaI7Z/wioEqgvJ2ywNepYjtrGRmwSYZk+4Dk5GU3l7bQBdMpM8a3T1 YAPw== X-Gm-Message-State: AOJu0YzUh614leFT59CUHaoslcj0Uofzrs3b3C9ytFPdVlDdXD0nnaqd giSwa5ph0QwWqZvNZzfvxLABPYnbJwyTIE09MwkEI47TTOtJWkUCIVkQ1nFsRzrbb3Ets2HSAhP D X-Gm-Gg: ASbGncuHMp1816vZgO/dt1VdrLE9VNqAnaG4whFpzV9j62m4BvOz0PlRA8a2be7smYe TVouQAIOYiWm2KJshdpaAHWXw/C96uYmPWggT3Q8Uy+HNfNGh20xN4H9yk3SkHbAbPHyTHvZW7R QqoZUTlb6CqxdXTgVigwXevHBIqBPm2+60SZfi1iPbSDqUBKsHsf5hpDEvkSL3OHMguBaFOzOWW GAlMvVr3ZkGwJ+v8JndiYZaPZi1ebBHx8cZs0zxatamgLDoIZUpAdOSHrH1Zq2rkVVsHhqLBitR eH65MEGp/imPvrE2lb10OSUwbEmhDJrw1w== X-Google-Smtp-Source: AGHT+IGGUNonyzsGVmFex1WJezgOzuRRqaiEpB4a93rE6bhrlxSa64yFtjxblG6y7DF8/CKkclS4fA== X-Received: by 2002:a17:907:72c1:b0:ab6:b9a6:a9e6 with SMTP id a640c23a62f3a-ab6cfdd6d90mr1047632266b.46.1738290675956; Thu, 30 Jan 2025 18:31:15 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V2 2/3] qemu: Decompose qemuSaveImageOpen Date: Thu, 30 Jan 2025 19:29:03 -0700 Message-ID: <20250131023110.20024-3-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250131023110.20024-1-jfehlig@suse.com> References: <20250131023110.20024-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: JKJA2J2POUUKZHNUNLMFYFSXX53DAASR X-Message-ID-Hash: JKJA2J2POUUKZHNUNLMFYFSXX53DAASR X-MailFrom: jfehlig@suse.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738290774129019000 Content-Type: text/plain; charset="utf-8" Split the reading of libvirt's save image metadata from the opening of the fd that will be passed to QEMU. This allows improved error handling and provides more flexibility users of qemu_saveimage. Signed-off-by: Jim Fehlig Reviewed-by: Michal Privoznik --- src/qemu/qemu_driver.c | 31 +++--- src/qemu/qemu_saveimage.c | 207 +++++++++++++++++++++++--------------- src/qemu/qemu_saveimage.h | 13 ++- src/qemu/qemu_snapshot.c | 8 +- 4 files changed, 153 insertions(+), 106 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2e80ce7921..f326937585 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5775,7 +5775,10 @@ qemuDomainRestoreInternal(virConnectPtr conn, if (flags & VIR_DOMAIN_SAVE_RESET_NVRAM) reset_nvram =3D true; =20 - fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, + if (qemuSaveImageGetMetadata(driver, NULL, path, &def, &data) < 0) + goto cleanup; + + fd =3D qemuSaveImageOpen(driver, path, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) !=3D 0, &wrapperFd, false); if (fd < 0) @@ -5906,15 +5909,11 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, c= onst char *path, virQEMUDriver *driver =3D conn->privateData; char *ret =3D NULL; g_autoptr(virDomainDef) def =3D NULL; - int fd =3D -1; virQEMUSaveData *data =3D NULL; =20 virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL); =20 - fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, false); - - if (fd < 0) + if (qemuSaveImageGetMetadata(driver, NULL, path, &def, &data) < 0) goto cleanup; =20 if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0) @@ -5924,7 +5923,6 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, =20 cleanup: virQEMUSaveDataFree(data); - VIR_FORCE_CLOSE(fd); return ret; } =20 @@ -5948,9 +5946,10 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, con= st char *path, else if (flags & VIR_DOMAIN_SAVE_PAUSED) state =3D 0; =20 - fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - false, NULL, true); + if (qemuSaveImageGetMetadata(driver, NULL, path, &def, &data) < 0) + goto cleanup; =20 + fd =3D qemuSaveImageOpen(driver, path, 0, NULL, false); if (fd < 0) goto cleanup; =20 @@ -6007,7 +6006,6 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, uns= igned int flags) g_autofree char *path =3D NULL; char *ret =3D NULL; g_autoptr(virDomainDef) def =3D NULL; - int fd =3D -1; virQEMUSaveData *data =3D NULL; qemuDomainObjPrivate *priv; =20 @@ -6029,15 +6027,13 @@ qemuDomainManagedSaveGetXMLDesc(virDomainPtr dom, u= nsigned int flags) goto cleanup; } =20 - if ((fd =3D qemuSaveImageOpen(driver, priv->qemuCaps, path, &def, &dat= a, - false, NULL, false)) < 0) + if (qemuSaveImageGetMetadata(driver, priv->qemuCaps, path, &def, &data= ) < 0) goto cleanup; =20 ret =3D qemuDomainDefFormatXML(driver, priv->qemuCaps, def, flags); =20 cleanup: virQEMUSaveDataFree(data); - VIR_FORCE_CLOSE(fd); virDomainObjEndAPI(&vm); return ret; } @@ -6093,9 +6089,8 @@ qemuDomainObjRestore(virConnectPtr conn, virQEMUSaveData *data =3D NULL; virFileWrapperFd *wrapperFd =3D NULL; =20 - fd =3D qemuSaveImageOpen(driver, NULL, path, &def, &data, - bypass_cache, &wrapperFd, false); - if (fd < 0) { + ret =3D qemuSaveImageGetMetadata(driver, NULL, path, &def, &data); + if (ret < 0) { if (qemuSaveImageIsCorrupt(driver, path)) { if (unlink(path) < 0) { virReportSystemError(errno, @@ -6110,6 +6105,10 @@ qemuDomainObjRestore(virConnectPtr conn, goto cleanup; } =20 + fd =3D qemuSaveImageOpen(driver, path, bypass_cache, &wrapperFd, false= ); + if (fd < 0) + goto cleanup; + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { int hookret; =20 diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 385ac8a649..8315171b78 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -249,6 +249,84 @@ qemuSaveImageGetCompressionCommand(virQEMUSaveFormat f= ormat) } =20 =20 +static int +qemuSaveImageReadHeader(int fd, virQEMUSaveData **ret_data) +{ + g_autoptr(virQEMUSaveData) data =3D NULL; + virQEMUSaveHeader *header; + size_t xml_len; + size_t cookie_len; + + data =3D g_new0(virQEMUSaveData, 1); + header =3D &data->header; + if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { + virReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("failed to read qemu header")); + return -1; + } + + if (memcmp(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)) !=3D= 0) { + if (memcmp(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)= ) =3D=3D 0) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("save image is incomplete")); + return -1; + } + + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("image magic is incorrect")); + return -1; + } + + if (header->version > QEMU_SAVE_VERSION) { + /* convert endianness and try again */ + qemuSaveImageBswapHeader(header); + } + + if (header->version > QEMU_SAVE_VERSION) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("image version is not supported (%1$d > %2$d)"), + header->version, QEMU_SAVE_VERSION); + return -1; + } + + if (header->data_len <=3D 0) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("invalid header data length: %1$d"), header->data= _len); + return -1; + } + + if (header->cookieOffset) + xml_len =3D header->cookieOffset; + else + xml_len =3D header->data_len; + + cookie_len =3D header->data_len - xml_len; + + data->xml =3D g_new0(char, xml_len); + + if (saferead(fd, data->xml, xml_len) !=3D xml_len) { + virReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("failed to read domain XML")); + return -1; + } + + if (cookie_len > 0) { + data->cookie =3D g_new0(char, cookie_len); + + if (saferead(fd, data->cookie, cookie_len) !=3D cookie_len) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("failed to read cookie")); + return -1; + } + } + + if (ret_data) + *ret_data =3D g_steal_pointer(&data); + + return 0; +} + + /** * qemuSaveImageDecompressionStart: * @data: data from memory state file @@ -520,6 +598,7 @@ qemuSaveImageGetCompressionProgram(const char *imageFor= mat, return -1; } =20 + /** * qemuSaveImageIsCorrupt: * @driver: qemu driver data @@ -551,26 +630,61 @@ qemuSaveImageIsCorrupt(virQEMUDriver *driver, const c= har *path) =20 =20 /** - * qemuSaveImageOpen: + * qemuSaveImageGetMetadata: * @driver: qemu driver data * @qemuCaps: pointer to qemuCaps if the domain is running or NULL * @path: path of the save image * @ret_def: returns domain definition created from the XML stored in the = image * @ret_data: returns structure filled with data from the image header + * + * Open the save image file, read libvirt's save image metadata, and popul= ate + * the @ret_def and @ret_data structures. Returns 0 on success and -1 on f= ailure. + */ +int +qemuSaveImageGetMetadata(virQEMUDriver *driver, + virQEMUCaps *qemuCaps, + const char *path, + virDomainDef **ret_def, + virQEMUSaveData **ret_data) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + VIR_AUTOCLOSE fd =3D -1; + virQEMUSaveData *data; + g_autoptr(virDomainDef) def =3D NULL; + int rc; + + if ((fd =3D qemuDomainOpenFile(cfg, NULL, path, O_RDONLY, NULL)) < 0) + return -1; + + if ((rc =3D qemuSaveImageReadHeader(fd, ret_data)) < 0) + return rc; + + data =3D *ret_data; + /* Create a domain from this XML */ + if (!(def =3D virDomainDefParseString(data->xml, driver->xmlopt, qemuC= aps, + VIR_DOMAIN_DEF_PARSE_INACTIVE | + VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE= ))) + return -1; + + *ret_def =3D g_steal_pointer(&def); + + return 0; +} + + +/** + * qemuSaveImageOpen: + * @driver: qemu driver data + * @path: path of the save image * @bypass_cache: bypass cache when opening the file * @wrapperFd: returns the file wrapper structure * @open_write: open the file for writing (for updates) * - * Returns the opened fd of the save image file and fills the appropriate = fields - * on success. On error returns -1 on most failures, -3 if a corrupt image= was - * detected. + * Returns the opened fd of the save image file on success, -1 on failure. */ int qemuSaveImageOpen(virQEMUDriver *driver, - virQEMUCaps *qemuCaps, const char *path, - virDomainDef **ret_def, - virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, bool open_write) @@ -578,12 +692,7 @@ qemuSaveImageOpen(virQEMUDriver *driver, g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); VIR_AUTOCLOSE fd =3D -1; int ret =3D -1; - g_autoptr(virQEMUSaveData) data =3D NULL; - virQEMUSaveHeader *header; - g_autoptr(virDomainDef) def =3D NULL; int oflags =3D open_write ? O_RDWR : O_RDONLY; - size_t xml_len; - size_t cookie_len; =20 if (bypass_cache) { int directFlag =3D virFileDirectFdFlag(); @@ -603,78 +712,10 @@ qemuSaveImageOpen(virQEMUDriver *driver, VIR_FILE_WRAPPER_BYPASS_CACHE))) return -1; =20 - data =3D g_new0(virQEMUSaveData, 1); - - header =3D &data->header; - if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { - virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("failed to read qemu header")); + /* Read the header to position the file pointer for QEMU. Unfortunatel= y we + * can't use lseek with virFileWrapperFD. */ + if (qemuSaveImageReadHeader(fd, NULL) < 0) return -1; - } - - if (memcmp(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)) !=3D= 0) { - if (memcmp(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)= ) =3D=3D 0) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("save image is incomplete")); - return -1; - } - - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("image magic is incorrect")); - return -1; - } - - if (header->version > QEMU_SAVE_VERSION) { - /* convert endianness and try again */ - qemuSaveImageBswapHeader(header); - } - - if (header->version > QEMU_SAVE_VERSION) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("image version is not supported (%1$d > %2$d)"), - header->version, QEMU_SAVE_VERSION); - return -1; - } - - if (header->data_len <=3D 0) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("invalid header data length: %1$d"), header->data= _len); - return -1; - } - - if (header->cookieOffset) - xml_len =3D header->cookieOffset; - else - xml_len =3D header->data_len; - - cookie_len =3D header->data_len - xml_len; - - data->xml =3D g_new0(char, xml_len); - - if (saferead(fd, data->xml, xml_len) !=3D xml_len) { - virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("failed to read domain XML")); - return -1; - } - - if (cookie_len > 0) { - data->cookie =3D g_new0(char, cookie_len); - - if (saferead(fd, data->cookie, cookie_len) !=3D cookie_len) { - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("failed to read cookie")); - return -1; - } - } - - /* Create a domain from this XML */ - if (!(def =3D virDomainDefParseString(data->xml, driver->xmlopt, qemuC= aps, - VIR_DOMAIN_DEF_PARSE_INACTIVE | - VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE= ))) - return -1; - - *ret_def =3D g_steal_pointer(&def); - *ret_data =3D g_steal_pointer(&data); =20 ret =3D fd; fd =3D -1; diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index dc49f8463f..53ae222467 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -74,16 +74,21 @@ qemuSaveImageIsCorrupt(virQEMUDriver *driver, const char *path) ATTRIBUTE_NONNULL(2); =20 +int +qemuSaveImageGetMetadata(virQEMUDriver *driver, + virQEMUCaps *qemuCaps, + const char *path, + virDomainDef **ret_def, + virQEMUSaveData **ret_data) + ATTRIBUTE_NONNULL(4) ATTRIBUTE_NONNULL(5); + int qemuSaveImageOpen(virQEMUDriver *driver, - virQEMUCaps *qemuCaps, const char *path, - virDomainDef **ret_def, - virQEMUSaveData **ret_data, bool bypass_cache, virFileWrapperFd **wrapperFd, bool open_write) - ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); + ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); =20 int qemuSaveImageGetCompressionProgram(const char *imageFormat, diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index b9c3983472..7ce018b026 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -2377,10 +2377,12 @@ qemuSnapshotRevertExternalPrepare(virDomainObj *vm, g_autoptr(virDomainDef) savedef =3D NULL; =20 memdata->path =3D snapdef->memorysnapshotfile; - memdata->fd =3D qemuSaveImageOpen(driver, NULL, memdata->path, - &savedef, &memdata->data, + if (qemuSaveImageGetMetadata(driver, NULL, memdata->path, &savedef, + &memdata->data) < 0) + return -1; + + memdata->fd =3D qemuSaveImageOpen(driver, memdata->path, false, NULL, false); - if (memdata->fd < 0) return -1; =20 --=20 2.43.0 From nobody Tue Sep 9 19:11:26 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1738290789; cv=none; d=zohomail.com; s=zohoarc; b=DGS5G4JpFgDRs9WFgIzacbXhoM/NUbaXNeQydqSlccNur84RU7MNZS8lXlSf31U9BMHWUw6yqCg+7hF6yy0gVraVKu9HvZtJUeto4hTHc519r+SZj5iA+kJWXl/2Jo0PBZpd2vaKz6jPOLxxbYovjA3KSv8Q9eGKsx4NuX8LQDE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1738290789; h=Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=MA9+K+7UlDvjqclxtwb2yddeqBm+tROFXQD3blbUnxA=; b=cA/9/1jbdT/SPhZK4cqgbeerjxZOV7ZJJILrfSoa4p8Xqtao6oAn3wc7PUGxwy92zO89hTYC8+QCOi3K3HoZQhTeOKvH1wSwYW7gLfUpMBhzLJLYd3oTIN1/y+gmXGnu1sm71ca4t5JPuC8W1DygGA+1tRi15bTSPUQTTeskg2A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738290789077450.16213307673206; Thu, 30 Jan 2025 18:33:09 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 739A01CD2; Thu, 30 Jan 2025 21:33:08 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id D40D01D12; Thu, 30 Jan 2025 21:31:25 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 691631CDA; Thu, 30 Jan 2025 21:31:19 -0500 (EST) Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id C026D186F for ; Thu, 30 Jan 2025 21:31:18 -0500 (EST) Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-aa684b6d9c7so265267466b.2 for ; Thu, 30 Jan 2025 18:31:18 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id d2e1a72fcca58-72fe631bebdsm2173447b3a.29.2025.01.30.18.31.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 30 Jan 2025 18:31:17 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1738290678; x=1738895478; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=RMju6Jfn2wd0R+FdBnLN1Uv9AyurbtMQuVVYdaD7nFc=; b=fSHBE563O6ei0s98WAvRH3hlcbYPoozQLpD5KKCws8DreN0EE/j/19oQUs/TVNY490 fS3oAdlVMdBgnUwFTKUvHonB71e4ISVsgWlEpp0WSRhCqWH9xBYm2IINfww01AcQj6lB TmAbDIOzhCHlG8UqQ+Q+6aCQG8RDUO+3hYL3Mv/6x2DGtO72fAhV5mxNE9A4LPuqOBj5 29miyLj5vRYqRzOKFh9nIPrGtBwmXQSziLiML9KUUr8lqVxJCXpJgAabg1pPb5w0F/cn X8bNIU8u3RutRBjdXMhAEcIC74+ete6Bn/GQTiERWw5dWobCkKqf6Af6OwvZvt/Uore7 a/5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738290678; x=1738895478; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RMju6Jfn2wd0R+FdBnLN1Uv9AyurbtMQuVVYdaD7nFc=; b=GSHIAA78xRx2C/tLj2A0nqs3IkYIdjvidoWAMZXmkxD3idMhzUDbQ9/0HzZJCthirI hZrknOxQUF/PJf1xkMOzK95Do7xR9c2oa0uFV8KwqqIa/POVMfQrwTG98WpeHcu4WooY L675icDnY85tXURssEN3JlDnrcdBuivbmi1Qy9M873ixfyi60I5N4hB2djP/pauBuurR 5S34ShWdAeROwZQnXIruD6n98BHMRlFws27HYNMe4+l8/oqUa79B7R6WTMid4n+PVS7N 3zF2Gm3VvLMz2IRxLLRwDZL28w9tys8lawzOlb5vyolV+tVzmhSeIcg78cux0blnSZ2l 9CKA== X-Gm-Message-State: AOJu0Yw2UtpYaoueUZwn8t0m3VYegSr6l4sjpYUB+Q5Duc61+cWjVvyN YAUae1WnZ0zSXFrgP3gLdD+v97zpffUitttsHvP02xrx2kmtGEV9YF92HiIdHMa0fPNozz3ep3X u X-Gm-Gg: ASbGncuR8TueVIjzmtJYZT/S3G3ScuKXiWSnrNGoxjHeuI0zOFHW3DrOFDv7OWY5Xom 2/PJ9x6drbkIXGNgYAdnM6qP/SagP3i9kf0srgkTPSnbsgV5OGiL9swzlGFmhuyMqJpyMXOm6JG MtlMzrrFScs72s9zn+RXVILmc1TDqZc2+ngMGFBQhkC7PWNk3nxuJbu6U5/d2BPrZI3Uy5QluJJ X6tCoQOiRlMiMbalnpmxRXA1XYCcaEljF5eF20sOYPE+kYJtlYkGxXxuc85OWJcQMLd6aqJD0bV h2LvU2klneEYACdBPeWZRtQCdBuzebRmFg== X-Google-Smtp-Source: AGHT+IH7TFJ5WqDeY9ZqJzHC5f0fkz7U4joyJU3BKUgv3iPCuO/0QbONraXwp/h5rR/FFVSJNpTEPg== X-Received: by 2002:a17:907:c2a:b0:aab:740f:e467 with SMTP id a640c23a62f3a-ab6cfcb3bb7mr989123266b.8.1738290677682; Thu, 30 Jan 2025 18:31:17 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V2 3/3] qemu: Check for valid save image format when verifying image header Date: Thu, 30 Jan 2025 19:29:04 -0700 Message-ID: <20250131023110.20024-4-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250131023110.20024-1-jfehlig@suse.com> References: <20250131023110.20024-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: ZRKBH53ZJIF2RJXJ65ED576IIAZFFIWB X-Message-ID-Hash: ZRKBH53ZJIF2RJXJ65ED576IIAZFFIWB X-MailFrom: jfehlig@suse.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; suspicious-header X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: From: Jim Fehlig via Devel Reply-To: Jim Fehlig X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738290789972019000 Content-Type: text/plain; charset="utf-8" When attempting to restore a saved image, the check for a valid save image format does not occur until the qemu process is about to be executed. Move the check earlier in the restore process, along with the other checks that verify a valid save image header. Signed-off-by: Jim Fehlig Reviewed-by: Michal Privoznik --- src/qemu/qemu_saveimage.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 8315171b78..5c889fee11 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -289,6 +289,12 @@ qemuSaveImageReadHeader(int fd, virQEMUSaveData **ret_= data) return -1; } =20 + if (header->format >=3D QEMU_SAVE_FORMAT_LAST) { + virReportError(VIR_ERR_OPERATION_FAILED, + _("unsupported save image format: %1$d"), header->f= ormat); + return -1; + } + if (header->data_len <=3D 0) { virReportError(VIR_ERR_OPERATION_FAILED, _("invalid header data length: %1$d"), header->data= _len); --=20 2.43.0