diff --git a/src/conf/virchrdev.c b/src/conf/virchrdev.c index 1802324a77..9c886e4024 100644 --- a/src/conf/virchrdev.c +++ b/src/conf/virchrdev.c @@ -342,6 +342,8 @@ int virChrdevOpen(virChrdevsPtr devs, virStreamPtr savedStream; const char *path; int ret; + bool added = false; + virErrorPtr savedError; switch (source->type) { case VIR_DOMAIN_CHR_TYPE_PTY: @@ -398,6 +400,7 @@ int virChrdevOpen(virChrdevsPtr devs, if (virHashAddEntry(devs->hash, path, st) < 0) goto error; + added = true; cbdata->devs = devs; if (!(cbdata->path = strdup(path))) { @@ -432,8 +435,16 @@ int virChrdevOpen(virChrdevsPtr devs, return 0; error: - virStreamFree(st); - virHashRemoveEntry(devs->hash, path); + savedError = virSaveLastError(); + + if (added) + virHashRemoveEntry(devs->hash, path); + else + virStreamFree(st); + + virSetError(savedError); + virFreeError(savedError); + if (cbdata) VIR_FREE(cbdata->path); VIR_FREE(cbdata);