File: fix-gnutls-send-recv-when-return-eagain

package info (click to toggle)
riemann-c-client 1.10.4-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 576 kB
  • sloc: ansic: 4,082; makefile: 122; sh: 35
file content (46 lines) | stat: -rw-r--r-- 1,870 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Origin: upstream, 9e382db87bd1703423760bbe104a66e7cdfcf5a6
Description: Fix GnuTLS send/recv when returning GNUTLS_E_AGAIN
 Some values returned from gnutls_record_send() / gnutls_record_recv() indicate
 that the operation could not be done. In such cases, the error should not
 propagate to the caller but be operation should be retried.
 .
 Upstream fixed this issue in 9e382db87bd1703423760bbe104a66e7cdfcf5a6 with a
 lot more changes, so this patch only fix the wrong behavior.
Author: Romain Tartière <romain@blogreen.org>
Forwarded: not-needed
---
--- riemann-c-client-1.10.4.orig/lib/riemann/client/tls-gnutls.c
+++ riemann-c-client-1.10.4/lib/riemann/client/tls-gnutls.c
@@ -202,7 +202,9 @@ _riemann_client_send_message_tls (rieman
   if (!buffer)
     return -errno;
 
-  sent = gnutls_record_send (client->tls.session, buffer, len);
+  do {
+    sent = gnutls_record_send (client->tls.session, buffer, len);
+  } while (sent == GNUTLS_E_AGAIN || sent == GNUTLS_E_INTERRUPTED);
   if (sent < 0 || (size_t)sent != len)
     {
       free (buffer);
@@ -220,7 +222,9 @@ _riemann_client_recv_message_tls (rieman
   ssize_t received;
   riemann_message_t *message;
 
-  received = gnutls_record_recv (client->tls.session, &header, sizeof (header));
+  do {
+    received = gnutls_record_recv (client->tls.session, &header, sizeof (header));
+  } while (received == GNUTLS_E_AGAIN || received == GNUTLS_E_INTERRUPTED);
   if (received != sizeof (header))
     {
       errno = EPROTO;
@@ -230,7 +234,9 @@ _riemann_client_recv_message_tls (rieman
 
   buffer = (uint8_t *) malloc (len);
 
-  received = gnutls_record_recv (client->tls.session, buffer, len);
+  do {
+    received = gnutls_record_recv (client->tls.session, buffer, len);
+  } while (received == GNUTLS_E_AGAIN || received == GNUTLS_E_INTERRUPTED);
   if (received != len)
     {
       free (buffer);