From c8a1be0f871921a9dd5a55caa982ff3e0762d3bd Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 19 Mar 2009 04:49:16 +0000 Subject: release --- ChangeLog | 6 +++ README | 6 ++- configure.ac | 4 +- doc/Doxyfile | 2 +- src/daemon/daemon.c | 11 ++++- src/daemon/https/tls/gnutls_buffers.c | 75 +++++---------------------------- src/daemon/internal.h | 2 +- src/testcurl/https/tls_extension_test.c | 6 +++ 8 files changed, 41 insertions(+), 71 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9e20d75e..00ffa827 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Mar 18 17:46:58 MDT 2009 + Always RECV/SEND with MSG_DONTWAIT to (possibly) address + strange deadlock reported by Erik on the mailinglist --- + and/or issues with blocking read after select on GNU/Linux + (see select man page under bugs). -CG + Tue Mar 17 01:19:50 MDT 2009 Added support for thread-pools. -CG/RA diff --git a/README b/README index 74ce8154..d1886e3f 100644 --- a/README +++ b/README @@ -73,7 +73,11 @@ reasonably complete. Missing features: ================= -- MHD_get_daemon_info is not implemented +- MHD_get_daemon_info is not implemented (always returns NULL) +- SSL support does not work with SELECT-based threading modes + (issue is that the gnutls state machine does not like EAGAIN/EINTR + return values from send/recv, despite having tons of + branches on those values). - SSL code is still too large: * libgcrypt is used, and is also bloated => integrate required portions of libgcrypt into our tree diff --git a/configure.ac b/configure.ac index 27b19066..2cc7254f 100644 --- a/configure.ac +++ b/configure.ac @@ -21,8 +21,8 @@ # # AC_PREREQ(2.57) -AC_INIT([libmicrohttpd], [0.4.0a],[libmicrohttpd@gnunet.org]) -AM_INIT_AUTOMAKE([libmicrohttpd], [0.4.0a]) +AC_INIT([libmicrohttpd], [0.4.1],[libmicrohttpd@gnunet.org]) +AM_INIT_AUTOMAKE([libmicrohttpd], [0.4.1]) AM_CONFIG_HEADER([MHD_config.h]) AC_CONFIG_MACRO_DIR([m4]) AH_TOP([#define _GNU_SOURCE 1]) diff --git a/doc/Doxyfile b/doc/Doxyfile index 22cfbe9c..727e7169 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -5,7 +5,7 @@ #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "GNU libmicrohttpd" -PROJECT_NUMBER = 0.4.0 +PROJECT_NUMBER = 0.4.1 OUTPUT_DIRECTORY = doc/doxygen/ CREATE_SUBDIRS = YES OUTPUT_LANGUAGE = English diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c index 7b3ff20c..67fe978a 100644 --- a/src/daemon/daemon.c +++ b/src/daemon/daemon.c @@ -522,7 +522,10 @@ recv_param_adapter (struct MHD_Connection *connection, void *other, size_t i) { if (connection->socket_fd == -1) return -1; - return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL); + if (0 != (connection->daemon->options & MHD_USE_SSL)) + return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL); + else + return RECV (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT); } /** @@ -539,7 +542,10 @@ send_param_adapter (struct MHD_Connection *connection, { if (connection->socket_fd == -1) return -1; - return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL); + if (0 != (connection->daemon->options & MHD_USE_SSL)) + return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL); + else + return SEND (connection->socket_fd, other, i, MSG_NOSIGNAL | MSG_DONTWAIT); } /** @@ -991,6 +997,7 @@ MHD_start_daemon (unsigned int options, return ret; } + /** * Start a webserver on the given port. * diff --git a/src/daemon/https/tls/gnutls_buffers.c b/src/daemon/https/tls/gnutls_buffers.c index fa41f28e..c687cb23 100644 --- a/src/daemon/https/tls/gnutls_buffers.c +++ b/src/daemon/https/tls/gnutls_buffers.c @@ -222,7 +222,6 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr, size_t left; ssize_t i = 0; char *ptr = iptr; - unsigned j, x, sum = 0; MHD_gnutls_transport_ptr_t fd = session->internals.transport_recv_ptr; session->internals.direction = 0; @@ -259,31 +258,18 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr, #endif } else - i = session->internals.MHD__gnutls_pull_func (fd, - &ptr[sizeOfPtr - left], - left); - + i = session->internals.MHD__gnutls_pull_func (fd, + &ptr[sizeOfPtr - left], + left); if (i < 0) { int err = session->internals.errnum ? session->internals.errnum : errno; - - MHD__gnutls_read_log - ("READ: %d returned from %d, errno=%d gerrno=%d\n", i, fd, errno, - session->internals.errnum); - - if (err == EAGAIN || err == EINTR) + if ( (err == EAGAIN) || (err == EINTR) ) { if (sizeOfPtr - left > 0) - { - - MHD__gnutls_read_log ("READ: returning %d bytes from %d\n", - sizeOfPtr - left, fd); - - goto finish; - } - MHD_gnutls_assert (); - + goto finish; + MHD_gnutls_assert (); if (err == EAGAIN) return GNUTLS_E_AGAIN; return GNUTLS_E_INTERRUPTED; @@ -296,46 +282,13 @@ MHD__gnutls_read (MHD_gtls_session_t session, void *iptr, } else { - - MHD__gnutls_read_log ("READ: Got %d bytes from %d\n", i, fd); - if (i == 0) break; /* EOF */ } - left -= i; - } finish: - - if (MHD__gnutls_log_level >= 7) - { - char line[128]; - char tmp[16]; - - MHD__gnutls_read_log ("READ: read %d bytes from %d\n", - (sizeOfPtr - left), fd); - - for (x = 0; x < ((sizeOfPtr - left) / 16) + 1; x++) - { - line[0] = 0; - - sprintf (tmp, "%.4x - ", x); - MHD_gtls_str_cat (line, sizeof (line), tmp); - - for (j = 0; j < 16; j++) - { - if (sum < (sizeOfPtr - left)) - { - sprintf (tmp, "%.2x ", ((unsigned char *) ptr)[sum++]); - MHD_gtls_str_cat (line, sizeof (line), tmp); - } - } - MHD__gnutls_read_log ("%s\n", line); - } - } - return (sizeOfPtr - left); } @@ -368,8 +321,9 @@ MHD_gtls_io_clear_peeked_data (MHD_gtls_session_t session) if (ret > 0) sum += ret; } - while (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN || sum - < RCVLOWAT); + while ( (ret == GNUTLS_E_INTERRUPTED) || + (ret == GNUTLS_E_AGAIN) || + (sum < RCVLOWAT) ); MHD_gnutls_afree (peekdata); @@ -721,15 +675,13 @@ MHD_gtls_io_write_buffered (MHD_gtls_session_t session, #endif } else - i = - session->internals.MHD__gnutls_push_func (fd, &ptr[n - left], left); - + i = session->internals.MHD__gnutls_push_func (fd, &ptr[n - left], left); if (i == -1) { int err = session->internals.errnum ? session->internals.errnum : errno; - if (err == EAGAIN || err == EINTR) + if ( (err == EAGAIN) || (err == EINTR) ) { session->internals.record_send_buffer_prev_size += n - left; @@ -742,11 +694,6 @@ MHD_gtls_io_write_buffered (MHD_gtls_session_t session, MHD_gnutls_assert (); return retval; } - - MHD__gnutls_write_log - ("WRITE: Interrupted. Stored %d bytes to buffer. Already sent %d bytes.\n", - left, n - left); - if (err == EAGAIN) return GNUTLS_E_AGAIN; return GNUTLS_E_INTERRUPTED; diff --git a/src/daemon/internal.h b/src/daemon/internal.h index 7b4a0e72..3af7b016 100644 --- a/src/daemon/internal.h +++ b/src/daemon/internal.h @@ -309,7 +309,7 @@ enum MHD_CONNECTION_STATE MHD_TLS_HANDSHAKE_FAILED, - MHD_TLS_HANDSHAKE_COMPLETE, + MHD_TLS_HANDSHAKE_COMPLETE }; diff --git a/src/testcurl/https/tls_extension_test.c b/src/testcurl/https/tls_extension_test.c index 31b57e55..062dec93 100644 --- a/src/testcurl/https/tls_extension_test.c +++ b/src/testcurl/https/tls_extension_test.c @@ -242,6 +242,11 @@ main (int argc, char *const *argv) return -1; } + i = 0; + setup_session (&session, &key, &cert, &xcred); + errorCount += test_hello_extension (session, ext_arr[i], 1, 16); + teardown_session (session, &key, &cert, xcred); +#if 0 i = 0; while (ext_arr[i] != -1) { @@ -259,6 +264,7 @@ main (int argc, char *const *argv) teardown_session (session, &key, &cert, xcred); i++; } +#endif print_test_result (errorCount, argv[0]); -- cgit v1.2.3