From f82c172d2b41ba7b30875167c86ccc073682a35c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Sun, 1 Jul 2018 11:05:21 +0200 Subject: [PATCH 1/4] fix IMAP UID sequence also in imap_find_new_msgs() use just * instead of the rather nonsensical *:* (which davmail happens to actually barf at). amends 72be55b0 (and 0a5a8479). --- src/drv_imap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drv_imap.c b/src/drv_imap.c index 05afa09..4fbc43e 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -2922,7 +2922,7 @@ imap_find_new_msgs_p2( imap_store_t *ctx, imap_cmd_t *gcmd, int response ) cmd->uid = cmdp->uid; cmd->gen.param.lastuid = 1; imap_exec( ctx, &cmd->gen, imap_find_new_msgs_p3, - "UID FETCH *:* (UID)" ); + "UID FETCH * (UID)" ); } static void From 8a40554f076c484a37f777ba2fff008810349b0f Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Fri, 18 May 2018 15:11:15 +0200 Subject: [PATCH 2/4] User functions provided by recent LibreSSL versions At least on OpenBSD, this enables new APIs out of the box provided by LibreSSL 2.7.1 and higher. From Jeremie Courreges-Anglas . --- src/socket.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/socket.c b/src/socket.c index 9112dac..dd79619 100644 --- a/src/socket.c +++ b/src/socket.c @@ -40,7 +40,8 @@ # include # include # include -# if OPENSSL_VERSION_NUMBER < 0x10100000L +# if OPENSSL_VERSION_NUMBER < 0x10100000L \ + || (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER >= 0x2070100fL) # define X509_OBJECT_get0_X509(o) ((o)->data.x509) # define X509_STORE_get0_objects(o) ((o)->objs) # endif From 470210fa864a56d0f46aa97ba6cc70e703b7432a Mon Sep 17 00:00:00 2001 From: Klemens Nanni Date: Fri, 18 May 2018 15:24:49 +0200 Subject: [PATCH 3/4] Fix time_t format strings For time_t, long long handles dates after Y2038 and should be safe on 32-bit architectures. From Jeremie Courreges-Anglas . --- src/drv_maildir.c | 6 +++--- src/drv_proxy.c | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/drv_maildir.c b/src/drv_maildir.c index 4a94696..958dde8 100644 --- a/src/drv_maildir.c +++ b/src/drv_maildir.c @@ -1570,7 +1570,7 @@ maildir_store_msg( store_t *gctx, msg_data_t *data, int to_trash, uint uid; char buf[_POSIX_PATH_MAX], nbuf[_POSIX_PATH_MAX], fbuf[NUM_FLAGS + 3], base[128]; - bl = nfsnprintf( base, sizeof(base), "%ld.%d_%d.%s", (long)time( 0 ), Pid, ++MaildirCount, Hostname ); + bl = nfsnprintf( base, sizeof(base), "%lld.%d_%d.%s", (long long)time( 0 ), Pid, ++MaildirCount, Hostname ); if (!to_trash) { #ifdef USE_DB if (ctx->usedb) { @@ -1751,8 +1751,8 @@ maildir_trash_msg( store_t *gctx, message_t *gmsg, for (;;) { nfsnprintf( buf, sizeof(buf), "%s/%s/%s", ctx->path, subdirs[gmsg->status & M_RECENT], msg->base ); s = strstr( msg->base, ((maildir_store_conf_t *)gctx->conf)->info_prefix ); - nfsnprintf( nbuf, sizeof(nbuf), "%s/%s/%ld.%d_%d.%s%s", ctx->trash, - subdirs[gmsg->status & M_RECENT], (long)time( 0 ), Pid, ++MaildirCount, Hostname, s ? s : "" ); + nfsnprintf( nbuf, sizeof(nbuf), "%s/%s/%lld.%d_%d.%s%s", ctx->trash, + subdirs[gmsg->status & M_RECENT], (long long)time( 0 ), Pid, ++MaildirCount, Hostname, s ? s : "" ); if (!rename( buf, nbuf )) break; if (!stat( buf, &st )) { diff --git a/src/drv_proxy.c b/src/drv_proxy.c index 5010f60..6a62f22 100644 --- a/src/drv_proxy.c +++ b/src/drv_proxy.c @@ -239,8 +239,8 @@ proxy_@name@( store_t *gctx@decl_args@, void (*cb)( @decl_cb_args@void *aux ), v static char fbuf[as(Flags) + 1]; proxy_make_flags( cmd->data->flags, fbuf ); //# END -//# DEFINE fetch_msg_print_fmt_cb_args , flags=%s, date=%ld, size=%d -//# DEFINE fetch_msg_print_pass_cb_args , fbuf, cmd->data->date, cmd->data->len +//# DEFINE fetch_msg_print_fmt_cb_args , flags=%s, date=%lld, size=%d +//# DEFINE fetch_msg_print_pass_cb_args , fbuf, (long long)cmd->data->date, cmd->data->len //# DEFINE fetch_msg_print_cb_args if (sts == DRV_OK && (DFlags & DEBUG_DRV_ALL)) { printf( "%s=========\n", cmd->gen.ctx->label ); @@ -254,8 +254,8 @@ proxy_@name@( store_t *gctx@decl_args@, void (*cb)( @decl_cb_args@void *aux ), v static char fbuf[as(Flags) + 1]; proxy_make_flags( data->flags, fbuf ); //# END -//# DEFINE store_msg_print_fmt_args , flags=%s, date=%ld, size=%d, to_trash=%s -//# DEFINE store_msg_print_pass_args , fbuf, data->date, data->len, to_trash ? "yes" : "no" +//# DEFINE store_msg_print_fmt_args , flags=%s, date=%lld, size=%d, to_trash=%s +//# DEFINE store_msg_print_pass_args , fbuf, (long long)data->date, data->len, to_trash ? "yes" : "no" //# DEFINE store_msg_print_args if (DFlags & DEBUG_DRV_ALL) { printf( "%s>>>>>>>>>\n", ctx->label ); From f698f16967ae8341ff4b506f96b8cd5790c05d27 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Sun, 1 Jul 2018 13:22:17 +0200 Subject: [PATCH 4/4] fix type of 'port' and check its range in config reader --- src/drv_imap.c | 12 +++++++++--- src/socket.h | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/drv_imap.c b/src/drv_imap.c index 4fbc43e..d76328e 100644 --- a/src/drv_imap.c +++ b/src/drv_imap.c @@ -3132,9 +3132,15 @@ imap_parse_store( conffile_t *cfg, store_conf_t **storep ) server->pass = nfstrdup( cfg->val ); else if (!strcasecmp( "PassCmd", cfg->cmd )) server->pass_cmd = nfstrdup( cfg->val ); - else if (!strcasecmp( "Port", cfg->cmd )) - server->sconf.port = parse_int( cfg ); - else if (!strcasecmp( "Timeout", cfg->cmd )) + else if (!strcasecmp( "Port", cfg->cmd )) { + int port = parse_int( cfg ); + if ((unsigned)port > 0xffff) { + error( "%s:%d: Invalid port number\n", cfg->file, cfg->line ); + cfg->err = 1; + } else { + server->sconf.port = (ushort)port; + } + } else if (!strcasecmp( "Timeout", cfg->cmd )) server->sconf.timeout = parse_int( cfg ); else if (!strcasecmp( "PipelineDepth", cfg->cmd )) { if ((server->max_in_progress = parse_int( cfg )) < 1) { diff --git a/src/socket.h b/src/socket.h index 36ebe09..f80c2ef 100644 --- a/src/socket.h +++ b/src/socket.h @@ -43,7 +43,7 @@ enum { typedef struct { char *tunnel; char *host; - int port; + ushort port; int timeout; #ifdef HAVE_LIBSSL char *cert_file;