|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v8 4/4] libs/guest: use Valgrind to detect various buffer overflows
Previously this was done as buffers were allocated separately.
Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx>
---
tools/libs/ctrl/xc_private.h | 8 ++++++++
tools/libs/guest/xg_sr_common.h | 8 ++++++++
tools/libs/guest/xg_sr_save.c | 12 ++++++++++++
3 files changed, 28 insertions(+)
diff --git a/tools/libs/ctrl/xc_private.h b/tools/libs/ctrl/xc_private.h
index 8a325c17b0..bef96521c3 100644
--- a/tools/libs/ctrl/xc_private.h
+++ b/tools/libs/ctrl/xc_private.h
@@ -45,8 +45,16 @@
#if defined(HAVE_VALGRIND_MEMCHECK_H) && !defined(NDEBUG) &&
!defined(__MINIOS__)
/* Compile in Valgrind client requests? */
#include <valgrind/memcheck.h>
+#define MEM_NOACCESS_BUFFER(name, size) uint8_t name[size];
+#define MEM_NOACCESS_INIT(field) \
+ VALGRIND_MAKE_MEM_NOACCESS(field, sizeof(field))
+#define MEM_UNDEFINED_INIT(field) \
+ VALGRIND_MAKE_MEM_UNDEFINED(field, sizeof(field))
#else
#define VALGRIND_MAKE_MEM_UNDEFINED(addr, len) /* addr, len */
+#define MEM_NOACCESS_BUFFER(name, size)
+#define MEM_NOACCESS_INIT(field) do {} while(0)
+#define MEM_UNDEFINED_INIT(field) do {} while(0)
#endif
#if defined(__MINIOS__)
diff --git a/tools/libs/guest/xg_sr_common.h b/tools/libs/guest/xg_sr_common.h
index c07c6db59e..d3fc7f363e 100644
--- a/tools/libs/guest/xg_sr_common.h
+++ b/tools/libs/guest/xg_sr_common.h
@@ -245,13 +245,21 @@ struct xc_sr_context
xc_hypercall_buffer_t dirty_bitmap_hbuf;
struct xc_sr_context_save_buffers
{
+ MEM_NOACCESS_BUFFER(na0, 16);
xen_pfn_t batch_pfns[MAX_BATCH_SIZE];
+ MEM_NOACCESS_BUFFER(na1, 16);
xen_pfn_t mfns[MAX_BATCH_SIZE];
+ MEM_NOACCESS_BUFFER(na2, 16);
xen_pfn_t types[MAX_BATCH_SIZE];
+ MEM_NOACCESS_BUFFER(na3, 16);
void *local_pages[MAX_BATCH_SIZE];
+ MEM_NOACCESS_BUFFER(na4, 16);
struct iovec iov[MAX_BATCH_SIZE + 2]; /* Headers + data. */
+ MEM_NOACCESS_BUFFER(na5, 16);
uint64_t rec_pfns[MAX_BATCH_SIZE];
+ MEM_NOACCESS_BUFFER(na6, 16);
int errors[MAX_BATCH_SIZE];
+ MEM_NOACCESS_BUFFER(na7, 16);
} *buffers;
} save;
diff --git a/tools/libs/guest/xg_sr_save.c b/tools/libs/guest/xg_sr_save.c
index 34e41cf410..c5022b2a1d 100644
--- a/tools/libs/guest/xg_sr_save.c
+++ b/tools/libs/guest/xg_sr_save.c
@@ -115,8 +115,10 @@ static int write_batch(struct xc_sr_context *ctx)
assert(ctx->save.buffers);
/* Mfns of the batch pfns. */
+ MEM_UNDEFINED_INIT(ctx->save.buffers->mfns);
mfns = ctx->save.buffers->mfns;
/* Types of the batch pfns. */
+ MEM_UNDEFINED_INIT(ctx->save.buffers->types);
types = ctx->save.buffers->types;
/* Errors from attempting to map the gfns. */
errors = ctx->save.buffers->errors;
@@ -124,8 +126,10 @@ static int write_batch(struct xc_sr_context *ctx)
local_pages = ctx->save.buffers->local_pages;
memset(local_pages, 0, sizeof(*local_pages) * nr_pfns);
/* iovec[] for writev(). */
+ MEM_UNDEFINED_INIT(ctx->save.buffers->iov);
iov = ctx->save.buffers->iov;
/* page_data record PFNs list */
+ MEM_UNDEFINED_INIT(ctx->save.buffers->rec_pfns);
rec_pfns = ctx->save.buffers->rec_pfns;
iov[0].iov_base = &hdrs;
@@ -788,6 +792,14 @@ static int setup(struct xc_sr_context *ctx)
errno = ENOMEM;
goto err;
}
+ MEM_NOACCESS_INIT(ctx->save.buffers->na0);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na1);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na2);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na3);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na4);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na5);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na6);
+ MEM_NOACCESS_INIT(ctx->save.buffers->na7);
rc = 0;
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |