Skip to content

Commit

Permalink
thread safe: rand() => rand_r()
Browse files Browse the repository at this point in the history
Signed-off-by: 2xsec <dh48.jeong@samsung.com>
  • Loading branch information
2xsec authored and Christian Brauner committed Jul 24, 2018
1 parent 431b95c commit 03df81a
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 21 deletions.
20 changes: 15 additions & 5 deletions src/lxc/confile_utils.c
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}

Expand Down
25 changes: 9 additions & 16 deletions src/lxc/network.c
Expand Up @@ -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;
Expand All @@ -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
Expand Down

0 comments on commit 03df81a

Please sign in to comment.