guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/04: gnu: gnutls: Patch the Guile bindings for EINTR/EAGAIN handling.


From: guix-commits
Subject: 01/04: gnu: gnutls: Patch the Guile bindings for EINTR/EAGAIN handling.
Date: Sat, 31 Jul 2021 17:47:14 -0400 (EDT)

civodul pushed a commit to branch core-updates-frozen
in repository guix.

commit 69dde4e354efee56422eb3527691b0714b596b49
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Sat Jul 31 15:44:58 2021 +0200

    gnu: gnutls: Patch the Guile bindings for EINTR/EAGAIN handling.
    
    * gnu/packages/patches/gnutls-guile-eintr-eagain.patch: New file.
    * gnu/local.mk (dist_patch_DATA): Add it.
    * gnu/packages/tls.scm (gnutls)[source]: Use it.
---
 gnu/local.mk                                       |  1 +
 .../patches/gnutls-guile-eintr-eagain.patch        | 56 ++++++++++++++++++++++
 gnu/packages/tls.scm                               |  3 +-
 3 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/gnu/local.mk b/gnu/local.mk
index 812c997..acce61d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1144,6 +1144,7 @@ dist_patch_DATA =                                         
\
   %D%/packages/patches/gnupg-default-pinentry.patch            \
   %D%/packages/patches/gnutls-skip-trust-store-test.patch      \
   %D%/packages/patches/gnutls-cross.patch                      \
+  %D%/packages/patches/gnutls-guile-eintr-eagain.patch         \
   %D%/packages/patches/gobject-introspection-absolute-shlib-path.patch \
   %D%/packages/patches/gobject-introspection-cc.patch          \
   %D%/packages/patches/gobject-introspection-girepository.patch        \
diff --git a/gnu/packages/patches/gnutls-guile-eintr-eagain.patch 
b/gnu/packages/patches/gnutls-guile-eintr-eagain.patch
new file mode 100644
index 0000000..e04c945
--- /dev/null
+++ b/gnu/packages/patches/gnutls-guile-eintr-eagain.patch
@@ -0,0 +1,56 @@
+Fixes <https://issues.guix.gnu.org/47867>.
+
+This fix was merged upstream
+in <https://gitlab.com/gnutls/gnutls/-/merge_requests/1417> and will
+be in GnuTLS 3.7.3.  Upstream commit:
+
+commit 110e2172dbef1fbdf7399dab1e80780847b61c0c
+Author: Ludovic Courtès <ludo@gnu.org>
+Date:   Sat Apr 24 22:02:14 2021 +0200
+
+    guile: Writes to record ports handle EAGAIN/EINTR transparently.
+
+diff --git a/guile/src/core.c b/guile/src/core.c
+index a13670fc7b..0926dc8a97 100644
+--- a/guile/src/core.c
++++ b/guile/src/core.c
+@@ -985,7 +985,10 @@ write_to_session_record_port (SCM port, const void *data, 
size_t size)
+       c_result = gnutls_record_send (c_session, (char *) data + c_sent,
+                                      size - c_sent);
+       if (EXPECT_FALSE (c_result < 0))
+-        scm_gnutls_error (c_result, FUNC_NAME);
++      {
++        if (c_result != GNUTLS_E_AGAIN && c_result != GNUTLS_E_INTERRUPTED)
++          scm_gnutls_error (c_result, FUNC_NAME);
++      }
+       else
+         c_sent += c_result;
+     }
+@@ -1069,7 +1072,8 @@ read_from_session_record_port (SCM port, SCM dst, size_t 
start, size_t count)
+ #undef FUNC_NAME
+ 
+ /* Return the file descriptor that backs PORT.  This function is called upon a
+-   blocking read--i.e., 'read_from_session_record_port' returned -1.  */
++   blocking read--i.e., 'read_from_session_record_port' or
++   'write_to_session_record_port' returned -1.  */
+ static int
+ session_record_port_fd (SCM port)
+ {
+@@ -1097,7 +1101,16 @@ write_to_session_record_port (SCM port, SCM src, size_t 
start, size_t count)
+   c_session = scm_to_gnutls_session (session, 1, FUNC_NAME);
+   data = (char *) SCM_BYTEVECTOR_CONTENTS (src) + start;
+ 
+-  result = gnutls_record_send (c_session, data, count);
++  do
++    result = gnutls_record_send (c_session, data, count);
++  while (result == GNUTLS_E_INTERRUPTED
++       || (result == GNUTLS_E_AGAIN
++           && !SCM_GNUTLS_SESSION_TRANSPORT_IS_FD (c_session)));
++
++  if (result == GNUTLS_E_AGAIN
++      && SCM_GNUTLS_SESSION_TRANSPORT_IS_FD (c_session))
++    /* Tell Guile that reading would block.  */
++    return (size_t) -1;
+ 
+   if (EXPECT_FALSE (result < 0))
+     scm_gnutls_error (result, FUNC_NAME);
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 04271ce..fccda07 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -180,7 +180,8 @@ living in the same process.")
                                   (version-major+minor version)
                                   "/gnutls-" version ".tar.xz"))
               (patches (search-patches "gnutls-skip-trust-store-test.patch"
-                                       "gnutls-cross.patch"))
+                                       "gnutls-cross.patch"
+                                       "gnutls-guile-eintr-eagain.patch"))
               (sha256
                (base32
                 "0li7mwjnm64mbxhacz0rpf6i9qd83f53fvbrx96alpqqk9d6qvk4"))))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]