pull out unix /dev/random if we cant get users home directory
This commit is contained in:
@@ -46,8 +46,8 @@
|
|||||||
* Unix /dev/random
|
* Unix /dev/random
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
int
|
||||||
get_device_fd(int flags)
|
_hc_unix_device_fd(int flags, char **fn)
|
||||||
{
|
{
|
||||||
static const char *rnd_devices[] = {
|
static const char *rnd_devices[] = {
|
||||||
"/dev/urandom",
|
"/dev/urandom",
|
||||||
@@ -61,6 +61,8 @@ get_device_fd(int flags)
|
|||||||
for(p = rnd_devices; *p; p++) {
|
for(p = rnd_devices; *p; p++) {
|
||||||
int fd = open(*p, flags | O_NDELAY);
|
int fd = open(*p, flags | O_NDELAY);
|
||||||
if(fd >= 0) {
|
if(fd >= 0) {
|
||||||
|
if (fn)
|
||||||
|
*fn = *p;
|
||||||
rk_cloexec(fd);
|
rk_cloexec(fd);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
@@ -76,7 +78,7 @@ unix_seed(const void *indata, int size)
|
|||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fd = get_device_fd(O_WRONLY);
|
fd = _hc_unix_device_fd(O_WRONLY, NULL);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -97,7 +99,7 @@ unix_bytes(unsigned char *outdata, int size)
|
|||||||
else if (size == 0)
|
else if (size == 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
fd = get_device_fd(O_RDONLY);
|
fd = _hc_unix_device_fd(O_RDONLY, NULL);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -139,7 +141,7 @@ unix_status(void)
|
|||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = get_device_fd(O_RDONLY);
|
fd = _hc_unix_device_fd(O_RDONLY, NULL);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return 0;
|
return 0;
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@@ -342,23 +342,29 @@ RAND_write_file(const char *filename)
|
|||||||
const char *
|
const char *
|
||||||
RAND_file_name(char *filename, size_t size)
|
RAND_file_name(char *filename, size_t size)
|
||||||
{
|
{
|
||||||
const char *e = NULL;
|
char *e = NULL;
|
||||||
int pathp = 0, ret;
|
int pathp = 0, ret;
|
||||||
|
|
||||||
if (!issuid()) {
|
if (!issuid()) {
|
||||||
e = getenv("RANDFILE");
|
e = getenv("RANDFILE");
|
||||||
if (e == NULL) {
|
if (e == NULL)
|
||||||
e = getenv("HOME");
|
e = getenv("HOME");
|
||||||
if (e)
|
|
||||||
pathp = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Here we really want to call getpwuid(getuid()) but this will
|
* Here we really want to call getpwuid(getuid()) but this will
|
||||||
* cause recursive lookups if the nss library uses
|
* cause recursive lookups if the nss library uses
|
||||||
* gssapi/krb5/hcrypto to authenticate to the ldap servers.
|
* gssapi/krb5/hcrypto to authenticate to the ldap servers.
|
||||||
|
*
|
||||||
|
* So at least return the unix /dev/random if we have one
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (e == NULL) {
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
fd = _hc_unix_device_fd(O_RDONLY, &e);
|
||||||
|
if (fd >= 0)
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
if (e == NULL)
|
if (e == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@@ -45,5 +45,6 @@ extern const RAND_METHOD hc_rand_timer_method;
|
|||||||
extern const RAND_METHOD hc_rand_w32crypto_method;
|
extern const RAND_METHOD hc_rand_w32crypto_method;
|
||||||
|
|
||||||
const RAND_METHOD * RAND_timer_method(void);
|
const RAND_METHOD * RAND_timer_method(void);
|
||||||
|
int _hc_unix_device_fd(int, char **);
|
||||||
|
|
||||||
#endif /* _HEIM_RANDI_H */
|
#endif /* _HEIM_RANDI_H */
|
||||||
|
Reference in New Issue
Block a user