-
Notifications
You must be signed in to change notification settings - Fork 742
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mail/isync: Resolve "unexpected EOF" SSL error
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
Showing
4 changed files
with
54 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 *******************/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 ) | ||
{ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |