From 5f97dd2c44662784d63e62862a38ef7164d8758e Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 12 Jul 2007 15:28:30 +0000 Subject: [PATCH] Translate all file descriptors received from assuan. --- common/ChangeLog | 6 ++++++ common/sysutils.c | 38 +++++++++++++++++++++++++------------- common/sysutils.h | 17 ++++++++++++++++- g10/ChangeLog | 6 ++++++ g10/gpg.c | 10 +++++----- g10/gpgv.c | 2 +- sm/ChangeLog | 7 +++++++ sm/gpgsm.c | 2 +- sm/server.c | 35 +++++++++++++++++++---------------- 9 files changed, 86 insertions(+), 37 deletions(-) diff --git a/common/ChangeLog b/common/ChangeLog index 3d1f47160..7dd887cdc 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -1,3 +1,9 @@ +2007-07-12 Werner Koch + + * sysutils.h (gnupg_fd_t): New. + * sysutils.c (translate_sys2libc_fd): Use that type instead of int. + (translate_sys2libc_fd_int): New. + 2007-07-09 Werner Koch * t-gettime.c (test_isotime2epoch): Use time_t and not u32. diff --git a/common/sysutils.c b/common/sysutils.c index 47031a152..6f6a9cbf4 100644 --- a/common/sysutils.c +++ b/common/sysutils.c @@ -278,24 +278,36 @@ gnupg_sleep (unsigned int seconds) translates system file handles to libc file handles. FOR_WRITE gives the direction of the handle. */ int -translate_sys2libc_fd (int fd, int for_write) +translate_sys2libc_fd (gnupg_fd_t fd, int for_write) { #ifdef HAVE_W32_SYSTEM int x; - - if (fd <= 2) - return fd; /* Do not do this for error, stdin, stdout, stderr. - (This also ignores an fd of -1.) */ - x = _open_osfhandle (fd, for_write ? 1 : 0); + if (fd == GNUPG_INVALID_FD) + return -1; + + /* Note that _open_osfhandle is currently defined to take and return + a long. */ + x = _open_osfhandle ((long)fd, for_write ? 1 : 0); if (x == -1) log_error ("failed to translate osfhandle %p\n", (void *) fd); - else - { -/* log_info ("_open_osfhandle %p yields %d%s\n", */ -/* (void*)fd, x, for_write? " for writing":"" ); */ - fd = x; - } -#endif /* HAVE_W32_SYSTEM */ + return x; +#else /*!HAVE_W32_SYSTEM */ return fd; +#endif +} + +/* This is the same as translate_sys2libc_fd but takes an integer + which is assumet to be such an system handle. */ +int +translate_sys2libc_fd_int (int fd, int for_write) +{ +#ifdef HAVE_W32_SYSTEM + if (fd <= 2) + return fd; /* Do not do this for error, stdin, stdout, stderr. */ + + return translate_sys2libc_fd ((void*)fd, for_write); +#else + return fd; +#endif } diff --git a/common/sysutils.h b/common/sysutils.h index cc7a50d03..42bf58b9c 100644 --- a/common/sysutils.h +++ b/common/sysutils.h @@ -20,13 +20,28 @@ #ifndef GNUPG_COMMON_SYSUTILS_H #define GNUPG_COMMON_SYSUTILS_H +/* Because we use system handles and not libc low level file + descriptors on W32, we need to declare them as HANDLE (which + actually is a plain pointer). This is required to eventually + support 64 bits Windows systems. */ +#ifdef HAVE_W32_SYSTEM +typedef void *gnupg_fd_t; +#define GNUPG_INVALID_FD ((void*)(-1)) +#else +typedef int gnupg_fd_t; +#define GNUPG_INVALID_FD (-1) +#endif + + void trap_unaligned (void); int disable_core_dumps (void); int enable_core_dumps (void); const unsigned char *get_session_marker (size_t *rlen); /*int check_permissions (const char *path,int extension,int checkonly);*/ void gnupg_sleep (unsigned int seconds); -int translate_sys2libc_fd (int fd, int for_write); +int translate_sys2libc_fd (gnupg_fd_t fd, int for_write); +int translate_sys2libc_fd_int (int fd, int for_write); + #ifdef HAVE_W32_SYSTEM diff --git a/g10/ChangeLog b/g10/ChangeLog index 6c6e5afd3..86d1da562 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,9 @@ +2007-07-12 Werner Koch + + * gpg.c (main): Use translate_sys2libc_fd_int when passing an int + value. + * gpgv.c (main): Ditto. + 2007-07-05 Werner Koch * card-util.c (card_generate_subkey, card_store_subkey): Enable diff --git a/g10/gpg.c b/g10/gpg.c index a8563821c..49c29c992 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -2160,19 +2160,19 @@ main (int argc, char **argv ) case oDebugLevel: debug_level = pargs.r.ret_str; break; case oStatusFD: - set_status_fd( translate_sys2libc_fd (pargs.r.ret_int, 1) ); + set_status_fd( translate_sys2libc_fd_int (pargs.r.ret_int, 1) ); break; case oStatusFile: set_status_fd ( open_info_file (pargs.r.ret_str, 1) ); break; case oAttributeFD: - set_attrib_fd(translate_sys2libc_fd (pargs.r.ret_int, 1)); + set_attrib_fd(translate_sys2libc_fd_int (pargs.r.ret_int, 1)); break; case oAttributeFile: set_attrib_fd ( open_info_file (pargs.r.ret_str, 1) ); break; case oLoggerFD: - log_set_fd (translate_sys2libc_fd (pargs.r.ret_int, 1)); + log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1)); break; case oLoggerFile: logfile = pargs.r.ret_str; @@ -2436,14 +2436,14 @@ main (int argc, char **argv ) set_passphrase_from_string(pargs.r.ret_str); break; case oPasswdFD: - pwfd = translate_sys2libc_fd (pargs.r.ret_int, 0); + pwfd = translate_sys2libc_fd_int (pargs.r.ret_int, 0); break; case oPasswdFile: pwfd = open_info_file (pargs.r.ret_str, 0); break; case oPasswdRepeat: opt.passwd_repeat=pargs.r.ret_int; break; case oCommandFD: - opt.command_fd = translate_sys2libc_fd (pargs.r.ret_int, 0); + opt.command_fd = translate_sys2libc_fd_int (pargs.r.ret_int, 0); break; case oCommandFile: opt.command_fd = open_info_file (pargs.r.ret_str, 0); diff --git a/g10/gpgv.c b/g10/gpgv.c index a2343ae85..9b1fe2aed 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -154,7 +154,7 @@ main( int argc, char **argv ) case oKeyring: append_to_strlist( &nrings, pargs.r.ret_str); break; case oStatusFD: set_status_fd( pargs.r.ret_int ); break; case oLoggerFD: - log_set_fd (translate_sys2libc_fd (pargs.r.ret_int, 1)); + log_set_fd (translate_sys2libc_fd_int (pargs.r.ret_int, 1)); break; case oHomedir: opt.homedir = pargs.r.ret_str; break; case oIgnoreTimeConflict: opt.ignore_time_conflict = 1; break; diff --git a/sm/ChangeLog b/sm/ChangeLog index d17afc615..2b0b820bb 100644 --- a/sm/ChangeLog +++ b/sm/ChangeLog @@ -1,3 +1,10 @@ +2007-07-12 Werner Koch + + * gpgsm.c (check_special_filename): Use translate_sys2libc_fd_int + when passing an int value. + * server.c (cmd_encrypt, cmd_decrypt, cmd_verify, cmd_import) + (cmd_export, cmd_message, cmd_genkey): Translate file descriptors. + 2007-07-05 Werner Koch * Makefile.am (common_libs): Changed order of libs. diff --git a/sm/gpgsm.c b/sm/gpgsm.c index cf1ec4a30..4e880c814 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -1741,7 +1741,7 @@ check_special_filename (const char *fname, int for_write) for (i=0; isdigit (fname[i]); i++ ) ; if ( !fname[i] ) - return translate_sys2libc_fd (atoi (fname), for_write); + return translate_sys2libc_fd_int (atoi (fname), for_write); } return -1; } diff --git a/sm/server.c b/sm/server.c index 6f11b2734..f301dd301 100644 --- a/sm/server.c +++ b/sm/server.c @@ -29,6 +29,7 @@ #include #include "gpgsm.h" +#include "sysutils.h" #define set_error(e,t) assuan_set_error (ctx, gpg_error (e), (t)) @@ -409,14 +410,14 @@ cmd_encrypt (assuan_context_t ctx, char *line) FILE *out_fp; int rc; - inp_fd = assuan_get_input_fd (ctx); + inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0); if (inp_fd == -1) return set_error (GPG_ERR_ASS_NO_INPUT, NULL); - out_fd = assuan_get_output_fd (ctx); + out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); if (out_fd == -1) return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL); - out_fp = fdopen ( dup(out_fd), "w"); + out_fp = fdopen (dup (out_fd), "w"); if (!out_fp) return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed"); @@ -460,14 +461,14 @@ cmd_decrypt (assuan_context_t ctx, char *line) FILE *out_fp; int rc; - inp_fd = assuan_get_input_fd (ctx); + inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0); if (inp_fd == -1) return set_error (GPG_ERR_ASS_NO_INPUT, NULL); - out_fd = assuan_get_output_fd (ctx); + out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); if (out_fd == -1) return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL); - out_fp = fdopen ( dup(out_fd), "w"); + out_fp = fdopen (dup(out_fd), "w"); if (!out_fp) return set_error (GPG_ERR_ASS_GENERAL, "fdopen() failed"); rc = gpgsm_decrypt (ctrl, inp_fd, out_fp); @@ -496,8 +497,8 @@ cmd_verify (assuan_context_t ctx, char *line) { int rc; ctrl_t ctrl = assuan_get_pointer (ctx); - int fd = assuan_get_input_fd (ctx); - int out_fd = assuan_get_output_fd (ctx); + int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0); + int out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); FILE *out_fp = NULL; if (fd == -1) @@ -538,10 +539,10 @@ cmd_sign (assuan_context_t ctx, char *line) int detached; int rc; - inp_fd = assuan_get_input_fd (ctx); + inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0); if (inp_fd == -1) return set_error (GPG_ERR_ASS_NO_INPUT, NULL); - out_fd = assuan_get_output_fd (ctx); + out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); if (out_fd == -1) return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL); @@ -575,7 +576,7 @@ cmd_import (assuan_context_t ctx, char *line) { ctrl_t ctrl = assuan_get_pointer (ctx); int rc; - int fd = assuan_get_input_fd (ctx); + int fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0); if (fd == -1) return set_error (GPG_ERR_ASS_NO_INPUT, NULL); @@ -653,7 +654,7 @@ cmd_export (assuan_context_t ctx, char *line) } else { - int fd = assuan_get_output_fd (ctx); + int fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); FILE *out_fp; if (fd == -1) @@ -733,12 +734,14 @@ static int cmd_message (assuan_context_t ctx, char *line) { int rc; + assuan_fd_t sysfd; int fd; ctrl_t ctrl = assuan_get_pointer (ctx); - rc = assuan_command_parse_fd (ctx, line, &fd); + rc = assuan_command_parse_fd (ctx, line, &sysfd); if (rc) return rc; + fd = translate_sys2libc_fd (sysfd, 0); if (fd == -1) return set_error (GPG_ERR_ASS_NO_INPUT, NULL); ctrl->server_local->message_fd = fd; @@ -785,7 +788,7 @@ do_listkeys (assuan_context_t ctx, char *line, int mode) if (ctrl->server_local->list_to_output) { - int outfd = assuan_get_output_fd (ctx); + int outfd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); if ( outfd == -1 ) return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL); @@ -853,10 +856,10 @@ cmd_genkey (assuan_context_t ctx, char *line) FILE *out_fp; int rc; - inp_fd = assuan_get_input_fd (ctx); + inp_fd = translate_sys2libc_fd (assuan_get_input_fd (ctx), 0); if (inp_fd == -1) return set_error (GPG_ERR_ASS_NO_INPUT, NULL); - out_fd = assuan_get_output_fd (ctx); + out_fd = translate_sys2libc_fd (assuan_get_output_fd (ctx), 1); if (out_fd == -1) return set_error (GPG_ERR_ASS_NO_OUTPUT, NULL);