Dovecot 2.3.6 on Solaris10: build issues, segfaults
Timo Sirainen
timo at sirainen.com
Wed Jul 10 10:44:01 EEST 2019
On 9 Jul 2019, at 3.02, Joseph Tam via dovecot <dovecot at dovecot.org> wrote:
>
> Issue 3) dovecot/doveconf segfaults on startup
>
> It crashes here while processing dovecot.conf, as does "doveconf"
>
> (settings-parser.c:1519 in setting_copy())
> *dest_size = *src_size;
This is correct code.
> It appears *src_size is not an 8-byte address aligned (0x5597c).
> It inherits this value from the calling routine as the sum of
> "set" (8-byte aligned) + "def->offset"=20 => misaligned address.
>
> (settings-parser.c:1597 in settings_dup_full())
> src = CONST_PTR_OFFSET(set, def->offset);
>
> (gdb) p set
> $2 = (const void *) 0x55968
> (gdb) p *def
> $3 = {type = SET_SIZE, key = 0x2d548 "submission_max_mail_size", offset = 20, list_info = 0x0}
This is unexpected. But I don't see how it's a Dovecot bug. It seems as if your compiler doesn't do padding correctly and then crashes because it didn't do it correctly. I guess you're compiling this as 32bit? Is size_t 32bit or 64bit?
Can you try with the below small test program if it prints the same 20?
#include <stdio.h>
#include <stdbool.h>
#include <stddef.h>
#define in_port_t unsigned short
struct submission_settings {
bool verbose_proctitle;
const char *rawlog_dir;
const char *hostname;
const char *login_greeting;
const char *login_trusted_networks;
/* submission: */
size_t submission_max_mail_size;
unsigned int submission_max_recipients;
const char *submission_client_workarounds;
const char *submission_logout_format;
/* submission backend: */
const char *submission_backend_capabilities;
/* submission relay: */
const char *submission_relay_host;
in_port_t submission_relay_port;
bool submission_relay_trusted;
const char *submission_relay_user;
const char *submission_relay_master_user;
const char *submission_relay_password;
const char *submission_relay_ssl;
bool submission_relay_ssl_verify;
const char *submission_relay_rawlog_dir;
unsigned int submission_relay_max_idle_time;
unsigned int submission_relay_connect_timeout;
unsigned int submission_relay_command_timeout;
/* imap urlauth: */
const char *imap_urlauth_host;
in_port_t imap_urlauth_port;
int parsed_workarounds;
};
int main(void)
{
struct submission_settings set;
printf("offset = %ld\n", offsetof(struct submission_settings, submission_max_mail_size));
printf("size = %ld\n", sizeof(set.submission_max_mail_size));
return 0;
}
More information about the dovecot
mailing list