[PATCH v2] Replace random() and related calls with generate_random_buffer()

Robin McCorkell rmccorkell at karoshi.org.uk
Tue Jul 7 14:35:36 UTC 2015


Result: better seeded random numbers that are cryptographically secure
(not that it matters in this case)

And here is that patch again with the Signed-off-by tag...

Signed-off-by: Robin McCorkell <rmccorkell at karoshi.org.uk>
---
 dfs_server/dfs_server_ad.c | 28 ++++++++++++++++++----------
 source3/smbd/msdfs.c       | 11 +++++++++--
 2 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/dfs_server/dfs_server_ad.c b/dfs_server/dfs_server_ad.c
index 3d93e19..ca88982 100644
--- a/dfs_server/dfs_server_ad.c
+++ b/dfs_server/dfs_server_ad.c
@@ -40,20 +40,27 @@ struct dc_set {
 
 static void shuffle_dc_set(struct dc_set *list)
 {
-       uint32_t i;
+	uint32_t i;
+	uint8_t *random;
 
-       srandom(time(NULL));
+	random = talloc_array(NULL, uint8_t, list->count + 1);
+	if (random == NULL) {
+		return; /* No shuffling, oops */
+	}
+	generate_random_buffer(random, list->count + 1);
 
-       for (i = list->count; i > 1; i--) {
-               uint32_t r;
-               const char *tmp;
+	for (i = list->count; i > 1; i--) {
+		uint8_t r;
+		const char *tmp;
 
-               r = random() % i;
+		r = random[i] % i;
 
-               tmp = list->names[i - 1];
-               list->names[i - 1] = list->names[r];
-               list->names[r] = tmp;
-       }
+		tmp = list->names[i - 1];
+		list->names[i - 1] = list->names[r];
+		list->names[r] = tmp;
+	}
+
+	talloc_free(random);
 }
 
 /*
@@ -945,3 +952,4 @@ NTSTATUS dfs_server_ad_get_referrals(struct loadparm_context *lp_ctx,
 	/* By default until all the case are handled */
 	return NT_STATUS_NOT_FOUND;
 }
+
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
index a39efce..2a3fc83 100644
--- a/source3/smbd/msdfs.c
+++ b/source3/smbd/msdfs.c
@@ -433,16 +433,23 @@ static void shuffle_strlist(char **list, int count)
 {
 	int i, r;
 	char *tmp;
+	uint8_t *random;
 
-	srandom(time(NULL));
+	random = talloc_array(NULL, uint8_t, count + 1);
+	if (random == NULL) {
+		return; /* No shuffling, oops */
+	}
+	generate_random_buffer(random, count + 1);
 
 	for (i = count; i > 1; i--) {
-		r = random() % i;
+		r = random[i] % i;
 
 		tmp = list[i-1];
 		list[i-1] = list[r];
 		list[r] = tmp;
 	}
+
+	talloc_free(random);
 }
 
 /**********************************************************************
-- 
2.4.5



More information about the samba-technical mailing list