diff options
Diffstat (limited to '')
| -rw-r--r-- | src/ChangeLog | 9 | ||||
| -rw-r--r-- | src/gpgme.h.in | 3 | ||||
| -rw-r--r-- | src/w32-io.c | 53 | 
3 files changed, 51 insertions, 14 deletions
| diff --git a/src/ChangeLog b/src/ChangeLog index 95b5f2db..88be268f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,14 @@  2009-06-18  Marcus Brinkmann  <[email protected]> +	* gpgme.h.in (GPGME_CONF_PATHNAME): Remove obsolete macro. + +	* w32-io.c (_gpgme_io_pipe): Allocate reader/writer thread right +	away. +	(_gpgme_io_read, _gpgme_io_write, _gpgme_io_select) +	(_gpgme_io_dup): Never allocate threads here. +	(find_writer, find_reader): Check return value of thread creation +	function. +  	* context.h (CTX_OP_DATA_MAGIC): New macro.  	(struct ctx_op_data): New member MAGIC.  	* op-support.c (_gpgme_op_data_lookup): Initialize magic. diff --git a/src/gpgme.h.in b/src/gpgme.h.in index e02a98c3..45c1613b 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1793,9 +1793,6 @@ typedef enum      GPGME_CONF_ALIAS_LIST = 37    }  gpgme_conf_type_t; -/* Macro for backward compatibility (even though it was undocumented -   and marked as experimental in 1.1.6 - will be removed after 1.1.7): */ -#define GPGME_CONF_PATHNAME GPGME_CONF_FILENAME  /* This represents a single argument for a configuration option. diff --git a/src/w32-io.c b/src/w32-io.c index b6dd6fb2..67a02bba 100644 --- a/src/w32-io.c +++ b/src/w32-io.c @@ -389,9 +389,12 @@ find_reader (int fd, int start_it)    if (i != reader_table_size)      {        rd = create_reader (fd_to_handle (fd)); -      reader_table[i].fd = fd; -      reader_table[i].context = rd; -      reader_table[i].used = 1; +      if (rd) +	{ +	  reader_table[i].fd = fd; +	  reader_table[i].context = rd; +	  reader_table[i].used = 1; +	}      }    UNLOCK (reader_table_lock); @@ -692,9 +695,12 @@ find_writer (int fd, int start_it)    if (i != writer_table_size)      {        wt = create_writer (fd_to_handle (fd)); -      writer_table[i].fd = fd; -      writer_table[i].context = wt;  -      writer_table[i].used = 1; +      if (wt) +	{ +	  writer_table[i].fd = fd; +	  writer_table[i].context = wt;  +	  writer_table[i].used = 1; +	}      }    UNLOCK (writer_table_lock); @@ -733,7 +739,7 @@ _gpgme_io_write (int fd, const void *buffer, size_t count)    if (count == 0)      return TRACE_SYSRES (0); -  ctx = find_writer (fd, 1); +  ctx = find_writer (fd, 0);    if (!ctx)      return TRACE_SYSRES (-1); @@ -826,6 +832,7 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)    /* Make one end inheritable.  */    if (inherit_idx == 0)      { +      struct writer_context_s *ctx;        HANDLE hd;        if (!DuplicateHandle (GetCurrentProcess(), rh,  			    GetCurrentProcess(), &hd, 0, @@ -841,6 +848,18 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)          }        CloseHandle (rh);        rh = hd; + +      ctx = find_writer (handle_to_fd (wh), 0); +      assert (ctx == NULL); +      ctx = find_writer (handle_to_fd (wh), 1); +      if (!ctx) +	{ +	  CloseHandle (rh); +	  CloseHandle (wh); +	  /* FIXME: Should translate the error code.  */ +	  errno = EIO; +	  return TRACE_SYSRES (-1); +	}      }    else if (inherit_idx == 1)      { @@ -859,6 +878,18 @@ _gpgme_io_pipe (int filedes[2], int inherit_idx)          }        CloseHandle (wh);        wh = hd; + +      ctx = find_reader (handle_to_fd (rh), 0); +      assert (ctx == NULL); +      ctx = find_reader (handle_to_fd (rh), 1); +      if (!ctx) +	{ +	  CloseHandle (rh); +	  CloseHandle (wh); +	  /* FIXME: Should translate the error code.  */ +	  errno = EIO; +	  return TRACE_SYSRES (-1); +	}      }    filedes[0] = handle_to_fd (rh); @@ -1248,7 +1279,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)  	{  	  if (fds[i].for_read)  	    { -	      struct reader_context_s *ctx = find_reader (fds[i].fd,1); +	      struct reader_context_s *ctx = find_reader (fds[i].fd,0);  	      if (!ctx)  		TRACE_LOG1 ("error: no reader for FD 0x%x (ignored)", @@ -1271,7 +1302,7 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock)              }  	  else if (fds[i].for_write)  	    { -	      struct writer_context_s *ctx = find_writer (fds[i].fd,1); +	      struct writer_context_s *ctx = find_writer (fds[i].fd,0);  	      if (!ctx)  		TRACE_LOG1 ("error: no writer for FD 0x%x (ignored)", @@ -1417,7 +1448,7 @@ _gpgme_io_dup (int fd)        return TRACE_SYSRES (-1);      } -  rd_ctx = find_reader (fd, 1); +  rd_ctx = find_reader (fd, 0);    if (rd_ctx)      {        /* No need for locking, as the only races are against the reader @@ -1436,7 +1467,7 @@ _gpgme_io_dup (int fd)        UNLOCK (reader_table_lock);      } -  wt_ctx = find_writer (fd, 1); +  wt_ctx = find_writer (fd, 0);    if (wt_ctx)      {        /* No need for locking, as the only races are against the writer | 
