[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