提交 8f5d58ef 编写于 作者: I Igor Mammedov 提交者: Paolo Bonzini

qom: enforce readonly nature of link's check callback

link's check callback is supposed to verify/permit setting it,
however currently nothing restricts it from misusing it
and modifying target object from within.
Make sure that readonly semantics are checked by compiler
to prevent callback's misuse.
Signed-off-by: NIgor Mammedov <imammedo@redhat.com>
Signed-off-by: NFam Zheng <famz@redhat.com>
Message-Id: <20170714021509.23681-2-famz@redhat.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 d40d3da0
...@@ -25,7 +25,8 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name, ...@@ -25,7 +25,8 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
} }
} }
void qdev_prop_allow_set_link_before_realize(Object *obj, const char *name, void qdev_prop_allow_set_link_before_realize(const Object *obj,
const char *name,
Object *val, Error **errp) Object *val, Error **errp)
{ {
DeviceState *dev = DEVICE(obj); DeviceState *dev = DEVICE(obj);
......
...@@ -515,7 +515,7 @@ static void xlnx_dp_aux_set_command(XlnxDPState *s, uint32_t value) ...@@ -515,7 +515,7 @@ static void xlnx_dp_aux_set_command(XlnxDPState *s, uint32_t value)
s->core_registers[DP_INTERRUPT_SIGNAL_STATE] |= 0x04; s->core_registers[DP_INTERRUPT_SIGNAL_STATE] |= 0x04;
} }
static void xlnx_dp_set_dpdma(Object *obj, const char *name, Object *val, static void xlnx_dp_set_dpdma(const Object *obj, const char *name, Object *val,
Error **errp) Error **errp)
{ {
XlnxDPState *s = XLNX_DP(obj); XlnxDPState *s = XLNX_DP(obj);
......
...@@ -90,7 +90,7 @@ static TypeInfo ipmi_interface_type_info = { ...@@ -90,7 +90,7 @@ static TypeInfo ipmi_interface_type_info = {
.class_init = ipmi_interface_class_init, .class_init = ipmi_interface_class_init,
}; };
static void isa_ipmi_bmc_check(Object *obj, const char *name, static void isa_ipmi_bmc_check(const Object *obj, const char *name,
Object *val, Error **errp) Object *val, Error **errp)
{ {
IPMIBmc *bmc = IPMI_BMC(val); IPMIBmc *bmc = IPMI_BMC(val);
......
...@@ -367,7 +367,7 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name, ...@@ -367,7 +367,7 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
visit_type_uint64(v, name, &value, errp); visit_type_uint64(v, name, &value, errp);
} }
static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name, static void pc_dimm_check_memdev_is_busy(const Object *obj, const char *name,
Object *val, Error **errp) Object *val, Error **errp)
{ {
Error *local_err = NULL; Error *local_err = NULL;
......
...@@ -1009,7 +1009,7 @@ static const TypeInfo ivshmem_common_info = { ...@@ -1009,7 +1009,7 @@ static const TypeInfo ivshmem_common_info = {
.class_init = ivshmem_common_class_init, .class_init = ivshmem_common_class_init,
}; };
static void ivshmem_check_memdev_is_busy(Object *obj, const char *name, static void ivshmem_check_memdev_is_busy(const Object *obj, const char *name,
Object *val, Error **errp) Object *val, Error **errp)
{ {
if (host_memory_backend_is_mapped(MEMORY_BACKEND(val))) { if (host_memory_backend_is_mapped(MEMORY_BACKEND(val))) {
......
...@@ -889,7 +889,7 @@ static void virtio_crypto_class_init(ObjectClass *klass, void *data) ...@@ -889,7 +889,7 @@ static void virtio_crypto_class_init(ObjectClass *klass, void *data)
} }
static void static void
virtio_crypto_check_cryptodev_is_used(Object *obj, const char *name, virtio_crypto_check_cryptodev_is_used(const Object *obj, const char *name,
Object *val, Error **errp) Object *val, Error **errp)
{ {
if (cryptodev_backend_is_used(CRYPTODEV_BACKEND(val))) { if (cryptodev_backend_is_used(CRYPTODEV_BACKEND(val))) {
......
...@@ -272,7 +272,8 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name, ...@@ -272,7 +272,8 @@ void qdev_prop_set_after_realize(DeviceState *dev, const char *name,
* This function should be used as the check() argument to * This function should be used as the check() argument to
* object_property_add_link(). * object_property_add_link().
*/ */
void qdev_prop_allow_set_link_before_realize(Object *obj, const char *name, void qdev_prop_allow_set_link_before_realize(const Object *obj,
const char *name,
Object *val, Error **errp); Object *val, Error **errp);
#endif #endif
...@@ -764,7 +764,7 @@ ObjectClass *object_get_class(Object *obj); ...@@ -764,7 +764,7 @@ ObjectClass *object_get_class(Object *obj);
* *
* Returns: The QOM typename of @obj. * Returns: The QOM typename of @obj.
*/ */
const char *object_get_typename(Object *obj); const char *object_get_typename(const Object *obj);
/** /**
* type_register_static: * type_register_static:
...@@ -1319,7 +1319,7 @@ typedef enum { ...@@ -1319,7 +1319,7 @@ typedef enum {
* callback function. It allows the link property to be set and never returns * callback function. It allows the link property to be set and never returns
* an error. * an error.
*/ */
void object_property_allow_set_link(Object *, const char *, void object_property_allow_set_link(const Object *, const char *,
Object *, Error **); Object *, Error **);
/** /**
...@@ -1352,7 +1352,7 @@ void object_property_allow_set_link(Object *, const char *, ...@@ -1352,7 +1352,7 @@ void object_property_allow_set_link(Object *, const char *,
*/ */
void object_property_add_link(Object *obj, const char *name, void object_property_add_link(Object *obj, const char *name,
const char *type, Object **child, const char *type, Object **child,
void (*check)(Object *obj, const char *name, void (*check)(const Object *obj, const char *name,
Object *val, Error **errp), Object *val, Error **errp),
ObjectPropertyLinkFlags flags, ObjectPropertyLinkFlags flags,
Error **errp); Error **errp);
......
...@@ -740,7 +740,7 @@ out: ...@@ -740,7 +740,7 @@ out:
return ret; return ret;
} }
const char *object_get_typename(Object *obj) const char *object_get_typename(const Object *obj)
{ {
return obj->class->type->name; return obj->class->type->name;
} }
...@@ -1428,7 +1428,7 @@ out: ...@@ -1428,7 +1428,7 @@ out:
g_free(type); g_free(type);
} }
void object_property_allow_set_link(Object *obj, const char *name, void object_property_allow_set_link(const Object *obj, const char *name,
Object *val, Error **errp) Object *val, Error **errp)
{ {
/* Allow the link to be set, always */ /* Allow the link to be set, always */
...@@ -1436,7 +1436,7 @@ void object_property_allow_set_link(Object *obj, const char *name, ...@@ -1436,7 +1436,7 @@ void object_property_allow_set_link(Object *obj, const char *name,
typedef struct { typedef struct {
Object **child; Object **child;
void (*check)(Object *, const char *, Object *, Error **); void (*check)(const Object *, const char *, Object *, Error **);
ObjectPropertyLinkFlags flags; ObjectPropertyLinkFlags flags;
} LinkProperty; } LinkProperty;
...@@ -1552,7 +1552,7 @@ static void object_release_link_property(Object *obj, const char *name, ...@@ -1552,7 +1552,7 @@ static void object_release_link_property(Object *obj, const char *name,
void object_property_add_link(Object *obj, const char *name, void object_property_add_link(Object *obj, const char *name,
const char *type, Object **child, const char *type, Object **child,
void (*check)(Object *, const char *, void (*check)(const Object *, const char *,
Object *, Error **), Object *, Error **),
ObjectPropertyLinkFlags flags, ObjectPropertyLinkFlags flags,
Error **errp) Error **errp)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册