mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
xenstored: fix use-after free bug
Problem: Handling requests for one connection can not only zap the connection itself, due to socket disconnects for example. It can also zap *other* connections, due to domain release requests. Especially it can zap the connection we have saved a pointer to in the "next" variable. From: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
This commit is contained in:
1 parent
a81c662925
commit
1622101b19
1 file changed
+4
-2
@@ -1937,14 +1937,17 @@ int main(int argc, char *argv[])
|
||||
handle_event();
|
||||
|
||||
next = list_entry(connections.next, typeof(*conn), list);
|
||||
if (&next->list != &connections)
|
||||
talloc_increase_ref_count(next);
|
||||
while (&next->list != &connections) {
|
||||
conn = next;
|
||||
|
||||
next = list_entry(conn->list.next,
|
||||
typeof(*conn), list);
|
||||
if (&next->list != &connections)
|
||||
talloc_increase_ref_count(next);
|
||||
|
||||
if (conn->domain) {
|
||||
talloc_increase_ref_count(conn);
|
||||
if (domain_can_read(conn))
|
||||
handle_input(conn);
|
||||
if (talloc_free(conn) == 0)
|
||||
@@ -1957,7 +1960,6 @@ int main(int argc, char *argv[])
|
||||
if (talloc_free(conn) == 0)
|
||||
continue;
|
||||
} else {
|
||||
talloc_increase_ref_count(conn);
|
||||
if (FD_ISSET(conn->fd, &inset))
|
||||
handle_input(conn);
|
||||
if (talloc_free(conn) == 0)
|
||||
|
||||