summaryrefslogtreecommitdiffstats
path: root/super1.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-06-07 23:03:48 +0000
committerNeil Brown <neilb@suse.de>2005-06-07 23:03:48 +0000
commitdfe47e008e10d5640c6b3d0ae6de7ef6cefcb7b2 (patch)
tree0fd6aa40bd1559c813eab17392936bdaf2514a1f /super1.c
parent892debc8200517e8b00750367acd890199f9f4de (diff)
downloadmdadm-dfe47e008e10d5640c6b3d0ae6de7ef6cefcb7b2.tar.gz
mdadm-dfe47e008e10d5640c6b3d0ae6de7ef6cefcb7b2.tar.xz
mdadm-dfe47e008e10d5640c6b3d0ae6de7ef6cefcb7b2.zip
Make sure to seed the random number generator for uuids
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Diffstat (limited to 'super1.c')
-rw-r--r--super1.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/super1.c b/super1.c
index 751e28d..c5813b9 100644
--- a/super1.c
+++ b/super1.c
@@ -466,6 +466,7 @@ static int write_init_super1(struct supertype *st, void *sbv, mdu_disk_info_t *d
struct mdp_superblock_1 *sb = sbv;
struct mdp_superblock_1 *refsb = NULL;
int fd = open(devname, O_RDWR | O_EXCL);
+ int rfd;
int rv;
long size;
@@ -480,10 +481,14 @@ static int write_init_super1(struct supertype *st, void *sbv, mdu_disk_info_t *d
sb->dev_number = __cpu_to_le32(dinfo->number);
- *(__u32*)(sb->device_uuid) = random();
- *(__u32*)(sb->device_uuid+4) = random();
- *(__u32*)(sb->device_uuid+8) = random();
- *(__u32*)(sb->device_uuid+12) = random();
+ if ((rfd = open("/dev/urandom", O_RDONLY)) < 0 ||
+ read(rfd, sb->device_uuid, 16) != 16) {
+ *(__u32*)(sb->device_uuid) = random();
+ *(__u32*)(sb->device_uuid+4) = random();
+ *(__u32*)(sb->device_uuid+8) = random();
+ *(__u32*)(sb->device_uuid+12) = random();
+ }
+ if (rfd >= 0) close(rfd);
sb->events = 0;
if (load_super1(st, fd, (void**)&refsb, NULL)==0) {