]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
ktls: _gnutls_ktls_enable: fix GNUTLS_KTLS_SEND calculation
authorDaiki Ueno <ueno@gnu.org>
Tue, 28 Jun 2022 01:53:55 +0000 (10:53 +0900)
committerDaiki Ueno <ueno@gnu.org>
Tue, 28 Jun 2022 02:51:11 +0000 (11:51 +0900)
Previously, if the first setsockopt for GNUTLS_KTLS_RECV fails and the
same socket is used for both sending and receiving, GNUTLS_KTLS_SEND
was unconditionally set.  This fixes the conditions and also adds more
logging.

Signed-off-by: Daiki Ueno <ueno@gnu.org>
lib/system/ktls.c

index b9f7a73fb58cad53529baa5e71a81100bfbb3a3c..ddf27fac76b137040943c87a81d58c92828d4b5d 100644 (file)
@@ -47,7 +47,7 @@
 gnutls_transport_ktls_enable_flags_t
 gnutls_transport_is_ktls_enabled(gnutls_session_t session){
        if (unlikely(!session->internals.initial_negotiation_completed)){
-               _gnutls_debug_log("Initial negotiation is not yet complete");
+               _gnutls_debug_log("Initial negotiation is not yet complete\n");
                return 0;
        }
 
@@ -57,16 +57,27 @@ gnutls_transport_is_ktls_enabled(gnutls_session_t session){
 void _gnutls_ktls_enable(gnutls_session_t session)
 {
        int sockin, sockout;
+
        gnutls_transport_get_int2(session, &sockin, &sockout);
 
-       if (setsockopt(sockin, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0)
+       if (setsockopt(sockin, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0) {
                session->internals.ktls_enabled |= GNUTLS_KTLS_RECV;
+               if (sockin == sockout) {
+                       session->internals.ktls_enabled |= GNUTLS_KTLS_SEND;
+               }
+       } else {
+               _gnutls_record_log("Unable to set TCP_ULP for read socket: %d\n",
+                                  errno);
+       }
 
        if (sockin != sockout) {
-               if (setsockopt(sockout, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0)
+               if (setsockopt(sockout, SOL_TCP, TCP_ULP, "tls", sizeof ("tls")) == 0) {
                        session->internals.ktls_enabled |= GNUTLS_KTLS_SEND;
-       } else
-               session->internals.ktls_enabled |= GNUTLS_KTLS_SEND;
+               } else {
+                       _gnutls_record_log("Unable to set TCP_ULP for write socket: %d\n",
+                                          errno);
+               }
+       }
 }
 
 int _gnutls_ktls_set_keys(gnutls_session_t session)