mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
common: Fix gnupg_reopen_std.
* common/sysutils.c (gnupg_reopen_std): Use fcntl instead of fstat. -- When gpg was invoked by a Perl web application on FreeBSD, fstat in gnupg_reopen_std failed with EBADF. Using fcntl, which is considered lighter than fstat, it works fine. Since uur purpose is to check if file descriptor is valid or not, lighter operation is better. Reported-by: Marcin Gryszkalis <mg@fork.pl> Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
0cb65564e0
commit
50b02dba20
@ -551,14 +551,13 @@ gnupg_tmpfile (void)
|
|||||||
void
|
void
|
||||||
gnupg_reopen_std (const char *pgmname)
|
gnupg_reopen_std (const char *pgmname)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_STAT) && !defined(HAVE_W32_SYSTEM)
|
#ifdef F_GETFD
|
||||||
struct stat statbuf;
|
|
||||||
int did_stdin = 0;
|
int did_stdin = 0;
|
||||||
int did_stdout = 0;
|
int did_stdout = 0;
|
||||||
int did_stderr = 0;
|
int did_stderr = 0;
|
||||||
FILE *complain;
|
FILE *complain;
|
||||||
|
|
||||||
if (fstat (STDIN_FILENO, &statbuf) == -1 && errno ==EBADF)
|
if (fcntl (STDIN_FILENO, F_GETFD) == -1 && errno ==EBADF)
|
||||||
{
|
{
|
||||||
if (open ("/dev/null",O_RDONLY) == STDIN_FILENO)
|
if (open ("/dev/null",O_RDONLY) == STDIN_FILENO)
|
||||||
did_stdin = 1;
|
did_stdin = 1;
|
||||||
@ -566,7 +565,7 @@ gnupg_reopen_std (const char *pgmname)
|
|||||||
did_stdin = 2;
|
did_stdin = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fstat (STDOUT_FILENO, &statbuf) == -1 && errno == EBADF)
|
if (fcntl (STDOUT_FILENO, F_GETFD) == -1 && errno == EBADF)
|
||||||
{
|
{
|
||||||
if (open ("/dev/null",O_WRONLY) == STDOUT_FILENO)
|
if (open ("/dev/null",O_WRONLY) == STDOUT_FILENO)
|
||||||
did_stdout = 1;
|
did_stdout = 1;
|
||||||
@ -574,7 +573,7 @@ gnupg_reopen_std (const char *pgmname)
|
|||||||
did_stdout = 2;
|
did_stdout = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fstat (STDERR_FILENO, &statbuf)==-1 && errno==EBADF)
|
if (fcntl (STDERR_FILENO, F_GETFD)==-1 && errno==EBADF)
|
||||||
{
|
{
|
||||||
if (open ("/dev/null", O_WRONLY) == STDERR_FILENO)
|
if (open ("/dev/null", O_WRONLY) == STDERR_FILENO)
|
||||||
did_stderr = 1;
|
did_stderr = 1;
|
||||||
@ -607,7 +606,7 @@ gnupg_reopen_std (const char *pgmname)
|
|||||||
|
|
||||||
if (did_stdin == 2 || did_stdout == 2 || did_stderr == 2)
|
if (did_stdin == 2 || did_stdout == 2 || did_stderr == 2)
|
||||||
exit (3);
|
exit (3);
|
||||||
#else /* !(HAVE_STAT && !HAVE_W32_SYSTEM) */
|
#else /* !F_GETFD */
|
||||||
(void)pgmname;
|
(void)pgmname;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user