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:
parent
b721056e04
commit
d17a8e365d
@ -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.
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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", "");
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user