提交 26ceca4b 编写于 作者: E Eric Blake 提交者: Cole Robinson

fdstream: avoid double close bug

Wen Congyang reported that we have a double-close bug if we fail
virFDStreamOpenInternal, since childfd duplicated one of the fds[]
array contents.  In truth, since we always transfer both members
of fds to other variables, we should close the fds through those
other names, and just use fds[] for pipe().

Bug present since 0.9.0 (commit e886237a).

* src/fdstream.c (virFDStreamOpenFileInternal): Swap scope of
childfd and fds[], to avoid a double close.
(cherry picked from commit f3cfc7c8)
上级 1a6bad71
......@@ -573,7 +573,7 @@ virFDStreamOpenFileInternal(virStreamPtr st,
int mode)
{
int fd = -1;
int fds[2] = { -1, -1 };
int childfd = -1;
struct stat sb;
virCommandPtr cmd = NULL;
int errfd = -1;
......@@ -615,7 +615,7 @@ virFDStreamOpenFileInternal(virStreamPtr st,
if ((st->flags & VIR_STREAM_NONBLOCK) &&
(!S_ISCHR(sb.st_mode) &&
!S_ISFIFO(sb.st_mode))) {
int childfd;
int fds[2] = { -1, -1 };
if ((oflags & O_ACCMODE) == O_RDWR) {
streamsReportError(VIR_ERR_INTERNAL_ERROR,
......@@ -661,9 +661,8 @@ virFDStreamOpenFileInternal(virStreamPtr st,
error:
virCommandFree(cmd);
VIR_FORCE_CLOSE(fds[0]);
VIR_FORCE_CLOSE(fds[1]);
VIR_FORCE_CLOSE(fd);
VIR_FORCE_CLOSE(childfd);
VIR_FORCE_CLOSE(errfd);
if (oflags & O_CREAT)
unlink(path);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册