Andrew Cooper
2013-Mar-07 16:20 UTC
[PATCH v2] tools/xenconsoled: Initialise pointers before trying to use them
This is a regression introduced by "Switch from select() to poll() in xenconsoled''s IO loop." hg c/s 26405:7359c3122c5d git cc5434c933153c4b8812d1df901f8915c22830a8 which results in reliable segfaults during VM power operations. Switch to calloc(3) in an effort to avoid similar problems with changes in the future. Signed-off-by: Marcus Granado <marcus.granado@citrix.com> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> --- Changes since v1: * Switch to calloc(3) instead of malloc, and remove redundant assignments These segfaults are 100% reproducible in a XenServer system when rebooting a PV domain. I am at a loss to explain why the OSS testing has not picked them up. diff -r 94ece33caae2 -r b901a81f4f47 tools/console/daemon/io.c --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -651,7 +651,7 @@ static struct domain *create_domain(int return NULL; } - dom = (struct domain *)malloc(sizeof(struct domain)); + dom = calloc(1, sizeof *dom); if (dom == NULL) { dolog(LOG_ERR, "Out of memory %s:%s():L%d", __FILE__, __FUNCTION__, __LINE__); @@ -672,21 +672,11 @@ static struct domain *create_domain(int dom->slave_fd = -1; dom->log_fd = -1; - dom->is_dead = false; - dom->buffer.data = 0; - dom->buffer.consumed = 0; - dom->buffer.size = 0; - dom->buffer.capacity = 0; - dom->buffer.max_capacity = 0; - dom->event_count = 0; dom->next_period = ((long long)ts.tv_sec * 1000) + (ts.tv_nsec / 1000000) + RATE_LIMIT_PERIOD; - dom->next = NULL; dom->ring_ref = -1; dom->local_port = -1; dom->remote_port = -1; - dom->interface = NULL; - dom->xce_handle = NULL; if (!watch_domain(dom, true)) goto out;