Re: postfix/local segfaults
On 07/22/2010 05:22 AM, Victor Duchovni wrote: On Wed, Jul 21, 2010 at 11:16:04PM +0200, Bas Mevissen wrote: Can you try what happens if you replace at typedef struct LOCAL_STATE { int level;/* nesting level, for logging */ DELIVER_ATTR msg_attr;/* message/recipient attributes */ DELIVER_REQUEST *request; /* as from queue manager */ } LOCAL_STATE; the first line with: typedef struct local_state { in virtual.h and same for DELIVER_ATTR and DELIVER_REQUEST? The difference is that the symbol LOCAL_STATE is now only used once. Most coding standards forbid to define a symbol more than once. The local(8) and virtual(8) servers are separately compiled programs (the latter being a stripped down version of the former). The header files in question are not used in the same compilation unit, and so this suggestion is not productive. Ah, even more fun. Using a different typedef with the same name all over the source tree. I would never recommend someone to have a global symbol redefined in the same source tree. Even if it are different applications as in this case. Anyway, my remarks is still valid if you change file local.h instead of virtual.h. -- Bas
Re: postfix/local segfaults
Bas, why should that make a difference if it was already proven that changing the optimization level of the compiler fixes the issue, and that it is probably a special corner case of hardened gcc3.4? I suppose it has to do with it's stack protecting techniques etc. 2010/7/22 Bas Mevissen ab...@basmevissen.nl: On 07/22/2010 05:22 AM, Victor Duchovni wrote: On Wed, Jul 21, 2010 at 11:16:04PM +0200, Bas Mevissen wrote: Can you try what happens if you replace at typedef struct LOCAL_STATE { int level; /* nesting level, for logging */ DELIVER_ATTR msg_attr; /* message/recipient attributes */ DELIVER_REQUEST *request; /* as from queue manager */ } LOCAL_STATE; the first line with: typedef struct local_state { in virtual.h and same for DELIVER_ATTR and DELIVER_REQUEST? The difference is that the symbol LOCAL_STATE is now only used once. Most coding standards forbid to define a symbol more than once. The local(8) and virtual(8) servers are separately compiled programs (the latter being a stripped down version of the former). The header files in question are not used in the same compilation unit, and so this suggestion is not productive. Ah, even more fun. Using a different typedef with the same name all over the source tree. I would never recommend someone to have a global symbol redefined in the same source tree. Even if it are different applications as in this case. Anyway, my remarks is still valid if you change file local.h instead of virtual.h. -- Regards, Kai Krakow http://hurikhan77.wordpress.com/
Re: postfix/local segfaults
Kai Krakow: Bas, why should that make a difference if it was already proven that changing the optimization level of the compiler fixes the issue, and that it is probably a special corner case of hardened gcc3.4? I suppose it has to do with it's stack protecting techniques etc. That is possible. Postfix passes a structure by value as a function argument, meaning that it will take up a larger than usual amount of stack space. This may violate assumptions about stack usage that are made by some stack protection mechanisms. The pass-by-value structure is part of a Postfix safety mechanism, and therefore I am not inclined to change it to work around buggy compiler features. Wietse
Re: postfix/local segfaults
On Thu, Jul 22, 2010 at 08:21:48AM +0200, Bas Mevissen wrote: The local(8) and virtual(8) servers are separately compiled programs (the latter being a stripped down version of the former). The header files in question are not used in the same compilation unit, and so this suggestion is not productive. Ah, even more fun. Using a different typedef with the same name all over the source tree. I would never recommend someone to have a global symbol redefined in the same source tree. Even if it are different applications as in this case. Anyway, my remarks is still valid if you change file local.h instead of virtual.h. I will refrain from responding in detail, there is nothing substantive here, the real issue is discussed in the other comments in this thread. Over and out. -- Viktor.
Re: postfix/local segfaults
2010/7/22 Wietse Venema wie...@porcupine.org: The pass-by-value structure is part of a Postfix safety mechanism, and therefore I am not inclined to change it to work around buggy compiler features. Wise decision... Stick with that. :-) -- Regards, Kai Krakow http://hurikhan77.wordpress.com/
Re: postfix/local segfaults
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 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...@a.a.aa, address = 0x112bec28 a...@a.a.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...@a.a.aa, address = 0x112bec28 a...@a.a.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...@a.a.aa, address = 0x112bec28 a...@a.a.aa, u = {status = 0, queue = 0x0, addr_type = 0x0}}, domain = 0x112c0a7d A.A.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
Re: postfix/local segfaults
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...@a.a.aa, address = 0x112bec28 a...@a.a.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...@a.a.aa, address = 0x112bec28 a...@a.a.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...@a.a.aa, address = 0x112bec28 a...@a.a.aa, u = {status = 0, queue = 0x0, addr_type = 0x0}}, domain = 0x112c0a7d A.A.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 =
Re: postfix/local segfaults
2010/7/21 Wietse Venema wie...@porcupine.org: That would be a compiler bug, possibly compiler version dependent. Yep, I'm sure it is. The postfix ebuild from gentoo contains some evidence that hardened gcc 3.4 may be problematic. In case you are interested, follow up bug report: http://bugs.gentoo.org/show_bug.cgi?id=328375 -- Regards, Kai Krakow http://hurikhan77.wordpress.com/
Re: postfix/local segfaults
On 07/21/2010 10:23 PM, Kai Krakow wrote: 2010/7/21 Wietse Venema wie...@porcupine.org: That would be a compiler bug, possibly compiler version dependent. Yep, I'm sure it is. The postfix ebuild from gentoo contains some evidence that hardened gcc 3.4 may be problematic. In case you are interested, follow up bug report: http://bugs.gentoo.org/show_bug.cgi?id=328375 Can you try what happens if you replace at typedef struct LOCAL_STATE { int level;/* nesting level, for logging */ DELIVER_ATTR msg_attr;/* message/recipient attributes */ DELIVER_REQUEST *request; /* as from queue manager */ } LOCAL_STATE; the first line with: typedef struct local_state { in virtual.h and same for DELIVER_ATTR and DELIVER_REQUEST? The difference is that the symbol LOCAL_STATE is now only used once. Most coding standards forbid to define a symbol more than once. Bas. -- Bas
Re: postfix/local segfaults
Original-Nachricht Datum: Wed, 21 Jul 2010 22:23:06 +0200 Von: Kai Krakow hurikhan77+post...@googlemail.com An: Postfix users postfix-users@postfix.org Betreff: Re: postfix/local segfaults 2010/7/21 Wietse Venema wie...@porcupine.org: That would be a compiler bug, possibly compiler version dependent. Yep, I'm sure it is. The postfix ebuild from gentoo contains some evidence that hardened gcc 3.4 may be problematic. In case you are interested, follow up bug report: http://bugs.gentoo.org/show_bug.cgi?id=328375 Ohh boy. That is stuff I wrote 5 years ago. -- Regards, Kai Krakow http://hurikhan77.wordpress.com/ -- Neu: GMX De-Mail - Einfach wie E-Mail, sicher wie ein Brief! Jetzt De-Mail-Adresse reservieren: http://portal.gmx.net/de/go/demail
Re: postfix/local segfaults
On Wed, Jul 21, 2010 at 11:16:04PM +0200, Bas Mevissen wrote: Can you try what happens if you replace at typedef struct LOCAL_STATE { int level;/* nesting level, for logging */ DELIVER_ATTR msg_attr;/* message/recipient attributes */ DELIVER_REQUEST *request; /* as from queue manager */ } LOCAL_STATE; the first line with: typedef struct local_state { in virtual.h and same for DELIVER_ATTR and DELIVER_REQUEST? The difference is that the symbol LOCAL_STATE is now only used once. Most coding standards forbid to define a symbol more than once. The local(8) and virtual(8) servers are separately compiled programs (the latter being a stripped down version of the former). The header files in question are not used in the same compilation unit, and so this suggestion is not productive. -- Viktor.
postfix/local segfaults
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...@a.a.aa, address = 0x112bec28 a...@a.a.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...@a.a.aa, address = 0x112bec28 a...@a.a.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...@a.a.aa, address = 0x112bec28 a...@a.a.aa, u = {status = 0, queue = 0x0, addr_type = 0x0}}, domain = 0x112c0a7d A.A.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