[Pkg-mutt-maintainers] Bug#855424: mutt: don't check errno if read/write didn't error
Edward Betts
edward at 4angle.com
Fri Feb 17 20:55:13 UTC 2017
Package: mutt
Version: 1.7.2-1
Severity: normal
Tags: patch
The code in raw_socket_read function invokes the read system call and
checks if there was an error, indicated by a return value of -1.
If read doesn't return an error, but the global variable errno is set
to EINTR then error handling runs. This is incorrect, error handling
should only happen if read returns -1. When read doesn't result in an
error it doesn't set errno.
The same is true for raw_socket_write and the write sytem call.
This makes mutt close to unusable when interacting with a non-SSL IMAP
server. Mutt gives this message "Error talking to localhost (Interrupted
system call)" and closes the mailbox.
There is a patch to fix this problem.
--- mutt-1.7.2/mutt_socket.c 2017-02-17 20:34:41.000000000 +0000
+++ new/mutt_socket.c 2017-02-17 20:34:31.791530257 +0000
@@ -397,46 +397,36 @@
int raw_socket_read (CONNECTION* conn, char* buf, size_t len)
{
int rc;
mutt_allow_interrupt (1);
if ((rc = read (conn->fd, buf, len)) == -1)
{
mutt_error (_("Error talking to %s (%s)"), conn->account.host,
strerror (errno));
mutt_sleep (2);
- } else if (errno == EINTR) {
- rc = -1;
- mutt_error (_("Error talking to %s (%s)"), conn->account.host,
- strerror (errno));
- mutt_sleep (2);
- }
+ }
mutt_allow_interrupt (0);
return rc;
}
int raw_socket_write (CONNECTION* conn, const char* buf, size_t count)
{
int rc;
mutt_allow_interrupt (1);
if ((rc = write (conn->fd, buf, count)) == -1)
{
mutt_error (_("Error talking to %s (%s)"), conn->account.host,
strerror (errno));
mutt_sleep (2);
- } else if (errno == EINTR) {
- rc = -1;
- mutt_error (_("Error talking to %s (%s)"), conn->account.host,
- strerror (errno));
- mutt_sleep (2);
}
mutt_allow_interrupt (0);
return rc;
}
int raw_socket_poll (CONNECTION* conn)
{
fd_set rfds;
struct timeval tv = { 0, 0 };
More information about the Pkg-mutt-maintainers
mailing list