mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
common: Add gnupg_check_special_filename.
* common/sysutils.h (gnupg_check_special_filename): New. * common/sysutils.c (gnupg_check_special_filename): New. * common/iobuf.c (translate_file_handle): Remove. (iobuf_is_pipe_filename): Use gnupg_check_special_filename. (do_open): Use gnupg_check_special_filename. * g10/plaintext.c (get_output_file): Use gnupg_check_special_filename and open_stream_nc. -- GnuPG-bug-id: 6580 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
37343db08f
commit
250733c0d8
@ -166,7 +166,6 @@ block_filter_ctx_t;
|
|||||||
/* Local prototypes. */
|
/* Local prototypes. */
|
||||||
static int underflow (iobuf_t a, int clear_pending_eof);
|
static int underflow (iobuf_t a, int clear_pending_eof);
|
||||||
static int underflow_target (iobuf_t a, int clear_pending_eof, size_t target);
|
static int underflow_target (iobuf_t a, int clear_pending_eof, size_t target);
|
||||||
static gnupg_fd_t translate_file_handle (int fd, int for_write);
|
|
||||||
static iobuf_t do_iobuf_fdopen (gnupg_fd_t fp, const char *mode, int keep_open);
|
static iobuf_t do_iobuf_fdopen (gnupg_fd_t fp, const char *mode, int keep_open);
|
||||||
|
|
||||||
|
|
||||||
@ -1412,7 +1411,7 @@ iobuf_is_pipe_filename (const char *fname)
|
|||||||
{
|
{
|
||||||
if (!fname || (*fname=='-' && !fname[1]) )
|
if (!fname || (*fname=='-' && !fname[1]) )
|
||||||
return 1;
|
return 1;
|
||||||
return check_special_filename (fname, 0, 1) != -1;
|
return gnupg_check_special_filename (fname) != GNUPG_INVALID_FD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1425,7 +1424,7 @@ do_open (const char *fname, int special_filenames,
|
|||||||
file_filter_ctx_t *fcx;
|
file_filter_ctx_t *fcx;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
int print_only = 0;
|
int print_only = 0;
|
||||||
int fd;
|
gnupg_fd_t fd;
|
||||||
byte desc[MAX_IOBUF_DESC];
|
byte desc[MAX_IOBUF_DESC];
|
||||||
|
|
||||||
log_assert (use == IOBUF_INPUT || use == IOBUF_OUTPUT);
|
log_assert (use == IOBUF_INPUT || use == IOBUF_OUTPUT);
|
||||||
@ -1449,9 +1448,8 @@ do_open (const char *fname, int special_filenames,
|
|||||||
else if (!fname)
|
else if (!fname)
|
||||||
return NULL;
|
return NULL;
|
||||||
else if (special_filenames
|
else if (special_filenames
|
||||||
&& (fd = check_special_filename (fname, 0, 1)) != -1)
|
&& (fd = gnupg_check_special_filename (fname)) != GNUPG_INVALID_FD)
|
||||||
return do_iobuf_fdopen (translate_file_handle (fd, use == IOBUF_INPUT
|
return do_iobuf_fdopen (fd, opentype, 0);
|
||||||
? 0 : 1), opentype, 0);
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (use == IOBUF_INPUT)
|
if (use == IOBUF_INPUT)
|
||||||
@ -2948,36 +2946,6 @@ iobuf_read_line (iobuf_t a, byte ** addr_of_buffer,
|
|||||||
return nbytes;
|
return nbytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gnupg_fd_t
|
|
||||||
translate_file_handle (int fd, int for_write)
|
|
||||||
{
|
|
||||||
#if defined(HAVE_W32_SYSTEM)
|
|
||||||
{
|
|
||||||
gnupg_fd_t x;
|
|
||||||
|
|
||||||
(void)for_write;
|
|
||||||
|
|
||||||
if (fd == 0)
|
|
||||||
x = GetStdHandle (STD_INPUT_HANDLE);
|
|
||||||
else if (fd == 1)
|
|
||||||
x = GetStdHandle (STD_OUTPUT_HANDLE);
|
|
||||||
else if (fd == 2)
|
|
||||||
x = GetStdHandle (STD_ERROR_HANDLE);
|
|
||||||
else
|
|
||||||
x = (gnupg_fd_t)(intptr_t)fd;
|
|
||||||
|
|
||||||
if (x == INVALID_HANDLE_VALUE)
|
|
||||||
log_debug ("GetStdHandle(%d) failed: ec=%d\n",
|
|
||||||
fd, (int) GetLastError ());
|
|
||||||
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
(void)for_write;
|
|
||||||
return fd;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
iobuf_skip_rest (iobuf_t a, unsigned long n, int partial)
|
iobuf_skip_rest (iobuf_t a, unsigned long n, int partial)
|
||||||
|
@ -682,6 +682,48 @@ check_special_filename (const char *fname, int for_write, int notranslate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Check whether FNAME has the form "-&nnnn", where N is a number
|
||||||
|
* representing a file. Returns GNUPG_INVALID_FD if it is not the
|
||||||
|
* case. Returns a file descriptor on POSIX, a system handle on
|
||||||
|
* Windows. */
|
||||||
|
gnupg_fd_t
|
||||||
|
gnupg_check_special_filename (const char *fname)
|
||||||
|
{
|
||||||
|
if (allow_special_filenames
|
||||||
|
&& fname && *fname == '-' && fname[1] == '&')
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
fname += 2;
|
||||||
|
for (i=0; digitp (fname+i); i++ )
|
||||||
|
;
|
||||||
|
if (!fname[i])
|
||||||
|
{
|
||||||
|
es_syshd_t syshd;
|
||||||
|
|
||||||
|
if (gnupg_parse_fdstr (fname, &syshd))
|
||||||
|
return GNUPG_INVALID_FD;
|
||||||
|
|
||||||
|
#ifdef HAVE_W32_SYSTEM
|
||||||
|
if (syshd.type == ES_SYSHD_FD)
|
||||||
|
{
|
||||||
|
if (syshd.u.fd == 0)
|
||||||
|
return GetStdHandle (STD_INPUT_HANDLE);
|
||||||
|
else if (syshd.u.fd == 1)
|
||||||
|
return GetStdHandle (STD_OUTPUT_HANDLE);
|
||||||
|
else if (syshd.u.fd == 2)
|
||||||
|
return GetStdHandle (STD_ERROR_HANDLE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return syshd.u.handle;
|
||||||
|
#else
|
||||||
|
return syshd.u.fd;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return GNUPG_INVALID_FD;
|
||||||
|
}
|
||||||
|
|
||||||
/* Replacement for tmpfile(). This is required because the tmpfile
|
/* Replacement for tmpfile(). This is required because the tmpfile
|
||||||
function of Windows' runtime library is broken, insecure, ignores
|
function of Windows' runtime library is broken, insecure, ignores
|
||||||
TMPDIR and so on. In addition we create a file with an inheritable
|
TMPDIR and so on. In addition we create a file with an inheritable
|
||||||
|
@ -76,6 +76,7 @@ int translate_sys2libc_fd (gnupg_fd_t fd, int for_write);
|
|||||||
int translate_sys2libc_fd_int (int fd, int for_write);
|
int translate_sys2libc_fd_int (int fd, int for_write);
|
||||||
gpg_error_t gnupg_parse_fdstr (const char *fdstr, es_syshd_t *r_syshd);
|
gpg_error_t gnupg_parse_fdstr (const char *fdstr, es_syshd_t *r_syshd);
|
||||||
int check_special_filename (const char *fname, int for_write, int notranslate);
|
int check_special_filename (const char *fname, int for_write, int notranslate);
|
||||||
|
gnupg_fd_t gnupg_check_special_filename (const char *fname);
|
||||||
FILE *gnupg_tmpfile (void);
|
FILE *gnupg_tmpfile (void);
|
||||||
void gnupg_reopen_std (const char *pgmname);
|
void gnupg_reopen_std (const char *pgmname);
|
||||||
void gnupg_inhibit_set_foregound_window (int yes);
|
void gnupg_inhibit_set_foregound_window (int yes);
|
||||||
|
@ -111,20 +111,20 @@ get_output_file (const byte *embedded_name, int embedded_namelen,
|
|||||||
{
|
{
|
||||||
/* Special file name, no filename, or "-" given; write to the
|
/* Special file name, no filename, or "-" given; write to the
|
||||||
* file descriptor or to stdout. */
|
* file descriptor or to stdout. */
|
||||||
int fd;
|
gnupg_fd_t fd;
|
||||||
char xname[64];
|
char xname[64];
|
||||||
|
|
||||||
fd = check_special_filename (fname, 1, 0);
|
fd = gnupg_check_special_filename (fname);
|
||||||
if (fd == -1)
|
if (fd == GNUPG_INVALID_FD)
|
||||||
{
|
{
|
||||||
/* Not a special filename, thus we want stdout. */
|
/* Not a special filename, thus we want stdout. */
|
||||||
fp = es_stdout;
|
fp = es_stdout;
|
||||||
es_set_binary (fp);
|
es_set_binary (fp);
|
||||||
}
|
}
|
||||||
else if (!(fp = es_fdopen_nc (fd, "wb")))
|
else if (!(fp = open_stream_nc (fd, "wb")))
|
||||||
{
|
{
|
||||||
err = gpg_error_from_syserror ();
|
err = gpg_error_from_syserror ();
|
||||||
snprintf (xname, sizeof xname, "[fd %d]", fd);
|
snprintf (xname, sizeof xname, "[fd %d]", (int)(intptr_t)fd);
|
||||||
log_error (_("can't open '%s': %s\n"), xname, gpg_strerror (err));
|
log_error (_("can't open '%s': %s\n"), xname, gpg_strerror (err));
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user