diff options
-rw-r--r-- | doc/assuan.texi | 18 | ||||
-rw-r--r-- | src/ChangeLog | 11 | ||||
-rw-r--r-- | src/assuan-defs.h | 5 | ||||
-rw-r--r-- | src/assuan-io.c | 37 | ||||
-rw-r--r-- | src/assuan-socket-server.c | 19 | ||||
-rw-r--r-- | src/assuan-socket.c | 5 | ||||
-rw-r--r-- | src/assuan.h | 5 |
7 files changed, 82 insertions, 18 deletions
diff --git a/doc/assuan.texi b/doc/assuan.texi index 943fa10..8b0b36b 100644 --- a/doc/assuan.texi +++ b/doc/assuan.texi @@ -920,6 +920,21 @@ is indicated by a returning an error code. In case of error, @end deftypefun @noindent +On the Windows platform the following function needs to be called after +assuan_init_socket_server_ext: + +@deftypefun void assuan_set_sock_nonce ( @ + @w{assuan_context_t @var{ctx}}, @ + @w{assuan_sock_nonce_t *@var{nonce}}) + +Save a copy of @var{nonce} in context @var{ctx}. This should be used to +register the server's nonce with a context established by +assuan_init_socket_server. It is actually only needed for Windows but +it does not harm to use it on other systems as well. +@end deftypefun + + +@noindent After error checking, the implemented assuan commands are registered with the server. @@ -938,6 +953,7 @@ the server. @} @end example + @deftypefun assuan_error_t assuan_register_command (@w{assuan_context_t @var{ctx}}, @w{const char *@var{cmd_string}}, @w{int (*@var{handler}) (assuan_context_t, char *)}) This registers the command named @var{cmd_string} with the Assuan @@ -1642,7 +1658,7 @@ On Windows this is used by the server after an accept to read the nonce from the client and compare it with the saved @var{nonce}. If this function fails the server should immediatly drop the connection. To keep the code readable this may also be used on POSIX system; it is a -dummy function then. +dummy function then. See also @code{assuan_set_sock_nonce}. @end deftypefun diff --git a/src/ChangeLog b/src/ChangeLog index 3156c7f..fa10021 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,16 @@ +2007-10-02 Werner Koch <[email protected]> + + * assuan-io.c (_assuan_io_read) [W32]: Map WSAEWOULDBLOCK to EAGAIN. + * assuan-socket.c (_assuan_sock_check_nonce): N needs to be signed. + + * assuan-defs.h (struct assuan_context_s): Add LISTEN_NONCE. + * assuan-socket-server.c (assuan_set_sock_nonce): New. + (accept_connection): Check the nonce. + 2007-10-01 Werner Koch <[email protected]> + * assuan.h (ASSUAN_INT2FD, ASSUAN_FD2INT): New. + * assuan-socket.c: Rewritten. (assuan_sock_new, assuan_sock_connect, assuan_sock_bind) (assuan_sock_get_nonce, assuan_sock_check_nonce): New APIs. diff --git a/src/assuan-defs.h b/src/assuan-defs.h index 6c992ef..3c06436 100644 --- a/src/assuan-defs.h +++ b/src/assuan-defs.h @@ -136,6 +136,7 @@ struct assuan_context_s pid_t pid; /* The pid of the peer. */ assuan_fd_t listen_fd; /* The fd we are listening on (used by socket servers) */ + assuan_sock_nonce_t listen_nonce; /* Used with LISTEN_FD. */ assuan_fd_t connected_fd; /* helper */ struct { @@ -186,8 +187,8 @@ struct assuan_context_s /* If set, this is called right before logging an I/O line. With DIRECTION set to 1 it is called for an output oeration; 0 means an input operation. If bit 0 is set in the return value, the - logging of the will be suppressed. With bit 1 set, the entire - line will be ignored. */ + logging of the line will be suppressed. With bit 1 set, the + entire line will be ignored. */ unsigned int (*io_monitor)(assuan_context_t ctx, int direction, const char *line, diff --git a/src/assuan-io.c b/src/assuan-io.c index df5fe57..eb50f7a 100644 --- a/src/assuan-io.c +++ b/src/assuan-io.c @@ -56,22 +56,33 @@ _assuan_io_read (assuan_fd_t fd, void *buffer, size_t size) int n; n = recv (HANDLE2SOCKET(fd), buffer, size, 0); - if (n == -1 && WSAGetLastError () == WSAENOTSOCK) + if (n == -1) { - DWORD nread = 0; - - n = ReadFile (fd, buffer, size, &nread, NULL); - if (!n) + switch (WSAGetLastError ()) { - switch (GetLastError()) - { - case ERROR_BROKEN_PIPE: errno = EPIPE; break; - default: errno = EIO; - } - n = -1; + case WSAENOTSOCK: + { + DWORD nread = 0; + + n = ReadFile (fd, buffer, size, &nread, NULL); + if (!n) + { + switch (GetLastError()) + { + case ERROR_BROKEN_PIPE: errno = EPIPE; break; + default: errno = EIO; + } + n = -1; + } + else + n = (int)nread; + } + break; + + case WSAEWOULDBLOCK: errno = EAGAIN; break; + case ERROR_BROKEN_PIPE: errno = EPIPE; break; + default: errno = EIO; break; } - else - n = (int)nread; } return n; #else /*!HAVE_W32_SYSTEM*/ diff --git a/src/assuan-socket-server.c b/src/assuan-socket-server.c index d346f66..b754b81 100644 --- a/src/assuan-socket-server.c +++ b/src/assuan-socket-server.c @@ -1,5 +1,5 @@ /* assuan-socket-server.c - Assuan socket based server - * Copyright (C) 2002 Free Software Foundation, Inc. + * Copyright (C) 2002, 2007 Free Software Foundation, Inc. * * This file is part of Assuan. * @@ -98,6 +98,12 @@ accept_connection (assuan_context_t ctx) ctx->os_errno = errno; return _assuan_error (ASSUAN_Accept_Failed); } + if (_assuan_sock_check_nonce (fd, &ctx->listen_nonce)) + { + _assuan_close (fd); + ctx->os_errno = EACCES; + return _assuan_error (ASSUAN_Accept_Failed); + } ctx->connected_fd = fd; return accept_connection_bottom (ctx); @@ -190,3 +196,14 @@ assuan_init_socket_server_ext (assuan_context_t *r_ctx, assuan_fd_t fd, *r_ctx = ctx; return rc; } + + +/* Save a copy of NONCE in context CTX. This should be used to + register the server's nonce with an context established by + assuan_init_socket_server. */ +void +assuan_set_sock_nonce (assuan_context_t ctx, assuan_sock_nonce_t *nonce) +{ + if (ctx && nonce) + ctx->listen_nonce = *nonce; +} diff --git a/src/assuan-socket.c b/src/assuan-socket.c index 26ccd05..d2a01f7 100644 --- a/src/assuan-socket.c +++ b/src/assuan-socket.c @@ -32,6 +32,8 @@ #include <errno.h> #include <sys/stat.h> #include <fcntl.h> +#include <assert.h> + #include "assuan-defs.h" /* Hacks for Slowaris. */ @@ -306,7 +308,8 @@ _assuan_sock_check_nonce (assuan_fd_t fd, assuan_sock_nonce_t *nonce) { #ifdef HAVE_W32_SYSTEM char buffer[16], *p; - size_t nleft, n; + size_t nleft; + int n; if (sizeof nonce->nonce != 16) { diff --git a/src/assuan.h b/src/assuan.h index eec9842..56c3c8d 100644 --- a/src/assuan.h +++ b/src/assuan.h @@ -377,9 +377,13 @@ typedef struct assuan_context_s *ASSUAN_CONTEXT _ASSUAN_DEPRECATED; #ifdef _WIN32 typedef void *assuan_fd_t; #define ASSUAN_INVALID_FD ((void*)(-1)) +#define ASSUAN_INT2FD(s) ((void *)(s)) +#define ASSUAN_FD2INT(h) ((unsigned int)(h)) #else typedef int assuan_fd_t; #define ASSUAN_INVALID_FD (-1) +#define ASSUAN_INT2FD(s) ((s)) +#define ASSUAN_FD2INT(h) ((h)) #endif @@ -475,6 +479,7 @@ int assuan_init_connected_socket_server (assuan_context_t *r_ctx, assuan_fd_t fd) _ASSUAN_DEPRECATED; int assuan_init_socket_server_ext (assuan_context_t *r_ctx, assuan_fd_t fd, unsigned int flags); +void assuan_set_sock_nonce (assuan_context_t ctx, assuan_sock_nonce_t *nonce); /*-- assuan-pipe-connect.c --*/ assuan_error_t assuan_pipe_connect (assuan_context_t *ctx, |