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