1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-18 10:04:20 +03:00

Make _init_rand() thread safe - use rand_r() instead of rand().

Use good entropy for seed value if possible.
This commit is contained in:
Dave Wysochanski 2008-12-07 04:27:56 +00:00
parent b721056e04
commit d17a8e365d
8 changed files with 21 additions and 12 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.44 - Version 2.02.44 -
==================================== ====================================
Use better random seed value in temp file creation.
Add generic function to read /dev/urandom, used in uuid calculation. Add generic function to read /dev/urandom, used in uuid calculation.
Use displayable_lvs_in_vg and lv_is_displayable for consistency throughout. Use displayable_lvs_in_vg and lv_is_displayable for consistency throughout.
Fix race in vgcreate that would result in second caller overwriting first. Fix race in vgcreate that would result in second caller overwriting first.

View File

@ -979,6 +979,14 @@ static int _init_backup(struct cmd_context *cmd)
return 1; return 1;
} }
static void _init_rand(struct cmd_context *cmd)
{
if (read_urandom(&cmd->rand_seed, sizeof(cmd->rand_seed)))
return;
cmd->rand_seed = (unsigned) time(NULL) + (unsigned) getpid();
}
/* Entry point */ /* Entry point */
struct cmd_context *create_toolcontext(struct arg *the_args, unsigned is_static, struct cmd_context *create_toolcontext(struct arg *the_args, unsigned is_static,
unsigned is_long_lived) unsigned is_long_lived)
@ -1077,6 +1085,8 @@ struct cmd_context *create_toolcontext(struct arg *the_args, unsigned is_static,
if (!_init_backup(cmd)) if (!_init_backup(cmd))
goto error; goto error;
_init_rand(cmd);
cmd->default_settings.cache_vgmetadata = 1; cmd->default_settings.cache_vgmetadata = 1;
cmd->current_settings = cmd->default_settings; cmd->current_settings = cmd->default_settings;

View File

@ -62,6 +62,7 @@ struct cmd_context {
const char *hostname; const char *hostname;
const char *kernel_vsn; const char *kernel_vsn;
unsigned rand_seed;
char *cmd_line; char *cmd_line;
struct command *command; struct command *command;
struct arg *args; struct arg *args;

View File

@ -236,7 +236,8 @@ int archive_vg(struct volume_group *vg,
/* /*
* Write the vg out to a temporary file. * Write the vg out to a temporary file.
*/ */
if (!create_temp_name(dir, temp_file, sizeof(temp_file), &fd)) { if (!create_temp_name(dir, temp_file, sizeof(temp_file), &fd,
&vg->cmd->rand_seed)) {
log_err("Couldn't create temporary archive name."); log_err("Couldn't create temporary archive name.");
return 0; return 0;
} }

View File

@ -848,7 +848,8 @@ static int _vg_write_file(struct format_instance *fid __attribute((unused)),
return 0; return 0;
} }
if (!create_temp_name(temp_dir, temp_file, sizeof(temp_file), &fd)) { if (!create_temp_name(temp_dir, temp_file, sizeof(temp_file), &fd,
&vg->cmd->rand_seed)) {
log_err("Couldn't create temporary text file name."); log_err("Couldn't create temporary text file name.");
return 0; return 0;
} }

View File

@ -29,7 +29,8 @@
* rename the file after successfully writing it. Grab * rename the file after successfully writing it. Grab
* NFS-supported exclusive fcntl discretionary lock. * NFS-supported exclusive fcntl discretionary lock.
*/ */
int create_temp_name(const char *dir, char *buffer, size_t len, int *fd) int create_temp_name(const char *dir, char *buffer, size_t len, int *fd,
unsigned *seed)
{ {
int i, num; int i, num;
pid_t pid; pid_t pid;
@ -41,7 +42,7 @@ int create_temp_name(const char *dir, char *buffer, size_t len, int *fd)
.l_len = 0 .l_len = 0
}; };
num = rand(); num = rand_r(seed);
pid = getpid(); pid = getpid();
if (gethostname(hostname, sizeof(hostname)) < 0) { if (gethostname(hostname, sizeof(hostname)) < 0) {
log_sys_error("gethostname", ""); log_sys_error("gethostname", "");

View File

@ -19,7 +19,8 @@
/* /*
* Create a temporary filename, and opens a descriptor to the file. * Create a temporary filename, and opens a descriptor to the file.
*/ */
int create_temp_name(const char *dir, char *buffer, size_t len, int *fd); int create_temp_name(const char *dir, char *buffer, size_t len, int *fd,
unsigned *seed);
/* /*
* NFS-safe rename of a temporary file to a common name, designed * NFS-safe rename of a temporary file to a common name, designed

View File

@ -997,11 +997,6 @@ int lvm_split(char *str, int *argc, char **argv, int max)
return *argc; return *argc;
} }
static void _init_rand(void)
{
srand((unsigned) time(NULL) + (unsigned) getpid());
}
static const char *_get_cmdline(pid_t pid) static const char *_get_cmdline(pid_t pid)
{ {
static char _proc_cmdline[32]; static char _proc_cmdline[32];
@ -1096,8 +1091,6 @@ struct cmd_context *init_lvm(unsigned is_static)
if (!(cmd = create_toolcontext(_cmdline.the_args, is_static, 0))) if (!(cmd = create_toolcontext(_cmdline.the_args, is_static, 0)))
return_NULL; return_NULL;
_init_rand();
_apply_settings(cmd); _apply_settings(cmd);
return cmd; return cmd;