aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog9
-rw-r--r--src/gpgme.h.in3
-rw-r--r--src/w32-io.c53
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