Kai Krakow:
> 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.

It *should* work with all optimization levels. except for:

- Bugs in the compiler, where the optimizer breaks valid code.

- Bugs in Postfix, where I rely on behavior that is not promised
  by the C standard.

It can require a great deal of time to figure out which the
problem is. Fortunately it looks like you have done most of it.

> 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).

That would be a compiler bug, possibly compiler version dependent. 

C has supported "structure" valued function parameters for about 30
years. Although implementations of this feature have changed, it
should never break when calling a function in the same program that
is compiled with the same compiler options (and the Postfix build
system recompiles all code when you change compiler options with
"make makefiles").

        Wietse

> 2010/7/14 Kai Krakow <hurikhan77+post...@googlemail.com>:
> > 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
> > "a...@aaaaa.aaaaaaaaa.aa", address = 0x112bec28
> > "a...@aaaaa.aaaaaaaaa.aa", 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
> > "a...@aaaaa.aaaaaaaaa.aa", address = 0x112bec28
> > "a...@aaaaa.aaaaaaaaa.aa", 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
> > "a...@aaaaa.aaaaaaaaa.aa", address = 0x112bec28
> > "a...@aaaaa.aaaaaaaaa.aa", 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 "r...@weser.netactive.de", 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/
> 
> 

Reply via email to