[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RESEND PATCH v2 1/2] xc/tmem: Free temporary buffer used during migration
From: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> CID 1090388. Within the loop reading the pool_id we set the buf: if ( (buf = realloc(buf,bufsize)) == NULL ) and then continue on using it without freeing. Worst yet there are multiple 'if (..) return -1' which do not free the buffer. As such insert a 'fail' goto label to free the buffer and also add on the OK path a mechanism to free the buffer. Replace all of the 'return -1' with a jump to the failed label. v2: * Remove superfluous braces. (Andrew) Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Signed-off-by: Bob Liu <bob.liu@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- tools/libxc/xc_tmem.c | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/tools/libxc/xc_tmem.c b/tools/libxc/xc_tmem.c index 3261e10..6832bbe 100644 --- a/tools/libxc/xc_tmem.c +++ b/tools/libxc/xc_tmem.c @@ -215,6 +215,7 @@ int xc_tmem_save(xc_interface *xch, uint32_t pool_id; uint32_t minusone = -1; struct tmem_handle *h; + char *buf = NULL; if ( xc_tmem_control(xch,0,TMEMC_SAVE_BEGIN,dom,live,0,0,NULL) <= 0 ) return 0; @@ -249,7 +250,6 @@ int xc_tmem_save(xc_interface *xch, uint64_t uuid[2]; uint32_t n_pages; uint32_t pagesize; - char *buf = NULL; int bufsize = 0; int checksum = 0; @@ -263,13 +263,13 @@ int xc_tmem_save(xc_interface *xch, n_pages = 0; (void)xc_tmem_control(xch,i,TMEMC_SAVE_GET_POOL_UUID,dom,sizeof(uuid),0,0,&uuid); if ( write_exact(io_fd, &pool_id, sizeof(pool_id)) ) - return -1; + goto failed; if ( write_exact(io_fd, &flags, sizeof(flags)) ) - return -1; + goto failed; if ( write_exact(io_fd, &n_pages, sizeof(n_pages)) ) - return -1; + goto failed; if ( write_exact(io_fd, &uuid, sizeof(uuid)) ) - return -1; + goto failed; if ( n_pages == 0 ) continue; @@ -279,7 +279,7 @@ int xc_tmem_save(xc_interface *xch, { bufsize = pagesize + sizeof(struct tmem_handle); if ( (buf = realloc(buf,bufsize)) == NULL ) - return -1; + goto failed; } for ( j = n_pages; j > 0; j-- ) { @@ -290,13 +290,13 @@ int xc_tmem_save(xc_interface *xch, { h = (struct tmem_handle *)buf; if ( write_exact(io_fd, &h->oid, sizeof(h->oid)) ) - return -1; + goto failed; if ( write_exact(io_fd, &h->index, sizeof(h->index)) ) - return -1; + goto failed; h++; checksum += *(char *)h; if ( write_exact(io_fd, h, pagesize) ) - return -1; + goto failed; } else if ( ret == 0 ) { continue; } else { @@ -304,7 +304,7 @@ int xc_tmem_save(xc_interface *xch, h = (struct tmem_handle *)buf; h->oid[0] = h->oid[1] = h->oid[2] = -1L; if ( write_exact(io_fd, &h->oid, sizeof(h->oid)) ) - return -1; + goto failed; break; } } @@ -315,9 +315,13 @@ int xc_tmem_save(xc_interface *xch, /* pool list terminator */ minusone = -1; if ( write_exact(io_fd, &minusone, sizeof(minusone)) ) - return -1; + goto failed; + free(buf); return 1; +failed: + free(buf); + return -1; } /* only called for live migration */ @@ -386,6 +390,7 @@ int xc_tmem_restore(xc_interface *xch, int dom, int io_fd) uint32_t minusone; uint32_t weight, cap, flags; int checksum = 0; + char *buf = NULL; save_version = xc_tmem_control(xch,0,TMEMC_SAVE_GET_VERSION,dom,0,0,0,NULL); if ( save_version == -1 ) @@ -423,7 +428,6 @@ int xc_tmem_restore(xc_interface *xch, int dom, int io_fd) { uint64_t uuid[2]; uint32_t n_pages; - char *buf = NULL; int bufsize = 0, pagesize; int j; @@ -445,7 +449,7 @@ int xc_tmem_restore(xc_interface *xch, int dom, int io_fd) { bufsize = pagesize; if ( (buf = realloc(buf,bufsize)) == NULL ) - return -1; + goto failed; } for ( j = n_pages; j > 0; j-- ) { @@ -453,20 +457,20 @@ int xc_tmem_restore(xc_interface *xch, int dom, int io_fd) uint32_t index; int rc; if ( read_exact(io_fd, &oid, sizeof(oid)) ) - return -1; + goto failed; if ( oid.oid[0] == -1L && oid.oid[1] == -1L && oid.oid[2] == -1L ) break; if ( read_exact(io_fd, &index, sizeof(index)) ) - return -1; + goto failed; if ( read_exact(io_fd, buf, pagesize) ) - return -1; + goto failed; checksum += *buf; if ( (rc = xc_tmem_control_oid(xch, pool_id, TMEMC_RESTORE_PUT_PAGE, dom, bufsize, index, oid, buf)) <= 0 ) { DPRINTF("xc_tmem_restore: putting page failed, rc=%d\n",rc); - return -1; + goto failed; } } if ( n_pages ) @@ -474,9 +478,13 @@ int xc_tmem_restore(xc_interface *xch, int dom, int io_fd) n_pages-j,dom,pool_id,checksum); } if ( pool_id != -1 ) - return -1; + goto failed; + free(buf); return 0; +failed: + free(buf); + return -1; } /* only called for live migration, must be called after suspend */ -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |