diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2014-08-17 11:45:17 +0200 |
---|---|---|
committer | Luiz Capitulino <lcapitulino@redhat.com> | 2014-08-18 14:39:10 -0400 |
commit | b3dd1b8c295636e64ceb14cdc4db6420d7319e38 (patch) | |
tree | e8455dfc57b74258a99088394bf2c6ba9a57ed40 /monitor.c | |
parent | 2928207ac1bb2751a1554ea0f9a9641179f51488 (diff) |
monitor: fix use after free
The function monitor_fdset_dup_fd_find_remove() references member of
'mon_fdset' which - when remove flag is set - may be freed in function
monitor_fdset_cleanup().
remove is set by monitor_fdset_dup_fd_remove which in practice
does not need the returned value, so make it void,
and return -1 from monitor_fdset_dup_fd_find_remove.
Reported-by: zhanghailiang <zhang.zhanghailiang@huawei.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Diffstat (limited to 'monitor.c')
-rw-r--r-- | monitor.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -2542,8 +2542,10 @@ static int monitor_fdset_dup_fd_find_remove(int dup_fd, bool remove) if (QLIST_EMPTY(&mon_fdset->dup_fds)) { monitor_fdset_cleanup(mon_fdset); } + return -1; + } else { + return mon_fdset->id; } - return mon_fdset->id; } } } @@ -2555,9 +2557,9 @@ int monitor_fdset_dup_fd_find(int dup_fd) return monitor_fdset_dup_fd_find_remove(dup_fd, false); } -int monitor_fdset_dup_fd_remove(int dup_fd) +void monitor_fdset_dup_fd_remove(int dup_fd) { - return monitor_fdset_dup_fd_find_remove(dup_fd, true); + monitor_fdset_dup_fd_find_remove(dup_fd, true); } int monitor_handle_fd_param(Monitor *mon, const char *fdname) |