Skip to content

Commit

Permalink
mail/isync: Resolve "unexpected EOF" SSL error
Browse files Browse the repository at this point in the history
Fixes an issue where some IMAP servers, such as Gmail, do not send a
close notification (SSL_shutdown()) before closing the TCP socket,
leading to "unexpected EOF" errors with OpenSSL 3.0.

Now mbsync gracefully handles this scenario, preventing the following
error:

Socket error: secure read from imap.gmail.com ([IPv6 Address
Redacted]:993): error:0A000126:SSL routines::unexpected eof while
reading

PR:		274604
  • Loading branch information
fcharlier authored and ehaupt committed Oct 20, 2023
1 parent 29607c7 commit a4ef2ba
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 0 deletions.
1 change: 1 addition & 0 deletions mail/isync/Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
PORTNAME= isync
PORTVERSION= 1.4.4
PORTREVISION= 1
CATEGORIES= mail
MASTER_SITES= SF

Expand Down
25 changes: 25 additions & 0 deletions mail/isync/files/patch-src_drv__imap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
--- src/drv_imap.c.orig 2021-12-03 10:56:16 UTC
+++ src/drv_imap.c
@@ -1620,6 +1620,7 @@ imap_socket_read( void *aux )
error( "IMAP error: unexpected BYE response: %s\n", cmd );
/* We just wait for the server to close the connection now. */
ctx->expectEOF = 1;
+ socket_expect_eof( &ctx->conn );
} else {
/* We still need to wait for the LOGOUT's tagged OK. */
}
@@ -1882,10 +1883,12 @@ imap_cleanup_p2( imap_store_t *ctx,
imap_cleanup_p2( imap_store_t *ctx,
imap_cmd_t *cmd ATTR_UNUSED, int response )
{
- if (response == RESP_NO)
+ if (response == RESP_NO) {
imap_cancel_store( &ctx->gen );
- else if (response == RESP_OK)
+ } else if (response == RESP_OK) {
ctx->expectEOF = 1;
+ socket_expect_eof( &ctx->conn );
+ }
}

/******************* imap_open_store *******************/
18 changes: 18 additions & 0 deletions mail/isync/files/patch-src_socket.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
--- src/socket.c.orig 2021-12-03 10:56:16 UTC
+++ src/socket.c
@@ -810,6 +810,15 @@ socket_expect_activity( conn_t *conn, int expect )
conf_wakeup( &conn->fd_timeout, expect ? conn->conf->timeout : -1 );
}

+void
+socket_expect_eof( conn_t *sock )
+{
+#ifdef SSL_OP_IGNORE_UNEXPECTED_EOF // implies HAVE_LIBSSL
+ if (sock->ssl)
+ SSL_set_options( sock->ssl, SSL_OP_IGNORE_UNEXPECTED_EOF );
+#endif
+}
+
int
socket_read( conn_t *conn, char *buf, uint len )
{
10 changes: 10 additions & 0 deletions mail/isync/files/patch-src_socket.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--- src/socket.h.orig 2021-12-03 10:56:16 UTC
+++ src/socket.h
@@ -142,6 +142,7 @@ void socket_expect_activity( conn_t *sock, int expect
void socket_start_deflate( conn_t *conn );
void socket_close( conn_t *sock );
void socket_expect_activity( conn_t *sock, int expect );
+void socket_expect_eof( conn_t *sock );
int socket_read( conn_t *sock, char *buf, uint len ); /* never waits */
char *socket_read_line( conn_t *sock ); /* don't free return value; never waits */
typedef enum { KeepOwn = 0, GiveOwn } ownership_t;

0 comments on commit a4ef2ba

Please sign in to comment.