mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 19:32:19 +00:00
nwfilter: Fix potential locking problems on ObjLoad failure
In virNWFilterObjLoad we can still fail after virNWFilterObjAssignDef, but we don't unlock and free the created virNWFilterObjPtr in the cleanup path. The bit we are trying to do after AssignDef is just STRDUP in the configFile path. However caching the configFile in the NWFilterObj is largely redundant and doesn't follow the same pattern we use for domain and network objects. So just remove all the configFile caching which fixes the latent bug as a side effect.
This commit is contained in:
parent
26af7e4e93
commit
ab05abdbc3
@ -353,8 +353,6 @@ virNWFilterObjFree(virNWFilterObjPtr obj)
|
|||||||
virNWFilterDefFree(obj->def);
|
virNWFilterDefFree(obj->def);
|
||||||
virNWFilterDefFree(obj->newDef);
|
virNWFilterDefFree(obj->newDef);
|
||||||
|
|
||||||
VIR_FREE(obj->configFile);
|
|
||||||
|
|
||||||
virMutexDestroy(&obj->lock);
|
virMutexDestroy(&obj->lock);
|
||||||
|
|
||||||
VIR_FREE(obj);
|
VIR_FREE(obj);
|
||||||
@ -3181,12 +3179,6 @@ virNWFilterObjLoad(virNWFilterObjListPtr nwfilters,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
VIR_FREE(nwfilter->configFile); /* for driver reload */
|
|
||||||
if (VIR_STRDUP(nwfilter->configFile, path) < 0) {
|
|
||||||
virNWFilterDefFree(def);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nwfilter;
|
return nwfilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3234,60 +3226,66 @@ virNWFilterLoadAllConfigs(virNWFilterObjListPtr nwfilters,
|
|||||||
|
|
||||||
int
|
int
|
||||||
virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
|
virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
|
||||||
virNWFilterObjPtr nwfilter,
|
|
||||||
virNWFilterDefPtr def)
|
virNWFilterDefPtr def)
|
||||||
{
|
{
|
||||||
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
||||||
char *xml;
|
char *xml;
|
||||||
int ret;
|
int ret = -1;
|
||||||
|
char *configFile = NULL;
|
||||||
|
|
||||||
if (!nwfilter->configFile) {
|
if (virFileMakePath(driver->configDir) < 0) {
|
||||||
if (virFileMakePath(driver->configDir) < 0) {
|
virReportSystemError(errno,
|
||||||
virReportSystemError(errno,
|
_("cannot create config directory %s"),
|
||||||
_("cannot create config directory %s"),
|
driver->configDir);
|
||||||
driver->configDir);
|
goto error;
|
||||||
return -1;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!(nwfilter->configFile = virFileBuildPath(driver->configDir,
|
if (!(configFile = virFileBuildPath(driver->configDir,
|
||||||
def->name, ".xml"))) {
|
def->name, ".xml"))) {
|
||||||
return -1;
|
goto error;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(xml = virNWFilterDefFormat(def))) {
|
if (!(xml = virNWFilterDefFormat(def))) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("failed to generate XML"));
|
"%s", _("failed to generate XML"));
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
virUUIDFormat(def->uuid, uuidstr);
|
virUUIDFormat(def->uuid, uuidstr);
|
||||||
ret = virXMLSaveFile(nwfilter->configFile,
|
ret = virXMLSaveFile(configFile,
|
||||||
virXMLPickShellSafeComment(def->name, uuidstr),
|
virXMLPickShellSafeComment(def->name, uuidstr),
|
||||||
"nwfilter-edit", xml);
|
"nwfilter-edit", xml);
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(configFile);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
virNWFilterObjDeleteDef(virNWFilterObjPtr nwfilter)
|
virNWFilterObjDeleteDef(const char *configDir,
|
||||||
|
virNWFilterObjPtr nwfilter)
|
||||||
{
|
{
|
||||||
if (!nwfilter->configFile) {
|
int ret = -1;
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
char *configFile = NULL;
|
||||||
_("no config file for %s"), nwfilter->def->name);
|
|
||||||
return -1;
|
if (!(configFile = virFileBuildPath(configDir,
|
||||||
|
nwfilter->def->name, ".xml"))) {
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlink(nwfilter->configFile) < 0) {
|
if (unlink(configFile) < 0) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("cannot remove config for %s"),
|
_("cannot remove config for %s"),
|
||||||
nwfilter->def->name);
|
nwfilter->def->name);
|
||||||
return -1;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
ret = 0;
|
||||||
|
error:
|
||||||
|
VIR_FREE(configFile);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -551,7 +551,6 @@ typedef virNWFilterObj *virNWFilterObjPtr;
|
|||||||
struct _virNWFilterObj {
|
struct _virNWFilterObj {
|
||||||
virMutex lock;
|
virMutex lock;
|
||||||
|
|
||||||
char *configFile;
|
|
||||||
int active;
|
int active;
|
||||||
int wantRemoved;
|
int wantRemoved;
|
||||||
|
|
||||||
@ -612,10 +611,10 @@ virNWFilterObjPtr virNWFilterObjFindByName(virNWFilterObjListPtr nwfilters,
|
|||||||
|
|
||||||
|
|
||||||
int virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
|
int virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
|
||||||
virNWFilterObjPtr nwfilter,
|
|
||||||
virNWFilterDefPtr def);
|
virNWFilterDefPtr def);
|
||||||
|
|
||||||
int virNWFilterObjDeleteDef(virNWFilterObjPtr nwfilter);
|
int virNWFilterObjDeleteDef(const char *configDir,
|
||||||
|
virNWFilterObjPtr nwfilter);
|
||||||
|
|
||||||
virNWFilterObjPtr virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters,
|
virNWFilterObjPtr virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters,
|
||||||
virNWFilterDefPtr def);
|
virNWFilterDefPtr def);
|
||||||
|
@ -554,7 +554,7 @@ nwfilterDefineXML(virConnectPtr conn,
|
|||||||
if (!(nwfilter = virNWFilterObjAssignDef(&driver->nwfilters, def)))
|
if (!(nwfilter = virNWFilterObjAssignDef(&driver->nwfilters, def)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (virNWFilterObjSaveDef(driver, nwfilter, def) < 0) {
|
if (virNWFilterObjSaveDef(driver, def) < 0) {
|
||||||
virNWFilterObjRemove(&driver->nwfilters, nwfilter);
|
virNWFilterObjRemove(&driver->nwfilters, nwfilter);
|
||||||
def = NULL;
|
def = NULL;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -602,11 +602,9 @@ nwfilterUndefine(virNWFilterPtr obj)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virNWFilterObjDeleteDef(nwfilter) < 0)
|
if (virNWFilterObjDeleteDef(driver->configDir, nwfilter) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
VIR_FREE(nwfilter->configFile);
|
|
||||||
|
|
||||||
virNWFilterObjRemove(&driver->nwfilters, nwfilter);
|
virNWFilterObjRemove(&driver->nwfilters, nwfilter);
|
||||||
nwfilter = NULL;
|
nwfilter = NULL;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user