mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +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:
parent
b721056e04
commit
d17a8e365d
@ -1,5 +1,6 @@
|
||||
Version 2.02.44 -
|
||||
====================================
|
||||
Use better random seed value in temp file creation.
|
||||
Add generic function to read /dev/urandom, used in uuid calculation.
|
||||
Use displayable_lvs_in_vg and lv_is_displayable for consistency throughout.
|
||||
Fix race in vgcreate that would result in second caller overwriting first.
|
||||
|
@ -979,6 +979,14 @@ static int _init_backup(struct cmd_context *cmd)
|
||||
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 */
|
||||
struct cmd_context *create_toolcontext(struct arg *the_args, unsigned is_static,
|
||||
unsigned is_long_lived)
|
||||
@ -1077,6 +1085,8 @@ struct cmd_context *create_toolcontext(struct arg *the_args, unsigned is_static,
|
||||
if (!_init_backup(cmd))
|
||||
goto error;
|
||||
|
||||
_init_rand(cmd);
|
||||
|
||||
cmd->default_settings.cache_vgmetadata = 1;
|
||||
cmd->current_settings = cmd->default_settings;
|
||||
|
||||
|
@ -62,6 +62,7 @@ struct cmd_context {
|
||||
const char *hostname;
|
||||
const char *kernel_vsn;
|
||||
|
||||
unsigned rand_seed;
|
||||
char *cmd_line;
|
||||
struct command *command;
|
||||
struct arg *args;
|
||||
|
@ -236,7 +236,8 @@ int archive_vg(struct volume_group *vg,
|
||||
/*
|
||||
* 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.");
|
||||
return 0;
|
||||
}
|
||||
|
@ -848,7 +848,8 @@ static int _vg_write_file(struct format_instance *fid __attribute((unused)),
|
||||
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.");
|
||||
return 0;
|
||||
}
|
||||
|
@ -29,7 +29,8 @@
|
||||
* rename the file after successfully writing it. Grab
|
||||
* 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;
|
||||
pid_t pid;
|
||||
@ -41,7 +42,7 @@ int create_temp_name(const char *dir, char *buffer, size_t len, int *fd)
|
||||
.l_len = 0
|
||||
};
|
||||
|
||||
num = rand();
|
||||
num = rand_r(seed);
|
||||
pid = getpid();
|
||||
if (gethostname(hostname, sizeof(hostname)) < 0) {
|
||||
log_sys_error("gethostname", "");
|
||||
|
@ -19,7 +19,8 @@
|
||||
/*
|
||||
* 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
|
||||
|
@ -997,11 +997,6 @@ int lvm_split(char *str, int *argc, char **argv, int max)
|
||||
return *argc;
|
||||
}
|
||||
|
||||
static void _init_rand(void)
|
||||
{
|
||||
srand((unsigned) time(NULL) + (unsigned) getpid());
|
||||
}
|
||||
|
||||
static const char *_get_cmdline(pid_t pid)
|
||||
{
|
||||
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)))
|
||||
return_NULL;
|
||||
|
||||
_init_rand();
|
||||
|
||||
_apply_settings(cmd);
|
||||
|
||||
return cmd;
|
||||
|
Loading…
Reference in New Issue
Block a user