|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v9 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 | 13 +++++++++++++
3 files changed, 29 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 6a77e33a47..25561e369f 100644
--- a/tools/libs/guest/xg_sr_save.c
+++ b/tools/libs/guest/xg_sr_save.c
@@ -123,6 +123,11 @@ static int write_batch(struct xc_sr_context *ctx)
assert(nr_pfns != 0);
assert(nr_pfns <= MAX_BATCH_SIZE);
+ MEM_UNDEFINED_INIT(ctx->save.buffers->mfns);
+ MEM_UNDEFINED_INIT(ctx->save.buffers->types);
+ MEM_UNDEFINED_INIT(ctx->save.buffers->iov);
+ MEM_UNDEFINED_INIT(ctx->save.buffers->rec_pfns);
+
iov[0].iov_base = &hdrs;
iov[0].iov_len = sizeof(hdrs);
@@ -783,6 +788,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 |