提交 34b999be 编写于 作者: E Eric Blake

stream: avoid use-after-free

virFDStreamClose used a mutex after it was freed, and failed
to destroy that mutex on its last use.

* src/fdstream.c (virFDStreamFree): Inline into sole caller...
(virFDStreamClose): ...to avoid use-after-free and leak.
Reported by Matthias Bolte.
上级 fbe3ab1a
......@@ -210,9 +210,20 @@ cleanup:
return ret;
}
static int virFDStreamFree(struct virFDStreamData *fdst)
static int
virFDStreamClose(virStreamPtr st)
{
struct virFDStreamData *fdst = st->privateData;
int ret;
VIR_DEBUG("st=%p", st);
if (!fdst)
return 0;
virMutexLock(&fdst->lock);
ret = VIR_CLOSE(fdst->fd);
if (fdst->cmd) {
char buf[1024];
......@@ -243,29 +254,12 @@ static int virFDStreamFree(struct virFDStreamData *fdst)
}
virCommandFree(fdst->cmd);
}
VIR_FREE(fdst);
return ret;
}
static int
virFDStreamClose(virStreamPtr st)
{
struct virFDStreamData *fdst = st->privateData;
int ret;
VIR_DEBUG("st=%p", st);
if (!fdst)
return 0;
virMutexLock(&fdst->lock);
ret = virFDStreamFree(fdst);
st->privateData = NULL;
virMutexUnlock(&fdst->lock);
virMutexDestroy(&fdst->lock);
VIR_FREE(fdst);
return ret;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册