Don't free the stream on error if we've successfully added it
to the hash table, since it will be freed by virChrdevHashEntryFree
callback.
Preserve the error message before calling virStreamFree, since it
resets the error.
Introduced by
4716138, crashing since
6921892.
Reported by Sergey Fionov on libvir-list.
(cherry picked from commit
a32b41746c4e1a44fb998a93da99c72f6586b359)
virStreamPtr savedStream;
const char *path;
int ret;
+ bool added = false;
+ virErrorPtr savedError;
switch (source->type) {
case VIR_DOMAIN_CHR_TYPE_PTY:
if (virHashAddEntry(devs->hash, path, st) < 0)
goto error;
+ added = true;
cbdata->devs = devs;
if (!(cbdata->path = strdup(path))) {
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);