On Thu, Jan 27, 2022 at 01:49:30AM +0200, Nir Soffer wrote:
The example uses a buffer pool for all requests, but it did not
clear
the buffers before they were used. If we failed to handle a read error,
this could lead to leaking sensitive data to the destination server.
Signed-off-by: Nir Soffer <nsoffer(a)redhat.com>
---
examples/copy-libev.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/examples/copy-libev.c b/examples/copy-libev.c
index 51ff9fb0..13db898a 100644
--- a/examples/copy-libev.c
+++ b/examples/copy-libev.c
@@ -634,21 +634,28 @@ main (int argc, char *argv[])
/* Check destination server capabilities. */
dst.can_zero = nbd_can_zero (dst.nbd) > 0;
/* Start the copy "loop". When request completes, it starts the
* next request, until entire image was copied. */
for (i = 0; i < MAX_REQUESTS; i++) {
struct request *r = &requests[i];
r->index = i;
- r->data = malloc (REQUEST_SIZE);
+
+ /*
+ * Clear the buffer before starting the copy, so if we fail to
+ * handle a read error we will not write uninitilized data to
+ * the destination server, which may leak sensitive data to
+ * remote host.
+ */
+ r->data = calloc (1, REQUEST_SIZE);
if (r->data == NULL)
FAIL ("Cannot allocate buffer: %s", strerror (errno));
Do we strictly need this if we have patch 2?
But I guess since this is an example it may be better to leave this in
(and zeroing memory doesn't take very long anyway).
Rich.
start_request(r);
}
/* Start watching events on src and dst handles. */
ev_io_init (&src.watcher, io_cb, get_fd (&src), get_events (&src));
ev_io_start (loop, &src.watcher);
--
2.34.1
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top