On Thu, Sep 10, 2026 at 11:36:15AM +0100, Daniel P. Berrangé wrote:
> This introduces a new flag "secure" against the Type/TypeInfo
> structs, and helpers to check this against the ObjectClass
> struct.
>
> If an object is considered to provide a security boundary to
> protect against untrusted code, the "secure" flag must be
> explicitly set to true.
>
> If it is set to false, or left unset, this indicates that
> the object does not intend to provide a security boundary.
> Bugs related to this object class will be ineligible for
> CVE assignment.
>
> Reviewed-by: Marc-André Lureau <[email protected]>
> Signed-off-by: Daniel P. Berrangé <[email protected]>
> ---
> include/qom/object.h | 13 +++++++++++++
> qom/object.c | 7 +++++++
> 2 files changed, 20 insertions(+)
Enabling the experimental Rust support flags an omission in this
patch, so I'll squash in the following trivial change when sending
a pull request:
diff --git a/rust/qom/src/qom.rs b/rust/qom/src/qom.rs
index bbb485e2cfd..81449eeefad 100644
--- a/rust/qom/src/qom.rs
+++ b/rust/qom/src/qom.rs
@@ -651,6 +651,9 @@ pub trait ObjectImpl: ObjectType + IsA<Object> {
/// Whether the object can be instantiated
const ABSTRACT: bool = false;
+ /// Whether the object provides a security boundary for untrusted
access
+ const SECURE: bool = false;
+
/// Function that is called to initialize an object. The parent class
will
/// have already been initialized so the type is only responsible for
/// initializing its own members.
@@ -687,6 +690,7 @@ pub trait ObjectImpl: ObjectType + IsA<Object> {
},
instance_finalize: Some(drop_object::<Self>),
abstract_: Self::ABSTRACT,
+ secure: Self::SECURE,
class_size: core::mem::size_of::<Self::Class>(),
class_init: Some(rust_class_init::<Self>),
class_base_init: Self::CLASS_BASE_INIT,
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 7ecd0f210f..687ceb6bba 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -453,6 +453,10 @@ struct Object
> * function.
> * @abstract: If this field is true, then the class is considered abstract
> and
> * cannot be directly instantiated.
> + * @secure: If this field is initialized to true, then the class is
> considered
> + * to provide a security boundary. If initialized to false, the class does
> + * not provide a security boundary. If uninitialized (and thus implicitly
> + * false) its status is not yet defined.
> * @class_size: The size of the class object (derivative of #ObjectClass)
> * for this object. If @class_size is 0, then the size of the class will
> be
> * assumed to be the size of the parent class. This allows a type to avoid
> @@ -487,6 +491,7 @@ struct TypeInfo
> void (*instance_finalize)(Object *obj);
>
> bool abstract;
> + bool secure;
> size_t class_size;
>
> void (*class_init)(ObjectClass *klass, const void *data);
> @@ -1074,6 +1079,14 @@ const char *object_class_get_name(ObjectClass *klass);
> */
> bool object_class_is_abstract(ObjectClass *klass);
>
> +/**
> + * object_class_is_secure:
> + * @klass: The class to check security of
> + *
> + * Returns: %true if @klass is declared to be secure, %false if not declared
> + */
> +bool object_class_is_secure(ObjectClass *klass);
> +
> /**
> * object_class_by_name:
> * @typename: The QOM typename to obtain the class for.
> diff --git a/qom/object.c b/qom/object.c
> index b1834a57cc..32736a0111 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -67,6 +67,7 @@ struct TypeImpl
> void (*instance_finalize)(Object *obj);
>
> bool abstract;
> + bool secure;
>
> const char *parent;
> TypeImpl *parent_type;
> @@ -122,6 +123,7 @@ static TypeImpl *type_new(const TypeInfo *info)
> ti->instance_finalize = info->instance_finalize;
>
> ti->abstract = info->abstract;
> + ti->secure = info->secure;
>
> for (i = 0; info->interfaces && info->interfaces[i].type; i++) {
> ti->interfaces[i].typename = g_strdup(info->interfaces[i].type);
> @@ -1144,6 +1146,11 @@ bool object_class_is_abstract(ObjectClass *klass)
> return klass->type->abstract;
> }
>
> +bool object_class_is_secure(ObjectClass *klass)
> +{
> + return klass->type->secure;
> +}
> +
> const char *object_class_get_name(ObjectClass *klass)
> {
> return klass->type->name;
> --
> 2.55.0
>
With regards,
Daniel
--
|: https://berrange.com ~~ https://hachyderm.io/@berrange :|
|: https://libvirt.org ~~ https://entangle-photo.org :|
|: https://pixelfed.art/berrange ~~ https://fstop138.berrange.com :|