diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2011-02-17 19:12:45 +0000 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2011-02-17 19:12:45 +0000 |
commit | 8f4208be5d25c6ed5773aa1bb23256764b941a17 (patch) | |
tree | 80cf6dd6131c44b6726d7205c1b3609a0929737c | |
parent | d25ba26a9a36065fccd36db82da46d87c2b86ec8 (diff) | |
download | xen-8f4208be5d25c6ed5773aa1bb23256764b941a17.tar.gz xen-8f4208be5d25c6ed5773aa1bb23256764b941a17.tar.bz2 xen-8f4208be5d25c6ed5773aa1bb23256764b941a17.zip |
xl daemon: fix some memory leaks
If we are watching multiple disks we have to free multiple waiters.
Free the event before continuing the loop.
Destroy the disk device returned by libxl_event_get_disk_eject_info.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
-rw-r--r-- | tools/libxl/xl_cmdimpl.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 0f980d99d5..32306de1c0 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1334,7 +1334,7 @@ static int create_domain(struct domain_create *dom_info) const char *restore_file = dom_info->restore_file; int migrate_fd = dom_info->migrate_fd; - int fd; + int fd, i; int need_daemon = 1; int ret, rc; libxl_waiter *w1 = NULL, *w2 = NULL; @@ -1603,7 +1603,10 @@ start: case LIBXL_EVENT_DOMAIN_DEATH: ret = libxl_event_get_domain_death_info(&ctx, domid, &event, &info); - if (ret < 0) continue; + if (ret < 0) { + libxl_free_event(&event); + continue; + } LOG("Domain %d is dead", domid); @@ -1619,7 +1622,8 @@ start: /* Otherwise fall through and restart. */ case 1: - libxl_free_waiter(w1); + for (i = 0; i < d_config.num_disks; i++) + libxl_free_waiter(&w1[i]); libxl_free_waiter(w2); free(w1); free(w2); @@ -1655,8 +1659,10 @@ start: } break; case LIBXL_EVENT_DISK_EJECT: - if (libxl_event_get_disk_eject_info(&ctx, domid, &event, &disk)) + if (libxl_event_get_disk_eject_info(&ctx, domid, &event, &disk)) { libxl_cdrom_insert(&ctx, domid, &disk); + libxl_device_disk_destroy(&disk); + } break; } libxl_free_event(&event); |