summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2019-02-23 18:57:09 +0100
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2019-03-02 21:15:19 +0100
commit1a84f73d69a00dda1b29968579fe2841207b51cc (patch)
tree6859315658f8ed9c137d45b8ade68f7b2cdae544
parent36a0179d9d946e733ad0eb74f62f5914962f4075 (diff)
downloadgnutls-1a84f73d69a00dda1b29968579fe2841207b51cc.tar.gz
doc: added more information on operation under multiple threads
Relates: #713 Signed-off-by: Nikos Mavrogiannopoulos <nmav@gnutls.org>
-rw-r--r--doc/cha-gtls-app.texi20
-rw-r--r--lib/state.c2
-rw-r--r--lib/system_override.c3
3 files changed, 19 insertions, 6 deletions
diff --git a/doc/cha-gtls-app.texi b/doc/cha-gtls-app.texi
index 9831db2da4..21df8e5fb3 100644
--- a/doc/cha-gtls-app.texi
+++ b/doc/cha-gtls-app.texi
@@ -234,11 +234,21 @@ Read-only access to objects, for example the credentials holding structures,
is also thread-safe.
A @code{gnutls_session_t} object could also be shared by two threads, one sending,
-the other receiving. In that case however, care must be taken during key
-updates and re-handshakes to be handled only by a single thread. The termination of a session
-should be handled, either by a single thread being active, or by the sender thread
-using @funcref{gnutls_bye} with @code{GNUTLS_SHUT_WR} and the receiving thread
-waiting for a return value of zero.
+the other receiving. However, care must be taken on the following use cases:
+@itemize
+@item The re-handshake process in TLS 1.2 or earlier must be handled only in
+a single thread and no other thread may be performing any operation.
+@item The flag @code{GNUTLS_AUTO_REAUTH} cannot be used safely in this mode of operation.
+@item Any other operation which may send or receive data, like key update (c.f.,
+@funcref{gnutls_session_key_update}), must not be performed while threads
+are receiving or writing.
+@item The termination of a session should be handled, either by a single thread being
+active, or by the sender thread using @funcref{gnutls_bye} with @code{GNUTLS_SHUT_WR}
+and the receiving thread waiting for a return value of zero (or timeout on
+certain servers which do not respond).
+@item The functions @funcref{gnutls_transport_set_errno} and @funcref{gnutls_record_get_direction}
+should not be relied during parallel operation.
+@end itemize
For several aspects of the library (e.g., the random generator, PKCS#11
operations), the library may utilize mutex locks (e.g., pthreads on GNU/Linux and CriticalSection on Windows)
diff --git a/lib/state.c b/lib/state.c
index 540a83c7b8..f4ab818ca3 100644
--- a/lib/state.c
+++ b/lib/state.c
@@ -1058,7 +1058,7 @@ void
* interrupted GnuTLS function.
*
* This function's output is unreliable if you are using the same
- * @session in different threads, for sending and receiving.
+ * @session in different threads for sending and receiving.
*
* Returns: 0 if interrupted while trying to read data, or 1 while trying to write data.
**/
diff --git a/lib/system_override.c b/lib/system_override.c
index fdf766509c..3c4805bc56 100644
--- a/lib/system_override.c
+++ b/lib/system_override.c
@@ -55,6 +55,9 @@
* variable that is used by GnuTLS (e.g., the application is linked to
* msvcr71.dll and gnutls is linked to msvcrt.dll).
*
+ * This function is unreliable if you are using the same
+ * @session in different threads for sending and receiving.
+ *
**/
void gnutls_transport_set_errno(gnutls_session_t session, int err)
{