mirror of
https://github.com/Yubico/yubico-pam.git
synced 2025-02-01 01:52:17 +01:00
Open file handlers manually using open() and fdopen() instead of using fopen()
A previous commit (d51124e) added the `e` flag to the `fopen()` calls. However this flag is not supported on all platforms (MacOS) and will be silently dropped (see #145). This patch works around those issues by manually opening the file descriptor using `open()` with the `O_CLOEXEC` flag, and invoking `fd_open()` on the resulting file descriptor to open an appropriate `FILE` stream. This makes sure that all files used by pam_yubico will be opened with the `O_CLOEXEC` flag on all supported platforms to mitigate issues with missing `fclose()` invocation (see #136).
This commit is contained in:
parent
0b595ee1cd
commit
e5bd2ef844
@ -814,12 +814,16 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
int fd;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
if(lstat(filename, &st) == 0)
|
if(lstat(filename, &st) == 0)
|
||||||
{
|
{
|
||||||
if(S_ISREG(st.st_mode))
|
if(S_ISREG(st.st_mode))
|
||||||
{
|
{
|
||||||
file = fopen(filename, "ae");
|
fd = open(filename, O_WRONLY | O_CREAT | O_APPEND | O_CLOEXEC, S_IRUSR | S_IWUSR | S_IRGRP);
|
||||||
|
if (fd >= 0)
|
||||||
|
{
|
||||||
|
file = fdopen(fd, "a");
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
cfg->debug_file = file;
|
cfg->debug_file = file;
|
||||||
@ -829,6 +833,7 @@ parse_cfg (int flags, int argc, const char **argv, struct cfg *cfg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DBG ("called.");
|
DBG ("called.");
|
||||||
DBG ("flags %d argc %d", flags, argc);
|
DBG ("flags %d argc %d", flags, argc);
|
||||||
|
8
util.c
8
util.c
@ -187,8 +187,14 @@ int generate_random(void *buf, int len)
|
|||||||
{
|
{
|
||||||
FILE *u;
|
FILE *u;
|
||||||
int res;
|
int res;
|
||||||
|
int fd;
|
||||||
|
|
||||||
u = fopen("/dev/urandom", "re");
|
fd = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||||
|
if (fd < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
u = fdopen(fd, "r");
|
||||||
if (!u) {
|
if (!u) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
11
ykpamcfg.c
11
ykpamcfg.c
@ -38,6 +38,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <ykpers.h>
|
#include <ykpers.h>
|
||||||
|
|
||||||
@ -143,6 +144,7 @@ do_add_hmac_chalresp(YK_KEY *yk, uint8_t slot, bool verbose, char *output_dir, u
|
|||||||
unsigned int response_len;
|
unsigned int response_len;
|
||||||
char *fn;
|
char *fn;
|
||||||
struct passwd *p;
|
struct passwd *p;
|
||||||
|
int fd;
|
||||||
FILE *f = NULL;
|
FILE *f = NULL;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
@ -237,11 +239,16 @@ do_add_hmac_chalresp(YK_KEY *yk, uint8_t slot, bool verbose, char *output_dir, u
|
|||||||
|
|
||||||
umask(077);
|
umask(077);
|
||||||
|
|
||||||
f = fopen (fn, "we");
|
fd = open (fn, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, S_IRUSR | S_IWUSR);
|
||||||
if (! f) {
|
if (fd < 0) {
|
||||||
fprintf (stderr, "Failed opening '%s' for writing : %s\n", fn, strerror (errno));
|
fprintf (stderr, "Failed opening '%s' for writing : %s\n", fn, strerror (errno));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
f = fdopen (fd, "w");
|
||||||
|
if (! f) {
|
||||||
|
fprintf (stderr, "fdopen: %s\n", strerror (errno));
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (! write_chalresp_state (f, &state))
|
if (! write_chalresp_state (f, &state))
|
||||||
goto out;
|
goto out;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user