[PATCH] qemu: validate: Validate maximum start time for <clock offset='absolute'>

Ján Tomko jtomko at redhat.com
Thu Nov 3 16:07:49 UTC 2022


On a Thursday in 2022, Peter Krempa wrote:
>Glib can internally convert only unix timestamps up to
>9999-12-31T23:59:59 (253402300799). Validate that the user doesn't use
>more than that as otherwise we cause an assertion failure:
>
> (process:1183396): GLib-CRITICAL **: 14:25:00.906: g_date_time_format: assertion 'datetime != NULL' failed
>
>Additionally adjust the schema to allow bigger values as we use
>'unsigned long long' to parse the value.
>
>Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2128993
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> src/conf/schemas/domaincommon.rng               |  2 +-
> src/qemu/qemu_validate.c                        | 17 +++++++++++++++++
> .../clock-absolute.x86_64-latest.args           |  2 +-
> tests/qemuxml2argvdata/clock-absolute.xml       |  2 +-
> .../clock-absolute.x86_64-latest.xml            |  2 +-
> 5 files changed, 21 insertions(+), 4 deletions(-)
>
>diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
>index ebb39de3ef..cefe818044 100644
>--- a/src/conf/schemas/domaincommon.rng
>+++ b/src/conf/schemas/domaincommon.rng
>@@ -1312,7 +1312,7 @@
>               <value>absolute</value>
>             </attribute>
>             <attribute name="start">
>-              <ref name="unsignedInt"/>
>+              <ref name="unsignedLong"/>
>             </attribute>
>           </group>
>         </choice>
>diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
>index 1456a69351..1d4081e47e 100644
>--- a/src/qemu/qemu_validate.c
>+++ b/src/qemu/qemu_validate.c
>@@ -663,6 +663,23 @@ qemuValidateDomainDefClockTimers(const virDomainDef *def,
>         }
>     }
>
>+    switch ((virDomainClockOffsetType) def->clock.offset) {
>+    case VIR_DOMAIN_CLOCK_OFFSET_ABSOLUTE:
>+        /* maximum timestamp glib can convert is 9999-12-31T23:59:59 */

Consider #defining this as a constant, e.g.

#define QEMU_MAX_GLIB_TIMESTAMP (2932896 * (24 * 60 * 60) + 23 * (60 * 60) + 59 * (60) + 59)

>+        if (def->clock.data.starttime > 253402300799) {
>+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>+                           _("The maximum 'start' value for <clock offset='absolute'> is 253402300799"));
>+            return -1;
>+        }
>+

Regardless of my above suggestion:

Reviewed-by: Ján Tomko <jtomko at redhat.com>

Jano


More information about the libvir-list mailing list