Mystery solved: Adding "-O2" to CFLAGS (an "-Ox" parameter was missing) solved the problem. Seems to be an GCC issue. I don't know if postfix should compile and work fine without this or with another optimizer level.
If someone wants to debug this further: The pointer to the problem is within src/local/recipient.c:319 when the "state" struct is passed to deliver_switch(): Just before the call the struct members are set correct, then on entering the function, the members are reset to the original values on the stack when deliver_recipient() (the calling function) was entered (and thus state.msg_attr.local is reset to 0x0). 2010/7/14 Kai Krakow <[email protected]>: > Hello! > > I've just upgraded a working setup from postfix 2.5.5 to 2.6.6 on a > Gentoo box. Since then, when postfix/local tries to do user name > expansion (as far as I learned from the backtrace), it segfaults: > > ------------------------8<---------------------- > #0 0x11286469 in vstring_strcpy (vp=0x112b8c50, src=0x0) at vstring.c:409 > #1 0x112736d9 in dict_db_lookup (dict=0x112b8bd0, name=0x0) at dict_db.c:200 > #2 0x1124a83e in deliver_alias (state= > {level = 1, msg_attr = {level = 0, fp = 0x112bec50, queue_name = > 0x112beb40 "active", queue_id = 0x112be868 "0658546584CA", offset = > 218, encoding = 0x11298018 "", sender = 0x11298018 "", dsn_envid = > 0x11298018 "", dsn_ret = 0, rcpt = {offset = 191, dsn_orcpt = > 0x11298018 "", dsn_notify = 0, orig_addr = 0x112bec00 > "[email protected]", address = 0x112bec28 > "[email protected]", u = {status = 0, queue = 0x0, addr_type = > 0x0}}, domain = 0x0, local = 0x0, user = 0x0, extension = 0x0, > unmatched = 0x0, owner = 0x0, delivered = 0x0, relay = 0x5cea5943 > "local", msg_stats = {incoming_arrival = {tv_sec = 1279051621, tv_usec > = 25651}, active_arrival = {tv_sec = 1279125222, tv_usec = 792273}, > agent_handoff = {tv_sec = 1279125222, tv_usec = 906187}, > conn_setup_done = {tv_sec = 0, tv_usec = 0}, deliver_done = {tv_sec = > 0, tv_usec = 0}, reuse_count = 0}, exp_type = 0, exp_from = 0x0, > request = 0x112be1a8, why = 0x112bed20}, dup_filter = 0x112c0980, > loop_info = 0x112bf038, request = 0x112be1a8}, usr_attr={uid = 0, gid > = 0, home = 0x0, logname = 0x0, shell = 0x0}, name=0x0, > statusp=0x5cea4c48) at alias.c:199 > #3 0x11250df9 in deliver_switch (state= > {level = 1, msg_attr = {level = 0, fp = 0x112bec50, queue_name = > 0x112beb40 "active", queue_id = 0x112be868 "0658546584CA", offset = > 218, encoding = 0x11298018 "", sender = 0x11298018 "", dsn_envid = > 0x11298018 "", dsn_ret = 0, rcpt = {offset = 191, dsn_orcpt = > 0x11298018 "", dsn_notify = 0, orig_addr = 0x112bec00 > "[email protected]", address = 0x112bec28 > "[email protected]", u = {status = 0, queue = 0x0, addr_type = > 0x0}}, domain = 0x0, local = 0x0, user = 0x0, extension = 0x0, > unmatched = 0x0, owner = 0x0, delivered = 0x0, relay = 0x5cea5943 > "local", msg_stats = {incoming_arrival = {tv_sec = 1279051621, tv_usec > = 25651}, active_arrival = {tv_sec = 1279125222, tv_usec = 792273}, > agent_handoff = {tv_sec = 1279125222, tv_usec = 906187}, > conn_setup_done = {tv_sec = 0, tv_usec = 0}, deliver_done = {tv_sec = > 0, tv_usec = 0}, reuse_count = 0}, exp_type = 0, exp_from = 0x0, > request = 0x112be1a8, why = 0x112bed20}, dup_filter = 0x112c0980, > loop_info = 0x112bf038, request = 0x112be1a8}, usr_attr={uid = 0, gid > = 0, home = 0x0, logname = 0x0, shell = 0x0}) at recipient.c:135 > #4 0x11251af8 in deliver_recipient (state= > {level = 1, msg_attr = {level = 0, fp = 0x112bec50, queue_name = > 0x112beb40 "active", queue_id = 0x112be868 "0658546584CA", offset = > 218, encoding = 0x11298018 "", sender = 0x11298018 "", dsn_envid = > 0x11298018 "", dsn_ret = 0, rcpt = {offset = 191, dsn_orcpt = > 0x11298018 "", dsn_notify = 0, orig_addr = 0x112bec00 > "[email protected]", address = 0x112bec28 > "[email protected]", u = {status = 0, queue = 0x0, addr_type = > 0x0}}, domain = 0x112c0a7d "AAAAA.AAAAAAAAA.AA", local = 0x112c0a78 > "root", user = 0x112c0aa0 "root", extension = 0x0, unmatched = 0x0, > owner = 0x0, delivered = 0x112bec28 "[email protected]", relay = > 0x5cea5943 "local", msg_stats = {incoming_arrival = {tv_sec = > 1279051621, tv_usec = 25651}, active_arrival = {tv_sec = 1279125222, > tv_usec = 792273}, agent_handoff = {tv_sec = 1279125222, tv_usec = > 906187}, conn_setup_done = {tv_sec = 0, tv_usec = 0}, deliver_done = > {tv_sec = 0, tv_usec = 0}, reuse_count = 0}, exp_type = 0, exp_from = > 0x0, request = 0x112be1a8, why = 0x112bed20}, dup_filter = 0x112c0980, > loop_info = 0x112bf038, request = 0x112be1a8}, usr_attr={uid = 0, gid > = 0, home = 0x0, logname = 0x0, shell = 0x0}) at recipient.c:319 > #5 0x1124f246 in local_deliver (rqst=0x112be1a8, service=0x5cea5943 > "local") at local.c:718 > #6 0x1124f3c5 in local_service (stream=0x112bd0c8, service=0x5cea5943 > "local", argv=0x5cea5880) at local.c:756 > #7 0x11254c53 in single_server_wakeup (fd=14) at single_server.c:262 > #8 0x11254e1d in single_server_accept_local (unused_event=1, > context=0x6 <Address 0x6 out of bounds>) at single_server.c:304 > #9 0x1127a896 in event_loop (delay=-1) at events.c:1086 > #10 0x11255bd6 in single_server_main (argc=3, argv=0x5cea5874, > service=0x1124f351 <local_service>) at single_server.c:732 > #11 0x1124f892 in main (argc=3, argv=0x5cea5874) at local.c:917 > ------------------------8<---------------------- > > Here's postconf -n: > > ------------------------8<---------------------- > address_verify_map = btree:/var/lib/postfix/verify > alias_database = hash:/etc/mail/aliases > alias_maps = hash:/var/lib/mailman/data/aliases hash:/etc/mail/aliases > broken_sasl_auth_clients = yes > command_directory = /usr/sbin > config_directory = /etc/postfix > daemon_directory = //usr/lib/postfix > data_directory = /var/lib/postfix > debug_peer_level = 2 > default_destination_concurrency_limit = 20 > default_process_limit = 500 > home_mailbox = .maildir/ > html_directory = /usr/share/doc/postfix-2.6.6/html > local_destination_concurrency_limit = 2 > mail_owner = postfix > mailbox_size_limit = 104857600 > mailq_path = /usr/bin/mailq > manpage_directory = /usr/share/man > message_size_limit = 52428800 > mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain > mydomain = AAAAA.AAAAAAAAA.AA > myhostname = AAAAA.AAAAAAAAA.AA > mynetworks = 127.0.0.0/8, DDD.DDD.DDD.DD, DD.DDD.DD.DD/DD > newaliases_path = /usr/bin/newaliases > queue_directory = /var/spool/postfix > rbl_reply_maps = ${stress?hash:/etc/postfix/rbl_reply_maps} > readme_directory = /usr/share/doc/postfix-2.6.6/readme > recipient_delimiter = + > sendmail_path = /usr/sbin/sendmail > setgid_group = postdrop > smtpd_banner = $myhostname ESMTP $mail_name (AAAAAAAAA Mail Service). > We block/report all spam. We use greylisting. > smtpd_client_connection_count_limit = 50 > smtpd_client_connection_rate_limit = 30 > smtpd_client_message_rate_limit = 100 > smtpd_client_recipient_rate_limit = 2000 > smtpd_error_sleep_time = 5s > smtpd_hard_error_limit = ${stress?1}${stress:20} > smtpd_helo_required = yes > smtpd_junk_command_limit = 20 > smtpd_recipient_restrictions = reject_unlisted_recipient > reject_unknown_recipient_domain check_recipient_access > hash:/etc/postfix/block_recipients permit_mynetworks > permit_sasl_authenticated reject_unauth_destination > reject_non_fqdn_recipient reject_invalid_helo_hostname > reject_rbl_client zen.spamhaus.org=127.0.0.10 reject_rbl_client > zen.spamhaus.org=127.0.0.11 reject_rbl_client zen.spamhaus.org > check_sender_access hash:/etc/postfix/whitelisted_senders > check_policy_service inet:127.0.0.1:12525 check_policy_service > unix:private/postgrey check_policy_service unix:private/spf > smtpd_sasl_auth_enable = yes > smtpd_sasl_local_domain = $myhostname > smtpd_sasl_path = private/auth > smtpd_sasl_security_options = noanonymous > smtpd_sasl_type = dovecot > smtpd_sender_restrictions = hash:/etc/postfix/sender_access > smtpd_soft_error_limit = 10 > smtpd_timeout = ${stress?10}${stress:60} > transport_maps = hash:/etc/postfix/transport > unknown_local_recipient_reject_code = 550 > unverified_sender_reject_code = 550 > virtual_alias_domains = > virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman > proxy:mysql:/etc/postfix/mysql-virtual_alias_maps.cf > virtual_gid_maps = static:2000 > virtual_mailbox_base = /data/mailhosts/ > virtual_mailbox_domains = > proxy:mysql:/etc/postfix/mysql-virtual_mailbox_domains.cf > virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf > virtual_transport = maildrop > virtual_uid_maps = static:2000 > ------------------------8<---------------------- > > It looks like deliver_alias() gets passed a null pointer for name, > later in the code path postfix tries to copy a string to this pointer > - thus the segfault. But I cannot figure out why that is and if it'd > be fixable in the config. > > Since this is a production system, any help is appreciated. Virtual > users managed by MySQL aren't affected - works like a charm there. > That's why it took some days before the few system users started to > miss mails - the queue has about 2000 deferred mails now. :-( > > Regards, > Kai > -- Regards, Kai Krakow http://hurikhan77.wordpress.com/
