summary refs log tree commit diff stats
path: root/backends/rng-egd.c
diff options
context:
space:
mode:
authorLadi Prosek <lprosek@redhat.com>2016-03-03 09:37:18 +0100
committerAmit Shah <amit.shah@redhat.com>2016-03-03 17:42:26 +0530
commit60253ed1e6ec6d8e5ef2efe7bf755f475dce9956 (patch)
tree6cf034176fb01e29274cf455b82cd6d68823d57a /backends/rng-egd.c
parent9f14b0add1dcdbfa2ee61051d068211fb0a1fcc9 (diff)
downloadfocaccia-qemu-60253ed1e6ec6d8e5ef2efe7bf755f475dce9956.tar.gz
focaccia-qemu-60253ed1e6ec6d8e5ef2efe7bf755f475dce9956.zip
rng: add request queue support to rng-random
Requests are now created in the RngBackend parent class and the
code path is shared by both rng-egd and rng-random.

This commit fixes the rng-random implementation which processed
only one request at a time and simply discarded all but the most
recent one. In the guest this manifested as delayed completion
of reads from virtio-rng, i.e. a read was completed only after
another read was issued.

By switching rng-random to use the same request queue as rng-egd,
the unsafe stack-based allocation of the entropy buffer is
eliminated and replaced with g_malloc.

Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Reviewed-by: Amit Shah <amit.shah@redhat.com>
Message-Id: <1456994238-9585-5-git-send-email-lprosek@redhat.com>
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Diffstat (limited to 'backends/rng-egd.c')
-rw-r--r--backends/rng-egd.c16
1 files changed, 2 insertions, 14 deletions
diff --git a/backends/rng-egd.c b/backends/rng-egd.c
index 8f2bd16b18..30332edb81 100644
--- a/backends/rng-egd.c
+++ b/backends/rng-egd.c
@@ -27,20 +27,10 @@ typedef struct RngEgd
     char *chr_name;
 } RngEgd;
 
-static void rng_egd_request_entropy(RngBackend *b, size_t size,
-                                    EntropyReceiveFunc *receive_entropy,
-                                    void *opaque)
+static void rng_egd_request_entropy(RngBackend *b, RngRequest *req)
 {
     RngEgd *s = RNG_EGD(b);
-    RngRequest *req;
-
-    req = g_malloc(sizeof(*req));
-
-    req->offset = 0;
-    req->size = size;
-    req->receive_entropy = receive_entropy;
-    req->opaque = opaque;
-    req->data = g_malloc(req->size);
+    size_t size = req->size;
 
     while (size > 0) {
         uint8_t header[2];
@@ -54,8 +44,6 @@ static void rng_egd_request_entropy(RngBackend *b, size_t size,
 
         size -= len;
     }
-
-    s->parent.requests = g_slist_append(s->parent.requests, req);
 }
 
 static int rng_egd_chr_can_read(void *opaque)