mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 19:41:16 +00:00
virconf: Make virConfSetValue() clear consumed pointer
The way that virConfSetValue() works (and the way it is even documented) is that the @value pointer is always consumed. However, since the first order pointer is passed it leaves callers in a pickle situation - they always have to set pointer to NULL after calling virConfSetValue() to avoid touching it. Let's switch @value to a double pointer and clear it inside the function. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
94ce37c8e2
commit
17c324bd25
@ -259,7 +259,7 @@ xenConfigSetInt(virConf *conf, const char *setting, long long l)
|
|||||||
value->next = NULL;
|
value->next = NULL;
|
||||||
value->l = l;
|
value->l = l;
|
||||||
|
|
||||||
return virConfSetValue(conf, setting, value);
|
return virConfSetValue(conf, setting, &value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -274,7 +274,7 @@ xenConfigSetString(virConf *conf, const char *setting, const char *str)
|
|||||||
value->next = NULL;
|
value->next = NULL;
|
||||||
value->str = g_strdup(str);
|
value->str = g_strdup(str);
|
||||||
|
|
||||||
return virConfSetValue(conf, setting, value);
|
return virConfSetValue(conf, setting, &value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1788,12 +1788,9 @@ xenFormatPCI(virConf *conf, virDomainDef *def)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pciVal->list != NULL) {
|
if (pciVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "pci", pciVal);
|
virConfSetValue(conf, "pci", &pciVal) < 0)
|
||||||
pciVal = NULL;
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2000,13 +1997,9 @@ xenFormatCharDev(virConf *conf, virDomainDef *def,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serialVal->list != NULL) {
|
if (serialVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "serial", serialVal);
|
virConfSetValue(conf, "serial", &serialVal) < 0)
|
||||||
|
return -1;
|
||||||
serialVal = NULL;
|
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (xenConfigSetString(conf, "serial", "none") < 0)
|
if (xenConfigSetString(conf, "serial", "none") < 0)
|
||||||
@ -2264,11 +2257,8 @@ xenFormatVfb(virConf *conf, virDomainDef *def)
|
|||||||
vfb->type = VIR_CONF_LIST;
|
vfb->type = VIR_CONF_LIST;
|
||||||
vfb->list = g_steal_pointer(&disp);
|
vfb->list = g_steal_pointer(&disp);
|
||||||
|
|
||||||
if (virConfSetValue(conf, "vfb", vfb) < 0) {
|
if (virConfSetValue(conf, "vfb", &vfb) < 0)
|
||||||
vfb = NULL;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
vfb = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2326,12 +2316,9 @@ xenFormatVif(virConf *conf,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (netVal->list != NULL) {
|
if (netVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "vif", netVal);
|
virConfSetValue(conf, "vif", &netVal) < 0)
|
||||||
netVal = NULL;
|
goto cleanup;
|
||||||
if (ret < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1447,12 +1447,9 @@ xenFormatXLDomainVnuma(virConf *conf,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vnumaVal->list != NULL) {
|
if (vnumaVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "vnuma", vnumaVal);
|
virConfSetValue(conf, "vnuma", &vnumaVal) < 0)
|
||||||
vnumaVal = NULL;
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1697,12 +1694,9 @@ xenFormatXLDomainDisks(virConf *conf, virDomainDef *def)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diskVal->list != NULL) {
|
if (diskVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "disk", diskVal);
|
virConfSetValue(conf, "disk", &diskVal) < 0)
|
||||||
diskVal = NULL;
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1848,11 +1842,8 @@ xenFormatXLInputDevs(virConf *conf, virDomainDef *def)
|
|||||||
if (xenConfigSetString(conf, "usbdevice", usbdevices->list->str) < 0)
|
if (xenConfigSetString(conf, "usbdevice", usbdevices->list->str) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
} else {
|
} else {
|
||||||
if (virConfSetValue(conf, "usbdevice", usbdevices) < 0) {
|
if (virConfSetValue(conf, "usbdevice", &usbdevices) < 0)
|
||||||
usbdevices = NULL;
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
|
||||||
usbdevices = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1923,12 +1914,9 @@ xenFormatXLUSBController(virConf *conf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usbctrlVal->list != NULL) {
|
if (usbctrlVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "usbctrl", usbctrlVal);
|
virConfSetValue(conf, "usbctrl", &usbctrlVal) < 0)
|
||||||
usbctrlVal = NULL;
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1985,12 +1973,9 @@ xenFormatXLUSB(virConf *conf,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usbVal->list != NULL) {
|
if (usbVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "usbdev", usbVal);
|
virConfSetValue(conf, "usbdev", &usbVal) < 0)
|
||||||
usbVal = NULL;
|
return -1;
|
||||||
if (ret < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -2057,12 +2042,9 @@ xenFormatXLDomainChannels(virConf *conf, virDomainDef *def)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channelVal->list != NULL) {
|
if (channelVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "channel", channelVal);
|
virConfSetValue(conf, "channel", &channelVal) < 0)
|
||||||
channelVal = NULL;
|
goto cleanup;
|
||||||
if (ret < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -2105,13 +2087,9 @@ xenFormatXLDomainNamespaceData(virConf *conf, virDomainDef *def)
|
|||||||
args->list = val;
|
args->list = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args->list != NULL) {
|
if (args->list != NULL &&
|
||||||
if (virConfSetValue(conf, "device_model_args", args) < 0) {
|
virConfSetValue(conf, "device_model_args", &args) < 0)
|
||||||
args = NULL;
|
goto error;
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
args = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -356,12 +356,9 @@ xenFormatXMDisks(virConf *conf, virDomainDef *def)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diskVal->list != NULL) {
|
if (diskVal->list != NULL &&
|
||||||
int ret = virConfSetValue(conf, "disk", diskVal);
|
virConfSetValue(conf, "disk", &diskVal) < 0)
|
||||||
diskVal = NULL;
|
goto cleanup;
|
||||||
if (ret < 0)
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1323,16 +1323,22 @@ int virConfGetValueULLong(virConf *conf,
|
|||||||
int
|
int
|
||||||
virConfSetValue(virConf *conf,
|
virConfSetValue(virConf *conf,
|
||||||
const char *setting,
|
const char *setting,
|
||||||
virConfValue *value)
|
virConfValue **value)
|
||||||
{
|
{
|
||||||
virConfEntry *cur;
|
virConfEntry *cur;
|
||||||
virConfEntry *prev = NULL;
|
virConfEntry *prev = NULL;
|
||||||
|
|
||||||
if (value && value->type == VIR_CONF_STRING && value->str == NULL) {
|
if (!value) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("invalid use of conf API"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*value && (*value)->type == VIR_CONF_STRING && !(*value)->str) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("expecting a value for value of type %s"),
|
_("expecting a value for value of type %s"),
|
||||||
virConfTypeToString(VIR_CONF_STRING));
|
virConfTypeToString(VIR_CONF_STRING));
|
||||||
virConfFreeValue(value);
|
g_clear_pointer(value, virConfFreeValue);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1348,7 +1354,7 @@ virConfSetValue(virConf *conf,
|
|||||||
cur = g_new0(virConfEntry, 1);
|
cur = g_new0(virConfEntry, 1);
|
||||||
cur->comment = NULL;
|
cur->comment = NULL;
|
||||||
cur->name = g_strdup(setting);
|
cur->name = g_strdup(setting);
|
||||||
cur->value = value;
|
cur->value = g_steal_pointer(value);
|
||||||
if (prev) {
|
if (prev) {
|
||||||
cur->next = prev->next;
|
cur->next = prev->next;
|
||||||
prev->next = cur;
|
prev->next = cur;
|
||||||
@ -1358,7 +1364,7 @@ virConfSetValue(virConf *conf,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
virConfFreeValue(cur->value);
|
virConfFreeValue(cur->value);
|
||||||
cur->value = value;
|
cur->value = g_steal_pointer(value);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ int virConfGetValueULLong(virConf *conf,
|
|||||||
|
|
||||||
int virConfSetValue(virConf *conf,
|
int virConfSetValue(virConf *conf,
|
||||||
const char *setting,
|
const char *setting,
|
||||||
virConfValue *value);
|
virConfValue **value);
|
||||||
int virConfWalk(virConf *conf,
|
int virConfWalk(virConf *conf,
|
||||||
virConfWalkCallback callback,
|
virConfWalkCallback callback,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
Loading…
Reference in New Issue
Block a user