From nobody Fri Dec 19 20:16:48 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=1738953513; cv=none; d=zohomail.com; s=zohoarc; b=LSRHu9v+RaVR3FoqnkQMc8KOVKz55OkzUeq/Q63CLOLNQ8rqC1P5ql90hXpZHlXs4j27+t3XoNsWWygZiAVaA2T22OWqaKGPv8ZCNs2FxiQw1ocAuXxLgZqwOB5U0Kq+jhIcvkvJ35wGYMmWVqbxZZXU2fGtnYH7q1z2vDYfm8k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1738953513; h=Content-Transfer-Encoding:Cc:Cc: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; bh=WhGYl7W5lek6CUNdtQQ5Pa2k2OpDJeIcEcmmpvwAsSo=; b=GpYp/cjZRCPVGIBZMYNoctEY8+mTLtqjmygzQXgpYA0Q4SsniwElPD7IU+dshCvUPu7DGvYVRIrxGVne4tYvUKRCbsWx29LAiWM7ISZ8WbRf0obotTBAiNIvY12ygJuq15DRnMloeiF6j2l7TUuVny+aVIPJO8n1t2EVSLKz2+U= 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 1738953513471686.3300743169029; Fri, 7 Feb 2025 10:38:33 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id D4AD31785; Fri, 7 Feb 2025 13:38:32 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 8523D14E8; Fri, 7 Feb 2025 13:37:40 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id 31F711422; Fri, 7 Feb 2025 13:37:37 -0500 (EST) Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (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 6FD4514AD for ; Fri, 7 Feb 2025 13:37:36 -0500 (EST) Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-38daf09d37fso1684160f8f.1 for ; Fri, 07 Feb 2025 10:37:36 -0800 (PST) Received: from localhost (205-201-32-8.scinternet.net. [205.201.32.8]) by smtp.gmail.com with UTF8SMTPSA id 41be03b00d2f7-ad51af7a22dsm3375285a12.69.2025.02.07.10.37.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Feb 2025 10:37:34 -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=1738953455; x=1739558255; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=n2EhR0ZIuGbn/0HOBUBn7B/4ijOZ8jG0HSlUV53AXwk=; b=OlheYvMeaFKP3Xn376evpz7/0AKcnGU3StM+mLJX2H0V5iNIcH/2eqxbEXQY42coBS cMNV6QZRieoXyIMaESXWQZEuqH3fpOuuSOSdeA208roFhxR6O35D0OuWYB1DvGFVwDHb 5UmrsTz5J+PQ+tfUydbrEhmmsKO9fByG5OvCrunP4Kb7LJ3Lo0hxi/u55TcR5uYL/dO1 2BL029HnGbGZX17f/toitI7ARkqW9o9doRTbnhw8rqmwkSNz+x5unQC1Zpmndt5S2cgd 4IEh25avGg+7Ijgm0FgKAkWKOdwWUgj0oc6YoxjdZXLOV8YnELM+1MZOBr4OR0eoqTpq GIYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738953455; x=1739558255; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=n2EhR0ZIuGbn/0HOBUBn7B/4ijOZ8jG0HSlUV53AXwk=; b=ZnfnfRJkLK5y/c/ik8AdfMojjmt+AA83pZ2fQN8XtNdk/dWsha7AjYe/wHMqZI5tyY gm5IQsTX5x1OP4wQilgrt68cclxy3TttM5p3UqAHmj60o9K6HcmepUESV3yl0I69mXFw O1+Y0iZvd0aUoWTLJKObJHwirWNrm5FdJmxTnxDDl8DLN9IbRg8+jTWBFshVgVXdKmge p+1tvEn24I/s9bKzBkQPMJUoFMb5TagL0uvSF3lr0DDmWh8uvptkGyOUQKdF4TEw1t6F AHsgOMaEV4namGzFbYZC1eyqQiaMgnUR/NOzSqOQPp81YYP/2dM1O3sDEGDaPHaq+pwa Qo7Q== X-Gm-Message-State: AOJu0YwyZOnGl1tanYOxj6jeyqP1qWHR5Jy6VbiE8Ukp1CSRhQyLteMK gemxjp8jz1GNJFIc6FUER64+vefZGxHzSjtL9PXfEGri16nXKFOC8JL++7NYvpn7awHoPB0uqHy g X-Gm-Gg: ASbGncseidlVc4PgHcly7FHzSJvxWOEl/RUiW737c5hWtmRGD/6kDKZ1lMUexY55ESQ BbqR8/FfDxz+ak37Hwfz9yDUh2pfMQ44cn01Xg11sQ5fuFgOH0MuC9cFr1CUTYnmvhy9pTID0Yy cjgXXPA8NcKJUJwaHocxY3n2iAN+9PJ4LM17gSdYktNJFmzrISHlZ+v3fSWjG9HfmK3XontTHTf cp3HOks3VhYCGc6fW7Bq0NCFEwbZxt5N+a904gVwd8i0XDCHgdTvt6QMl8vwf0mvk9qMtT+zKLc ELg2DVxR4vNyBL4t4fLeycXduQXIDxQPjA== X-Google-Smtp-Source: AGHT+IHQUDpxXTlCTDWOKcTzT3Hllqp1Vb1+i2bjMtpBGoQdANAeKpdH1k0bz+0NDs8YZNOWc+sqsw== X-Received: by 2002:a5d:6d0d:0:b0:385:fa3d:1988 with SMTP id ffacd0b85a97d-38dc8da6410mr2939528f8f.8.1738953455326; Fri, 07 Feb 2025 10:37:35 -0800 (PST) To: devel@lists.libvirt.org Subject: [PATCH V3 01/19] lib: virDomain{Save,Restore}Params: Ensure absolute path Date: Fri, 7 Feb 2025 11:27:12 -0700 Message-ID: <20250207183730.21686-2-jfehlig@suse.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250207183730.21686-1-jfehlig@suse.com> References: <20250207183730.21686-1-jfehlig@suse.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: NUIQV642WTZSRQYCIVIB76SM7YKOBOTG X-Message-ID-Hash: NUIQV642WTZSRQYCIVIB76SM7YKOBOTG 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 CC: farosas@suse.de 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: 1738953515867019000 Content-Type: text/plain; charset="utf-8" When invoking virDomainSaveParams with a relative path, the image is saved to the daemon's CWD. Similarly, when providing virDomainRestoreParams with a relative path, it attempts to restore from the daemon's CWD. In most configurations, the daemon's CWD is set to '/'. Ensure a relative path is converted to absolute before invoking the driver domain{Save,Restore}Params functions. Signed-off-by: Jim Fehlig --- src/libvirt-domain.c | 89 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 072cc32255..cf68b0520b 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -1020,6 +1020,11 @@ virDomainSaveParams(virDomainPtr domain, unsigned int flags) { virConnectPtr conn; + virTypedParameterPtr params_copy =3D NULL; + int nparams_copy =3D 0; + const char *to =3D NULL; + g_autofree char *absolute_to =3D NULL; + int ret =3D -1; =20 VIR_DOMAIN_DEBUG(domain, "params=3D%p, nparams=3D%d, flags=3D0x%x", params, nparams, flags); @@ -1030,23 +1035,46 @@ virDomainSaveParams(virDomainPtr domain, virCheckDomainReturn(domain, -1); conn =3D domain->conn; =20 - virCheckReadOnlyGoto(conn->flags, error); + virCheckReadOnlyGoto(conn->flags, done); =20 VIR_EXCLUSIVE_FLAGS_GOTO(VIR_DOMAIN_SAVE_RUNNING, VIR_DOMAIN_SAVE_PAUSED, - error); + done); + + /* We must absolutize the file path as the save is done out of process= */ + virTypedParamsCopy(¶ms_copy, params, nparams); + nparams_copy =3D nparams; + if (virTypedParamsGetString(params_copy, nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, &to) < 0) + goto done; + + if (to) { + if (!(absolute_to =3D g_canonicalize_filename(to, NULL))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("could not build absolute output file path")); + goto done; + } + + if (virTypedParamsReplaceString(¶ms_copy, &nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, + absolute_to) < 0) + goto done; + } =20 if (conn->driver->domainSaveParams) { - if (conn->driver->domainSaveParams(domain, params, nparams, flags)= < 0) - goto error; - return 0; + if (conn->driver->domainSaveParams(domain, params_copy, nparams_co= py, flags) < 0) + goto done; + ret =3D 0; + } else { + virReportUnsupportedError(); } =20 - virReportUnsupportedError(); + done: + if (ret < 0) + virDispatchError(domain->conn); + virTypedParamsFree(params_copy, nparams_copy); =20 - error: - virDispatchError(domain->conn); - return -1; + return ret; } =20 =20 @@ -1203,6 +1231,12 @@ virDomainRestoreParams(virConnectPtr conn, virTypedParameterPtr params, int nparams, unsigned int flags) { + virTypedParameterPtr params_copy =3D NULL; + int nparams_copy =3D 0; + const char *from =3D NULL; + g_autofree char *absolute_from =3D NULL; + int ret =3D -1; + VIR_DEBUG("conn=3D%p, params=3D%p, nparams=3D%d, flags=3D0x%x", conn, params, nparams, flags); VIR_TYPED_PARAMS_DEBUG(params, nparams); @@ -1210,23 +1244,46 @@ virDomainRestoreParams(virConnectPtr conn, virResetLastError(); =20 virCheckConnectReturn(conn, -1); - virCheckReadOnlyGoto(conn->flags, error); + virCheckReadOnlyGoto(conn->flags, done); =20 VIR_EXCLUSIVE_FLAGS_GOTO(VIR_DOMAIN_SAVE_RUNNING, VIR_DOMAIN_SAVE_PAUSED, - error); + done); =20 if (conn->driver->domainRestoreParams) { + /* We must absolutize the file path as the save is done out of pro= cess */ + virTypedParamsCopy(¶ms_copy, params, nparams); + nparams_copy =3D nparams; + if (virTypedParamsGetString(params_copy, nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, &from) < 0) + goto done; + + if (from) { + if (!(absolute_from =3D g_canonicalize_filename(from, NULL))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("could not build absolute output file pat= h")); + goto done; + } + + if (virTypedParamsReplaceString(¶ms_copy, &nparams_copy, + VIR_DOMAIN_SAVE_PARAM_FILE, + absolute_from) < 0) + goto done; + } + if (conn->driver->domainRestoreParams(conn, params, nparams, flags= ) < 0) - goto error; - return 0; + goto done; + ret =3D 0; } =20 virReportUnsupportedError(); =20 - error: - virDispatchError(conn); - return -1; + done: + if (ret < 0) + virDispatchError(conn); + virTypedParamsFree(params_copy, nparams_copy); + + return ret; } =20 =20 --=20 2.43.0