[lxc-devel] [lxc/master] thread safe: rand() => rand_r()

2xsec on Github lxc-bot at linuxcontainers.org
Sat Jul 21 13:28:45 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 413 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180721/34b105fb/attachment.bin>
-------------- next part --------------
From 280cc35f082c581dabb86e8a83d93cf35f6dc79f Mon Sep 17 00:00:00 2001
From: 2xsec <dh48.jeong at samsung.com>
Date: Sat, 21 Jul 2018 22:27:30 +0900
Subject: [PATCH] thread safe: rand() => rand_r()

Signed-off-by: 2xsec <dh48.jeong at samsung.com>
---
 src/lxc/confile_utils.c | 20 +++++++++++++++-----
 src/lxc/network.c       | 25 +++++++++----------------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/src/lxc/confile_utils.c b/src/lxc/confile_utils.c
index 4a7d934a2..2bb46d17b 100644
--- a/src/lxc/confile_utils.c
+++ b/src/lxc/confile_utils.c
@@ -550,14 +550,15 @@ void rand_complete_hwaddr(char *hwaddr)
 {
 	const char hex[] = "0123456789abcdef";
 	char *curs = hwaddr;
-
-#ifndef HAVE_RAND_R
-	randseed(true);
-#else
+#ifdef HAVE_RAND_R
 	unsigned int seed;
 
 	seed = randseed(false);
+#else
+
+	(void)randseed(true);
 #endif
+
 	while (*curs != '\0' && *curs != '\n') {
 		if (*curs == 'x' || *curs == 'X') {
 			if (curs - hwaddr == 1) {
@@ -635,13 +636,22 @@ void update_hwaddr(const char *line)
 bool new_hwaddr(char *hwaddr)
 {
 	int ret;
+#ifdef HAVE_RAND_R
+	unsigned int seed;
+
+	seed = randseed(false);
+
+	ret = snprintf(hwaddr, 18, "00:16:3e:%02x:%02x:%02x", rand_r(&seed) % 255,
+		       rand_r(&seed) % 255, rand_r(&seed) % 255);
+#else
 
 	(void)randseed(true);
 
 	ret = snprintf(hwaddr, 18, "00:16:3e:%02x:%02x:%02x", rand() % 255,
 		       rand() % 255, rand() % 255);
+#endif
 	if (ret < 0 || ret >= 18) {
-		SYSERROR("Failed to call snprintf().");
+		SYSERROR("Failed to call snprintf()");
 		return false;
 	}
 
diff --git a/src/lxc/network.c b/src/lxc/network.c
index 63f321f46..50b5293c0 100644
--- a/src/lxc/network.c
+++ b/src/lxc/network.c
@@ -1965,12 +1965,18 @@ static const char padchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 char *lxc_mkifname(char *template)
 {
 	int ret;
-	unsigned int seed;
-	FILE *urandom;
 	struct ifaddrs *ifa, *ifaddr;
 	char name[IFNAMSIZ];
 	bool exists = false;
 	size_t i = 0;
+#ifdef HAVE_RAND_R
+	unsigned int seed;
+
+	seed = randseed(false);
+#else
+
+	(void)randseed(true);
+#endif
 
 	if (strlen(template) >= IFNAMSIZ)
 		return NULL;
@@ -1982,26 +1988,13 @@ char *lxc_mkifname(char *template)
 		return NULL;
 	}
 
-	/* Initialize the random number generator. */
-	urandom = fopen("/dev/urandom", "r");
-	if (urandom != NULL) {
-		if (fread(&seed, sizeof(seed), 1, urandom) <= 0)
-			seed = time(0);
-		fclose(urandom);
-	} else {
-		seed = time(0);
-	}
-
-#ifndef HAVE_RAND_R
-	srand(seed);
-#endif
-
 	/* Generate random names until we find one that doesn't exist. */
 	while (true) {
 		name[0] = '\0';
 		(void)strlcpy(name, template, IFNAMSIZ);
 
 		exists = false;
+
 		for (i = 0; i < strlen(name); i++) {
 			if (name[i] == 'X') {
 #ifdef HAVE_RAND_R


More information about the lxc-devel mailing list