tools/libxl: Avoid overrunning static buffer with prefixdata

An individual datacopier_buf contains a static buffer of 1000 bytes.
Attempting to add prefixdata of more than 1000 bytes would overrun the buffer
and cause heap corruption.

Instead, split the prefixdata and chain together multiple datacopier buffers.
This allows for an arbitrary quantity of prefixdata to be added to a
datacopier.

Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
CC: Ian Campbell <Ian.Campbell@citrix.com>
CC: Ian Jackson <Ian.Jackson@eu.citrix.com>
CC: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Ross Lagerwall authored and Ian Campbell committed 2015-03-18 11:31:57 +00:00
1 parent 42ad92e656
commit 8aaeef92c9
1 file changed
+9 -5
+9 -5
View File
@@ -160,6 +160,8 @@ void libxl__datacopier_prefixdata(libxl__egc *egc, libxl__datacopier_state *dc,
{
EGC_GC;
libxl__datacopier_buf *buf;
const uint8_t *ptr;
/*
* It is safe for this to be called immediately after _start, as
* is documented in the public comment. _start's caller must have
@@ -170,12 +172,14 @@ void libxl__datacopier_prefixdata(libxl__egc *egc, libxl__datacopier_state *dc,
assert(len < dc->maxsz - dc->used);
buf = libxl__zalloc(NOGC, sizeof(*buf));
buf->used = len;
memcpy(buf->buf, data, len);
for (ptr = data; len; len -= buf->used, ptr += buf->used) {
buf = libxl__malloc(NOGC, sizeof(*buf));
buf->used = min(len, sizeof(buf->buf));
memcpy(buf->buf, ptr, buf->used);
dc->used += len;
LIBXL_TAILQ_INSERT_TAIL(&dc->bufs, buf, entry);
dc->used += buf->used;
LIBXL_TAILQ_INSERT_TAIL(&dc->bufs, buf, entry);
}
}
static int datacopier_pollhup_handled(libxl__egc *egc,
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.