From: Noam Postavsky Date: Mon, 6 May 2019 23:55:17 +0000 (-0400) Subject: Handle GNUTLS_E_AGAIN in emacs_gnutls_read (Bug#34341) X-Git-Tag: emacs-26.2.90~57 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=202ff53da267f9fa15f438e9c38603bbead6e890;p=emacs.git Handle GNUTLS_E_AGAIN in emacs_gnutls_read (Bug#34341) Don't merge to master, this has already been fixed there by 2019-01-15 "Fix unlikely races with GnuTLS, datagrams". * src/gnutls.c (emacs_gnutls_read): Similar to emacs_gnutls_write, when gnutls_record_recv returns GNUTLS_E_AGAIN set errno to EGAIN. --- diff --git a/src/gnutls.c b/src/gnutls.c index 3c16b6c9c31..b724c3592d0 100644 --- a/src/gnutls.c +++ b/src/gnutls.c @@ -753,8 +753,15 @@ emacs_gnutls_read (struct Lisp_Process *proc, char *buf, ptrdiff_t nbyte) /* The peer closed the connection. */ return 0; else if (emacs_gnutls_handle_error (state, rtnval)) - /* non-fatal error */ - return -1; + { + /* If we get GNUTLS_E_AGAIN, then set errno appropriately so that + wait_reading_process_output retries the correct way instead of + erroring out. */ + if (rtnval == GNUTLS_E_AGAIN) + errno = EAGAIN; + /* non-fatal error */ + return -1; + } else { /* a fatal error occurred */ return 0;