diff --git a/postfix/HISTORY b/postfix/HISTORY index d4768ac2e..1a2130d48 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -21876,3 +21876,48 @@ Apologies for any names omitted. TLS session tickets are supported as of OpenSSL 0.9.8h (May 2008). Files: mantools/postlink, proto/TLS_README.html, proto/postconf.proto. + +20150831 + + Cleanup: obsolete comments in Makefile.init. + +20150903 + + Workaround: disable DNSSEC support for AIX 7x and earlier. + The AIX 6/7 resolver(5) API defines RES_USE_DNSSEC without + defining the "ad" bit. Viktor Dukhovni. Files: makedefs, + proto/INSTALL.html, dns/dns.h. + +20150912 + + Future-proofing and code cleanup: exploit GCC and Clang + "warn_unused_result" feature to flag missing error checks. + Files: util/sys_defs.h, util/attr.h, util/edit_file.h, + util/listen.h, util/lstat_as.h, util/mac_expand.h, + util/mac_parse.h, util/myaddrinfo.h, util/myflock.h, + util/sane_fsops.h, util/sane_socketpair.h, util/stat_as.h, + util/base32_code.h, util/base64_code.h, util/hex_code.h, + util/timed_wait.h, util/vstream.h, src/util/vstring_vstream.h. + + Cleanup: incomplete error check. Found with WARN_UNUSED_RESULT + check. File: util/recv_pass_attr.c. + + Future-proofing: added type mis-match detection for + ATTR_TYPE_FUNC function-pointer arguments. File: util/attr.h. + + Cleanup: don't ignore seek-to-end-of-file errors. File: + global/record.c. + + Cleanup: use vstream_fpurge() to purge VSTREAM buffers, + instead of calling vstream_fseek() and ignoring ESPIPE + errors. File: smtpstone/qmqp-sink.c. + +20150913 + + Feature: SMTPD policy service "policy_context" attribute + and smtpd_policy_service_policy_context main.cf parameter. + Originally, to share the same SMTPD service endpoint among + multiple check_policy_service clients. Markus Benning. + Files: mantools/postlink, proto/SMTPD_POLICY_README.html, + proto/postconf.proto, global/mail_params.h, global/mail_proto.h, + smtpd/smtpd.c, smtpd/smtpd_check.c. diff --git a/postfix/INSTALL b/postfix/INSTALL index 5e5fa4e90..a17459181 100644 --- a/postfix/INSTALL +++ b/postfix/INSTALL @@ -539,6 +539,9 @@ The following is an extensive list of names and values. || |probably should also override DEF_DB_TYPE as | || |described in section 4.6. | ||_____________________________|______________________________________________| +||-DNO_DNSSEC |Do not build with DNSSEC support, even if the | +|| |resolver library appears to support it. | +||_____________________________|______________________________________________| || |Do not build with Solaris /dev/poll support. | ||-DNO_DEVPOLL |By default, /dev/poll support is compiled in | || |on Solaris versions that are known to support | diff --git a/postfix/Makefile.init b/postfix/Makefile.init index e93de9fbf..bf0bad878 100644 --- a/postfix/Makefile.init +++ b/postfix/Makefile.init @@ -1,7 +1,8 @@ # Usage: -# make makefiles [CC=compiler] [OPT=compiler-flags] [DEBUG=debug-flags] +# make makefiles [name=value]... # -# The defaults are: CC=gcc, OPT=-O, and DEBUG=-g. Examples: +# See makedefs for a descripton of available options. +# Examples: # # make makefiles # make makefiles CC="purify cc" diff --git a/postfix/README_FILES/INSTALL b/postfix/README_FILES/INSTALL index 401152db5..dac8e8e89 100644 --- a/postfix/README_FILES/INSTALL +++ b/postfix/README_FILES/INSTALL @@ -539,6 +539,9 @@ The following is an extensive list of names and values. || |probably should also override DEF_DB_TYPE as | || |described in section 4.6. | |_|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | +||-DNO_DNSSEC |Do not build with DNSSEC support, even if the | +|| |resolver library appears to support it. | +|_|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | || |Do not build with Solaris /dev/poll support. | ||-DNO_DEVPOLL |By default, /dev/poll support is compiled in | || |on Solaris versions that are known to support | diff --git a/postfix/README_FILES/SMTPD_POLICY_README b/postfix/README_FILES/SMTPD_POLICY_README index 6f2ed97f0..51c1df2c4 100644 --- a/postfix/README_FILES/SMTPD_POLICY_README +++ b/postfix/README_FILES/SMTPD_POLICY_README @@ -76,6 +76,8 @@ a delegated SMTPD access policy request: ccert_pubkey_fingerprint=68:B3:29:DA:98:93:E3:40:99:C7:D8:AD:5C:B9:C9:40 PPoossttffiixx vveerrssiioonn 33..00 aanndd llaatteerr:: client_port=1234 + PPoossttffiixx vveerrssiioonn 33..11 aanndd llaatteerr:: + policy_context=submission [empty line] Notes: @@ -145,6 +147,9 @@ Notes: * The "stress" attribute is either empty or "yes". See the STRESS_README document for further information. + * The "policy_context" attribute provides a way to pass information that is + not available via other attributes (Postfix version 3.1 and later). + The following is specific to SMTPD delegated policy requests: * Protocol names are ESMTP or SMTP. @@ -276,6 +281,12 @@ protocol: to resend a failed SMTPD policy service request. Available with Postfix 3.0 and later. + * smtpd_policy_service_policy_context (default: empty): Optional information + that is passed in the "policy_context" attribute of an SMTPD policy service + request (originally, to share the same SMTPD service endpoint among + multiple check_policy_service clients). Available with Postfix 3.1 and + later. + Configuration parameters that control the server side of the policy delegation protocol: diff --git a/postfix/WISHLIST b/postfix/WISHLIST index f5d3d0f7a..e2815adcf 100644 --- a/postfix/WISHLIST +++ b/postfix/WISHLIST @@ -13,6 +13,12 @@ Wish list: Postfix 3.0: In the DNS client, save/restore h_errno in the multi-query functions. + Specify WARN_UNUSED_RESULT for all library functions that + pass, deliver, bounce or defer a delivery request. + + Specify WARN_UNUSED_RESULT for mac_expand(), after making + smtp_reply_footer() undoable. + Type-checking wrappers for htable(3), ctable(3) and other modules that take and return a void* pointer. @@ -22,9 +28,6 @@ Wish list: relevant only for fingerprint-based authentication including DANE, and affects logging, SMTPD policy, and Milters. - Exploit GCC 3.4+ __attribute__((warn_unused_result)) to - warn about unused function result values. - Generalize the daemon '-S' stand-alone mode, so that it can be used with custom configuration files for request/reply regression testing. diff --git a/postfix/html/INSTALL.html b/postfix/html/INSTALL.html index 1c5f33b03..3154d17f7 100644 --- a/postfix/html/INSTALL.html +++ b/postfix/html/INSTALL.html @@ -810,6 +810,10 @@ platforms that are known to support this feature. If you override this, then you probably should also override DEF_DB_TYPE as described in section 4.6. + -DNO_DNSSEC Do not build with DNSSEC +support, even if the resolver library appears to support it. + + -DNO_DEVPOLL Do not build with Solaris /dev/poll support. By default, /dev/poll support is compiled in on Solaris versions that are known to support diff --git a/postfix/html/SMTPD_POLICY_README.html b/postfix/html/SMTPD_POLICY_README.html index 6f3ae0b62..81885fa22 100644 --- a/postfix/html/SMTPD_POLICY_README.html +++ b/postfix/html/SMTPD_POLICY_README.html @@ -108,6 +108,8 @@ stress= ccert_pubkey_fingerprint=68:B3:29:DA:98:93:E3:40:99:C7:D8:AD:5C:B9:C9:40 Postfix version 3.0 and later: client_port=1234 +Postfix version 3.1 and later: +policy_context=submission [empty line] @@ -195,6 +197,10 @@ client_port=1234
  • The "stress" attribute is either empty or "yes". See the STRESS_README document for further information.

    +
  • The "policy_context" attribute provides a way to pass + information that is not available via other attributes (Postfix + version 3.1 and later).

    +

    The following is specific to SMTPD delegated policy requests: @@ -367,6 +373,12 @@ giving up. Available with Postfix 3.0 and later.

    between attempts to resend a failed SMTPD policy service request. Available with Postfix 3.0 and later.

    +
  • smtpd_policy_service_policy_context (default: empty): +Optional information that is passed in the "policy_context" attribute +of an SMTPD policy service request (originally, to share the same +SMTPD service endpoint among multiple check_policy_service clients). +Available with Postfix 3.1 and later.

    +

    Configuration parameters that control the server side of the diff --git a/postfix/html/postconf.5.html b/postfix/html/postconf.5.html index f11ad42d0..911c03c61 100644 --- a/postfix/html/postconf.5.html +++ b/postfix/html/postconf.5.html @@ -2956,6 +2956,10 @@ returns the server response in an application buffer even if the requested record does not exist. If this promise is broken, specify "yes" to enable a workaround for DNS reputation lookups.

    +

    +This feature is available in Postfix 3.1 and later. +

    + @@ -14633,6 +14637,21 @@ This feature is available in Postfix 2.1 and later.

    + + +
    smtpd_policy_service_policy_context +(default: empty)
    + +

    Optional information that the Postfix SMTP server specifies in +the "policy_context" attribute of a policy service request (originally, +to share the same service endpoint among multiple check_policy_service +clients).

    + +

    +This feature is available in Postfix 3.1 and later. +

    + +
    smtpd_policy_service_request_limit diff --git a/postfix/html/smtpd.8.html b/postfix/html/smtpd.8.html index 96d061cd4..3a8587fc6 100644 --- a/postfix/html/smtpd.8.html +++ b/postfix/html/smtpd.8.html @@ -910,62 +910,70 @@ SMTPD(8) SMTPD(8) The delay between attempts to resend a failed SMTPD policy ser- vice request. + Available in Postfix version 3.1 and later: + + smtpd_policy_service_policy_context (empty) + Optional information that the Postfix SMTP server specifies in + the "policy_context" attribute of a policy service request + (originally, to share the same service endpoint among multiple + check_policy_service clients). + ACCESS CONTROLS - The SMTPD_ACCESS_README document gives an introduction to all the SMTP + The SMTPD_ACCESS_README document gives an introduction to all the SMTP server access control features. smtpd_delay_reject (yes) - Wait until the RCPT TO command before evaluating + Wait until the RCPT TO command before evaluating $smtpd_client_restrictions, $smtpd_helo_restrictions and $smtpd_sender_restrictions, or wait until the ETRN command - before evaluating $smtpd_client_restrictions and + before evaluating $smtpd_client_restrictions and $smtpd_helo_restrictions. parent_domain_matches_subdomains (see 'postconf -d' output) - A list of Postfix features where the pattern "example.com" also - matches subdomains of example.com, instead of requiring an + A list of Postfix features where the pattern "example.com" also + matches subdomains of example.com, instead of requiring an explicit ".example.com" pattern. smtpd_client_restrictions (empty) - Optional restrictions that the Postfix SMTP server applies in + Optional restrictions that the Postfix SMTP server applies in the context of a client connection request. smtpd_helo_required (no) - Require that a remote SMTP client introduces itself with the - HELO or EHLO command before sending the MAIL command or other + Require that a remote SMTP client introduces itself with the + HELO or EHLO command before sending the MAIL command or other commands that require EHLO negotiation. smtpd_helo_restrictions (empty) - Optional restrictions that the Postfix SMTP server applies in + Optional restrictions that the Postfix SMTP server applies in the context of a client HELO command. smtpd_sender_restrictions (empty) - Optional restrictions that the Postfix SMTP server applies in + Optional restrictions that the Postfix SMTP server applies in the context of a client MAIL FROM command. smtpd_recipient_restrictions (see 'postconf -d' output) - Optional restrictions that the Postfix SMTP server applies in - the context of a client RCPT TO command, after + Optional restrictions that the Postfix SMTP server applies in + the context of a client RCPT TO command, after smtpd_relay_restrictions. smtpd_etrn_restrictions (empty) - Optional restrictions that the Postfix SMTP server applies in + Optional restrictions that the Postfix SMTP server applies in the context of a client ETRN command. allow_untrusted_routing (no) - Forward mail with sender-specified routing - (user[@%!]remote[@%!]site) from untrusted clients to destina- + Forward mail with sender-specified routing + (user[@%!]remote[@%!]site) from untrusted clients to destina- tions matching $relay_domains. smtpd_restriction_classes (empty) User-defined aliases for groups of access restrictions. smtpd_null_access_lookup_key (<>) - The lookup key to be used in SMTP access(5) tables instead of + The lookup key to be used in SMTP access(5) tables instead of the null sender address. permit_mx_backup_networks (empty) - Restrict the use of the permit_mx_backup SMTP access feature to + Restrict the use of the permit_mx_backup SMTP access feature to only domains whose primary MX hosts match the listed networks. Available in Postfix version 2.0 and later: @@ -975,19 +983,19 @@ SMTPD(8) SMTPD(8) applies in the context of the SMTP DATA command. smtpd_expansion_filter (see 'postconf -d' output) - What characters are allowed in $name expansions of RBL reply + What characters are allowed in $name expansions of RBL reply templates. Available in Postfix version 2.1 and later: smtpd_reject_unlisted_sender (no) - Request that the Postfix SMTP server rejects mail from unknown - sender addresses, even when no explicit reject_unlisted_sender + Request that the Postfix SMTP server rejects mail from unknown + sender addresses, even when no explicit reject_unlisted_sender access restriction is specified. smtpd_reject_unlisted_recipient (yes) - Request that the Postfix SMTP server rejects mail for unknown - recipient addresses, even when no explicit + Request that the Postfix SMTP server rejects mail for unknown + recipient addresses, even when no explicit reject_unlisted_recipient access restriction is specified. Available in Postfix version 2.2 and later: @@ -1001,17 +1009,17 @@ SMTPD(8) SMTPD(8) smtpd_relay_restrictions (permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination) Access restrictions for mail relay control that the Postfix SMTP - server applies in the context of the RCPT TO command, before + server applies in the context of the RCPT TO command, before smtpd_recipient_restrictions. SENDER AND RECIPIENT ADDRESS VERIFICATION CONTROLS - Postfix version 2.1 introduces sender and recipient address verifica- + Postfix version 2.1 introduces sender and recipient address verifica- tion. This feature is implemented by sending probe email messages that are not actually delivered. This feature is requested via the - reject_unverified_sender and reject_unverified_recipient access - restrictions. The status of verification probes is maintained by the - verify(8) server. See the file ADDRESS_VERIFICATION_README for infor- - mation about how to configure and operate the Postfix sender/recipient + reject_unverified_sender and reject_unverified_recipient access + restrictions. The status of verification probes is maintained by the + verify(8) server. See the file ADDRESS_VERIFICATION_README for infor- + mation about how to configure and operate the Postfix sender/recipient address verification service. address_verify_poll_count (normal: 3, overload: 1) @@ -1023,7 +1031,7 @@ SMTPD(8) SMTPD(8) fication request in progress. address_verify_sender ($double_bounce_sender) - The sender address to use in address verification probes; prior + The sender address to use in address verification probes; prior to Postfix 2.5 the default was "postmaster". unverified_sender_reject_code (450) @@ -1031,18 +1039,18 @@ SMTPD(8) SMTPD(8) address is rejected by the reject_unverified_sender restriction. unverified_recipient_reject_code (450) - The numerical Postfix SMTP server response when a recipient - address is rejected by the reject_unverified_recipient restric- + The numerical Postfix SMTP server response when a recipient + address is rejected by the reject_unverified_recipient restric- tion. Available in Postfix version 2.6 and later: unverified_sender_defer_code (450) - The numerical Postfix SMTP server response code when a sender + The numerical Postfix SMTP server response code when a sender address probe fails due to a temporary error condition. unverified_recipient_defer_code (450) - The numerical Postfix SMTP server response when a recipient + The numerical Postfix SMTP server response when a recipient address probe fails due to a temporary error condition. unverified_sender_reject_reason (empty) @@ -1054,17 +1062,17 @@ SMTPD(8) SMTPD(8) reject_unverified_recipient. unverified_sender_tempfail_action ($reject_tempfail_action) - The Postfix SMTP server's action when reject_unverified_sender + The Postfix SMTP server's action when reject_unverified_sender fails due to a temporary error condition. unverified_recipient_tempfail_action ($reject_tempfail_action) - The Postfix SMTP server's action when reject_unverified_recipi- + The Postfix SMTP server's action when reject_unverified_recipi- ent fails due to a temporary error condition. Available with Postfix 2.9 and later: address_verify_sender_ttl (0s) - The time between changes in the time-dependent portion of + The time between changes in the time-dependent portion of address verification probe sender addresses. ACCESS CONTROL RESPONSES @@ -1076,36 +1084,36 @@ SMTPD(8) SMTPD(8) map "reject" action. defer_code (450) - The numerical Postfix SMTP server response code when a remote + The numerical Postfix SMTP server response code when a remote SMTP client request is rejected by the "defer" restriction. invalid_hostname_reject_code (501) - The numerical Postfix SMTP server response code when the client - HELO or EHLO command parameter is rejected by the + The numerical Postfix SMTP server response code when the client + HELO or EHLO command parameter is rejected by the reject_invalid_helo_hostname restriction. maps_rbl_reject_code (554) - The numerical Postfix SMTP server response code when a remote - SMTP client request is blocked by the reject_rbl_client, + The numerical Postfix SMTP server response code when a remote + SMTP client request is blocked by the reject_rbl_client, reject_rhsbl_client, reject_rhsbl_reverse_client, reject_rhsbl_sender or reject_rhsbl_recipient restriction. non_fqdn_reject_code (504) - The numerical Postfix SMTP server reply code when a client - request is rejected by the reject_non_fqdn_helo_hostname, + The numerical Postfix SMTP server reply code when a client + request is rejected by the reject_non_fqdn_helo_hostname, reject_non_fqdn_sender or reject_non_fqdn_recipient restriction. plaintext_reject_code (450) - The numerical Postfix SMTP server response code when a request + The numerical Postfix SMTP server response code when a request is rejected by the reject_plaintext_session restriction. reject_code (554) - The numerical Postfix SMTP server response code when a remote + The numerical Postfix SMTP server response code when a remote SMTP client request is rejected by the "reject" restriction. relay_domains_reject_code (554) - The numerical Postfix SMTP server response code when a client - request is rejected by the reject_unauth_destination recipient + The numerical Postfix SMTP server response code when a client + request is rejected by the reject_unauth_destination recipient restriction. unknown_address_reject_code (450) @@ -1113,24 +1121,24 @@ SMTPD(8) SMTPD(8) a sender or recipient address because its domain is unknown. unknown_client_reject_code (450) - The numerical Postfix SMTP server response code when a client - without valid address <=> name mapping is rejected by the + The numerical Postfix SMTP server response code when a client + without valid address <=> name mapping is rejected by the reject_unknown_client_hostname restriction. unknown_hostname_reject_code (450) - The numerical Postfix SMTP server response code when the host- - name specified with the HELO or EHLO command is rejected by the + The numerical Postfix SMTP server response code when the host- + name specified with the HELO or EHLO command is rejected by the reject_unknown_helo_hostname restriction. Available in Postfix version 2.0 and later: default_rbl_reply (see 'postconf -d' output) - The default Postfix SMTP server response template for a request + The default Postfix SMTP server response template for a request that is rejected by an RBL-based restriction. multi_recipient_bounce_reject_code (550) - The numerical Postfix SMTP server response code when a remote - SMTP client request is blocked by the reject_multi_recipi- + The numerical Postfix SMTP server response code when a remote + SMTP client request is blocked by the reject_multi_recipi- ent_bounce restriction. rbl_reply_maps (empty) @@ -1140,52 +1148,52 @@ SMTPD(8) SMTPD(8) access_map_defer_code (450) The numerical Postfix SMTP server response code for an access(5) - map "defer" action, including "defer_if_permit" or + map "defer" action, including "defer_if_permit" or "defer_if_reject". reject_tempfail_action (defer_if_permit) - The Postfix SMTP server's action when a reject-type restriction + The Postfix SMTP server's action when a reject-type restriction fails due to a temporary error condition. unknown_helo_hostname_tempfail_action ($reject_tempfail_action) - The Postfix SMTP server's action when reject_unknown_helo_host- + The Postfix SMTP server's action when reject_unknown_helo_host- name fails due to an temporary error condition. unknown_address_tempfail_action ($reject_tempfail_action) - The Postfix SMTP server's action when - reject_unknown_sender_domain or reject_unknown_recipient_domain + The Postfix SMTP server's action when + reject_unknown_sender_domain or reject_unknown_recipient_domain fail due to a temporary error condition. MISCELLANEOUS CONTROLS config_directory (see 'postconf -d' output) - The default location of the Postfix main.cf and master.cf con- + The default location of the Postfix main.cf and master.cf con- figuration files. daemon_timeout (18000s) - How much time a Postfix daemon process may take to handle a + How much time a Postfix daemon process may take to handle a request before it is terminated by a built-in watchdog timer. command_directory (see 'postconf -d' output) The location of all postfix administrative commands. double_bounce_sender (double-bounce) - The sender address of postmaster notifications that are gener- + The sender address of postmaster notifications that are gener- ated by the mail system. ipc_timeout (3600s) - The time limit for sending or receiving information over an + The time limit for sending or receiving information over an internal communication channel. mail_name (Postfix) - The mail system name that is displayed in Received: headers, in + The mail system name that is displayed in Received: headers, in the SMTP greeting banner, and in bounced mail. mail_owner (postfix) - The UNIX system account that owns the Postfix queue and most + The UNIX system account that owns the Postfix queue and most Postfix daemon processes. max_idle (100s) - The maximum amount of time that an idle Postfix daemon process + The maximum amount of time that an idle Postfix daemon process waits for an incoming connection before terminating voluntarily. max_use (100) @@ -1196,11 +1204,11 @@ SMTPD(8) SMTPD(8) The internet hostname of this mail system. mynetworks (see 'postconf -d' output) - The list of "trusted" remote SMTP clients that have more privi- + The list of "trusted" remote SMTP clients that have more privi- leges than "strangers". myorigin ($myhostname) - The domain name that locally-posted mail appears to come from, + The domain name that locally-posted mail appears to come from, and that locally posted mail is delivered to. process_id (read-only) @@ -1213,26 +1221,26 @@ SMTPD(8) SMTPD(8) The location of the Postfix top-level queue directory. recipient_delimiter (empty) - The set of characters that can separate a user name from its - extension (example: user+foo), or a .forward file name from its + The set of characters that can separate a user name from its + extension (example: user+foo), or a .forward file name from its extension (example: .forward+foo). smtpd_banner ($myhostname ESMTP $mail_name) - The text that follows the 220 status code in the SMTP greeting + The text that follows the 220 status code in the SMTP greeting banner. syslog_facility (mail) The syslog facility of Postfix logging. syslog_name (see 'postconf -d' output) - The mail system name that is prepended to the process name in - syslog records, so that "smtpd" becomes, for example, "post- + The mail system name that is prepended to the process name in + syslog records, so that "smtpd" becomes, for example, "post- fix/smtpd". Available in Postfix version 2.2 and later: smtpd_forbidden_commands (CONNECT, GET, POST) - List of commands that cause the Postfix SMTP server to immedi- + List of commands that cause the Postfix SMTP server to immedi- ately terminate the session with a 221 code. Available in Postfix version 2.5 and later: diff --git a/postfix/makedefs b/postfix/makedefs index 052cf9b98..dbd2c569b 100644 --- a/postfix/makedefs +++ b/postfix/makedefs @@ -45,6 +45,9 @@ # Do not build with Solaris /dev/poll support. # By default, /dev/poll support is compiled in on platforms that # are known to support it. +# .IP \fB-DNO_DNSSEC\fR +# Do not build with DNSSEC support, even if the resolver +# library appears to support it. # .IP \fB-DNO_EPOLL\fR # Do not build with Linux EPOLL support. # By default, EPOLL support is compiled in on platforms that @@ -387,18 +390,21 @@ case "$SYSTEM.$RELEASE" in ;; AIX.*) case "`uname -v`" in 6) SYSTYPE=AIX6 + CCARGS="$CCARGS -DNO_DNSSEC" case "$CC" in cc|*/cc|xlc|*/xlc) CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";; esac CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP" ;; 5) SYSTYPE=AIX5 + CCARGS="$CCARGS -DNO_DNSSEC" case "$CC" in cc|*/cc|xlc|*/xlc) CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";; esac CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP" ;; 4) SYSTYPE=AIX4 + CCARGS="$CCARGS -DNO_DNSSEC" # How embarrassing... case "$CC" in cc|*/cc|xlc|*/xlc) OPT=; CCARGS="$CCARGS -w -blibpath:/usr/lib:/lib:/usr/local/lib";; @@ -406,6 +412,7 @@ case "$SYSTEM.$RELEASE" in CCARGS="$CCARGS -D_ALL_SOURCE -DHAS_POSIX_REGEXP" ;; 3) SYSTYPE=AIX3 + CCARGS="$CCARGS -DNO_DNSSEC" # How embarrassing... case "$CC" in cc|*/cc|xlc|*/xlc) OPT=; CCARGS="$CCARGS -w";; diff --git a/postfix/man/man5/postconf.5 b/postfix/man/man5/postconf.5 index d589a5810..a059efcad 100644 --- a/postfix/man/man5/postconf.5 +++ b/postfix/man/man5/postconf.5 @@ -1851,6 +1851,8 @@ promise that res_query() and res_search() invoke res_send(), which returns the server response in an application buffer even if the requested record does not exist. If this promise is broken, specify "yes" to enable a workaround for DNS reputation lookups. +.PP +This feature is available in Postfix 3.1 and later. .SH dnsblog_reply_delay (default: 0s) A debugging aid to artificially delay DNS responses. .PP @@ -9808,6 +9810,13 @@ The time after which an active SMTPD policy service connection is closed. .PP This feature is available in Postfix 2.1 and later. +.SH smtpd_policy_service_policy_context (default: empty) +Optional information that the Postfix SMTP server specifies in +the "policy_context" attribute of a policy service request (originally, +to share the same service endpoint among multiple check_policy_service +clients). +.PP +This feature is available in Postfix 3.1 and later. .SH smtpd_policy_service_request_limit (default: 0) The maximal number of requests per SMTPD policy service connection, or zero (no limit). Once a connection reaches this limit, the diff --git a/postfix/man/man8/smtpd.8 b/postfix/man/man8/smtpd.8 index 8d3ae41ed..80fece96d 100644 --- a/postfix/man/man8/smtpd.8 +++ b/postfix/man/man8/smtpd.8 @@ -807,6 +807,13 @@ request before giving up. .IP "\fBsmtpd_policy_service_retry_delay (1s)\fR" The delay between attempts to resend a failed SMTPD policy service request. +.PP +Available in Postfix version 3.1 and later: +.IP "\fBsmtpd_policy_service_policy_context (empty)\fR" +Optional information that the Postfix SMTP server specifies in +the "policy_context" attribute of a policy service request (originally, +to share the same service endpoint among multiple check_policy_service +clients). .SH "ACCESS CONTROLS" .na .nf diff --git a/postfix/mantools/postlink b/postfix/mantools/postlink index 15698f9cf..f3aa2b6af 100755 --- a/postfix/mantools/postlink +++ b/postfix/mantools/postlink @@ -557,6 +557,7 @@ while (<>) { s;\bsmtpd_policy_service_default_action\b;$&;g; s;\bsmtpd_policy_service_try_limit\b;$&;g; s;\bsmtpd_policy_service_retry_delay\b;$&;g; + s;\bsmtpd_policy_service_policy_context\b;$&;g; s;\bsmtpd_proxy_ehlo\b;$&;g; s;\bsmtpd_proxy_filter\b;$&;g; s;\bsmtpd_proxy_timeout\b;$&;g; diff --git a/postfix/proto/INSTALL.html b/postfix/proto/INSTALL.html index 583618e24..63183add4 100644 --- a/postfix/proto/INSTALL.html +++ b/postfix/proto/INSTALL.html @@ -810,6 +810,10 @@ platforms that are known to support this feature. If you override this, then you probably should also override DEF_DB_TYPE as described in section 4.6. + -DNO_DNSSEC Do not build with DNSSEC +support, even if the resolver library appears to support it. + + -DNO_DEVPOLL Do not build with Solaris /dev/poll support. By default, /dev/poll support is compiled in on Solaris versions that are known to support diff --git a/postfix/proto/SMTPD_POLICY_README.html b/postfix/proto/SMTPD_POLICY_README.html index 97e75eee0..b38a759ea 100644 --- a/postfix/proto/SMTPD_POLICY_README.html +++ b/postfix/proto/SMTPD_POLICY_README.html @@ -108,6 +108,8 @@ stress= ccert_pubkey_fingerprint=68:B3:29:DA:98:93:E3:40:99:C7:D8:AD:5C:B9:C9:40 Postfix version 3.0 and later: client_port=1234 +Postfix version 3.1 and later: +policy_context=submission [empty line] @@ -195,6 +197,10 @@ client_port=1234
  • The "stress" attribute is either empty or "yes". See the STRESS_README document for further information.

    +
  • The "policy_context" attribute provides a way to pass + information that is not available via other attributes (Postfix + version 3.1 and later).

    +

    The following is specific to SMTPD delegated policy requests: @@ -367,6 +373,12 @@ giving up. Available with Postfix 3.0 and later.

    between attempts to resend a failed SMTPD policy service request. Available with Postfix 3.0 and later.

    +
  • smtpd_policy_service_policy_context (default: empty): +Optional information that is passed in the "policy_context" attribute +of an SMTPD policy service request (originally, to share the same +SMTPD service endpoint among multiple check_policy_service clients). +Available with Postfix 3.1 and later.

    +

    Configuration parameters that control the server side of the diff --git a/postfix/proto/postconf.proto b/postfix/proto/postconf.proto index bb29626f2..e3e519731 100644 --- a/postfix/proto/postconf.proto +++ b/postfix/proto/postconf.proto @@ -16550,3 +16550,18 @@ promise that res_query() and res_search() invoke res_send(), which returns the server response in an application buffer even if the requested record does not exist. If this promise is broken, specify "yes" to enable a workaround for DNS reputation lookups.

    + +

    +This feature is available in Postfix 3.1 and later. +

    + +%PARAM smtpd_policy_service_policy_context + +

    Optional information that the Postfix SMTP server specifies in +the "policy_context" attribute of a policy service request (originally, +to share the same service endpoint among multiple check_policy_service +clients).

    + +

    +This feature is available in Postfix 3.1 and later. +

    diff --git a/postfix/src/dns/dns.h b/postfix/src/dns/dns.h index 2938ac3d6..e2b8701ac 100644 --- a/postfix/src/dns/dns.h +++ b/postfix/src/dns/dns.h @@ -52,6 +52,13 @@ (cp) += 4; \ } +#endif + +/* + * Disable DNSSEC at compile-time even if RES_USE_DNSSEC is available + */ +#ifdef DISABLE_DNSSEC +#undef RES_USE_DNSSEC #endif /* diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h index 9abc4fa9d..b4dbc21bb 100644 --- a/postfix/src/global/mail_params.h +++ b/postfix/src/global/mail_params.h @@ -2967,6 +2967,10 @@ extern int var_smtpd_policy_try_delay; #define DEF_SMTPD_POLICY_DEF_ACTION "451 4.3.5 Server configuration problem" extern char *var_smtpd_policy_def_action; +#define VAR_SMTPD_POLICY_CONTEXT "smtpd_policy_service_policy_context" +#define DEF_SMTPD_POLICY_CONTEXT "" +extern char *var_smtpd_policy_context; + #define CHECK_POLICY_SERVICE "check_policy_service" /* diff --git a/postfix/src/global/mail_proto.h b/postfix/src/global/mail_proto.h index c36090602..1e427975a 100644 --- a/postfix/src/global/mail_proto.h +++ b/postfix/src/global/mail_proto.h @@ -161,6 +161,7 @@ extern char *mail_pathname(const char *, const char *); #define MAIL_ATTR_STRESS "stress" #define MAIL_ATTR_LOG_IDENT "log_ident" #define MAIL_ATTR_RWR_CONTEXT "rewrite_context" +#define MAIL_ATTR_POL_CONTEXT "policy_context" #define MAIL_ATTR_RWR_LOCAL "local" #define MAIL_ATTR_RWR_REMOTE "remote" diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index 2e5e4b8e8..a06cec645 100644 --- a/postfix/src/global/mail_version.h +++ b/postfix/src/global/mail_version.h @@ -20,7 +20,7 @@ * Patches change both the patchlevel and the release date. Snapshots have no * patchlevel; they change the release date only. */ -#define MAIL_RELEASE_DATE "20150829" +#define MAIL_RELEASE_DATE "20150913" #define MAIL_VERSION_NUMBER "3.1" #ifdef SNAPSHOT diff --git a/postfix/src/global/record.c b/postfix/src/global/record.c index faa58f445..54ef62822 100644 --- a/postfix/src/global/record.c +++ b/postfix/src/global/record.c @@ -177,6 +177,7 @@ int rec_put_type(VSTREAM *stream, int type, off_t offset) if (vstream_fseek(stream, offset, SEEK_SET) < 0 || VSTREAM_PUTC(type, stream) != type) { + msg_warn("%s: seek or write error", VSTREAM_PATH(stream)); return (REC_TYPE_ERROR); } else { return (type); @@ -304,8 +305,12 @@ int rec_get_raw(VSTREAM *stream, VSTRING *buf, ssize_t maxsize, int flags) continue; if (type == REC_TYPE_DTXT && (flags & REC_FLAG_SKIP_DTXT) != 0) continue; - if (type == REC_TYPE_END && (flags & REC_FLAG_SEEK_END) != 0) - (void) vstream_fseek(stream, (off_t) 0, SEEK_END); + if (type == REC_TYPE_END && (flags & REC_FLAG_SEEK_END) != 0 + && vstream_fseek(stream, (off_t) 0, SEEK_END) < 0) { + msg_warn("%s: seek error after reading END record: %m", + VSTREAM_PATH(stream)); + return (REC_TYPE_ERROR); + } break; } return (type); diff --git a/postfix/src/smtpd/smtpd.c b/postfix/src/smtpd/smtpd.c index c0c6e3e08..14bdc693c 100644 --- a/postfix/src/smtpd/smtpd.c +++ b/postfix/src/smtpd/smtpd.c @@ -757,6 +757,13 @@ /* .IP "\fBsmtpd_policy_service_retry_delay (1s)\fR" /* The delay between attempts to resend a failed SMTPD policy /* service request. +/* .PP +/* Available in Postfix version 3.1 and later: +/* .IP "\fBsmtpd_policy_service_policy_context (empty)\fR" +/* Optional information that the Postfix SMTP server specifies in +/* the "policy_context" attribute of a policy service request (originally, +/* to share the same service endpoint among multiple check_policy_service +/* clients). /* ACCESS CONTROLS /* .ad /* .fi @@ -1272,6 +1279,7 @@ int var_smtpd_policy_req_limit; int var_smtpd_policy_try_limit; int var_smtpd_policy_try_delay; char *var_smtpd_policy_def_action; +char *var_smtpd_policy_context; int var_smtpd_policy_idle; int var_smtpd_policy_ttl; char *var_xclient_hosts; @@ -5774,6 +5782,7 @@ int main(int argc, char **argv) VAR_SMTPD_ACL_PERM_LOG, DEF_SMTPD_ACL_PERM_LOG, &var_smtpd_acl_perm_log, 0, 0, VAR_SMTPD_UPROXY_PROTO, DEF_SMTPD_UPROXY_PROTO, &var_smtpd_uproxy_proto, 0, 0, VAR_SMTPD_POLICY_DEF_ACTION, DEF_SMTPD_POLICY_DEF_ACTION, &var_smtpd_policy_def_action, 1, 0, + VAR_SMTPD_POLICY_CONTEXT, DEF_SMTPD_POLICY_CONTEXT, &var_smtpd_policy_context, 0, 0, VAR_SMTPD_DNS_RE_FILTER, DEF_SMTPD_DNS_RE_FILTER, &var_smtpd_dns_re_filter, 0, 0, 0, }; diff --git a/postfix/src/smtpd/smtpd_check.c b/postfix/src/smtpd/smtpd_check.c index 9a3249082..b04120f59 100644 --- a/postfix/src/smtpd/smtpd_check.c +++ b/postfix/src/smtpd/smtpd_check.c @@ -462,6 +462,7 @@ double smtpd_space_multf = 1.5; typedef struct { ATTR_CLNT *client; /* client handle */ char *def_action; /* default action */ + char *policy_context; /* context of policy request */ } SMTPD_POLICY_CLNT; /* @@ -483,6 +484,7 @@ static ATTR_OVER_INT int_table[] = { }; static ATTR_OVER_STR str_table[] = { 21 + VAR_SMTPD_POLICY_DEF_ACTION, 0, 1, 0, + 21 + VAR_SMTPD_POLICY_CONTEXT, 0, 1, 0, 0, }; @@ -498,6 +500,7 @@ static ATTR_OVER_STR str_table[] = { #define smtpd_policy_try_limit_offset 1 #define smtpd_policy_def_action_offset 0 +#define smtpd_policy_context_offset 1 /* policy_client_register - register policy service endpoint */ @@ -527,6 +530,7 @@ static void policy_client_register(const char *name) int smtpd_policy_req_limit = var_smtpd_policy_req_limit; int smtpd_policy_try_limit = var_smtpd_policy_try_limit; const char *smtpd_policy_def_action = var_smtpd_policy_def_action; + const char *smtpd_policy_context = var_smtpd_policy_context; link_override_table_to_variable(time_table, smtpd_policy_tmout); link_override_table_to_variable(time_table, smtpd_policy_idle); @@ -535,6 +539,7 @@ static void policy_client_register(const char *name) link_override_table_to_variable(int_table, smtpd_policy_req_limit); link_override_table_to_variable(int_table, smtpd_policy_try_limit); link_override_table_to_variable(str_table, smtpd_policy_def_action); + link_override_table_to_variable(str_table, smtpd_policy_context); if (*name == parens[0]) { cp = saved_name = mystrdup(name); @@ -553,11 +558,12 @@ static void policy_client_register(const char *name) if (msg_verbose) msg_info("%s: name=\"%s\" default_action=\"%s\" max_idle=%d " "max_ttl=%d request_limit=%d retry_delay=%d " - "timeout=%d try_limit=%d", + "timeout=%d try_limit=%d policy_context=\"%s\"", myname, policy_name, smtpd_policy_def_action, smtpd_policy_idle, smtpd_policy_ttl, smtpd_policy_req_limit, smtpd_policy_try_delay, - smtpd_policy_tmout, smtpd_policy_try_limit); + smtpd_policy_tmout, smtpd_policy_try_limit, + smtpd_policy_context); /* * Create the client. @@ -574,6 +580,7 @@ static void policy_client_register(const char *name) ATTR_CLNT_CTL_TRY_DELAY, smtpd_policy_try_delay, ATTR_CLNT_CTL_END); policy_client->def_action = mystrdup(smtpd_policy_def_action); + policy_client->policy_context = mystrdup(smtpd_policy_context); htable_enter(policy_clnt_table, name, (void *) policy_client); if (saved_name) myfree(saved_name); @@ -3950,6 +3957,8 @@ static int check_policy_service(SMTPD_STATE *state, const char *server, SEND_ATTR_INT(MAIL_ATTR_CRYPTO_KEYSIZE, IF_ENCRYPTED(state->tls_context->cipher_usebits, 0)), #endif + SEND_ATTR_STR(MAIL_ATTR_POL_CONTEXT, + policy_clnt->policy_context), ATTR_TYPE_END, ATTR_FLAG_MISSING, /* Reply attributes. */ RECV_ATTR_STR(MAIL_ATTR_ACTION, action), @@ -5447,6 +5456,7 @@ char *var_relay_ccerts = ""; char *var_mynetworks = ""; char *var_notify_classes = ""; char *var_smtpd_policy_def_action = ""; +char *var_smtpd_policy_context = ""; /* * String-valued configuration parameters. diff --git a/postfix/src/smtpstone/qmqp-sink.c b/postfix/src/smtpstone/qmqp-sink.c index 34d22e4ca..f07bf1043 100644 --- a/postfix/src/smtpstone/qmqp-sink.c +++ b/postfix/src/smtpstone/qmqp-sink.c @@ -135,7 +135,7 @@ static void read_data(int unused_event, void *context) send_reply(state); return; } - vstream_fseek(state->stream, 0L, 0); + vstream_fpurge(state->stream, VSTREAM_PURGE_BOTH); } /* diff --git a/postfix/src/util/attr.h b/postfix/src/util/attr.h index a08e6774f..21e14e254 100644 --- a/postfix/src/util/attr.h +++ b/postfix/src/util/attr.h @@ -25,6 +25,14 @@ #include #include + /* + * Delegation for better data abstraction. + */ +typedef int (*ATTR_SCAN_MASTER_FN) (VSTREAM *, int,...); +typedef int (*ATTR_SCAN_SLAVE_FN) (ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *); +typedef int (*ATTR_PRINT_MASTER_FN) (VSTREAM *, int,...); +typedef int (*ATTR_PRINT_SLAVE_FN) (ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *); + /* * Attribute types. See attr_scan(3) for documentation. */ @@ -58,7 +66,7 @@ #define SEND_ATTR_NV(val) ATTR_TYPE_NV, CHECK_CPTR(ATTR, NVTABLE, (val)) #define SEND_ATTR_LONG(name, val) ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, long, (val)) #define SEND_ATTR_DATA(name, len, val) ATTR_TYPE_DATA, CHECK_CPTR(ATTR, char, (name)), CHECK_VAL(ATTR, ssize_t, (len)), CHECK_CPTR(ATTR, void, (val)) -#define SEND_ATTR_FUNC(func, val) ATTR_TYPE_FUNC, (func), CHECK_CPTR(ATTR, void, (val)) +#define SEND_ATTR_FUNC(func, val) ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_PRINT_SLAVE_FN, (func)), CHECK_CPTR(ATTR, void, (val)) #define RECV_ATTR_INT(name, val) ATTR_TYPE_INT, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, int, (val)) #define RECV_ATTR_STR(name, val) ATTR_TYPE_STR, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val)) @@ -66,7 +74,7 @@ #define RECV_ATTR_NV(val) ATTR_TYPE_NV, CHECK_PTR(ATTR, NVTABLE, (val)) #define RECV_ATTR_LONG(name, val) ATTR_TYPE_LONG, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, long, (val)) #define RECV_ATTR_DATA(name, val) ATTR_TYPE_DATA, CHECK_CPTR(ATTR, char, (name)), CHECK_PTR(ATTR, VSTRING, (val)) -#define RECV_ATTR_FUNC(func, val) ATTR_TYPE_FUNC, (func), CHECK_PTR(ATTR, void, (val)) +#define RECV_ATTR_FUNC(func, val) ATTR_TYPE_FUNC, CHECK_VAL(ATTR, ATTR_SCAN_SLAVE_FN, (func)), CHECK_PTR(ATTR, void, (val)) CHECK_VAL_HELPER_DCL(ATTR, ssize_t); CHECK_VAL_HELPER_DCL(ATTR, long); @@ -81,6 +89,8 @@ CHECK_CPTR_HELPER_DCL(ATTR, void); CHECK_CPTR_HELPER_DCL(ATTR, char); CHECK_CPTR_HELPER_DCL(ATTR, NVTABLE); CHECK_CPTR_HELPER_DCL(ATTR, HTABLE); +CHECK_VAL_HELPER_DCL(ATTR, ATTR_PRINT_SLAVE_FN); +CHECK_VAL_HELPER_DCL(ATTR, ATTR_SCAN_SLAVE_FN); /* * Flags that control processing. See attr_scan(3) for documentation. @@ -93,14 +103,6 @@ CHECK_CPTR_HELPER_DCL(ATTR, HTABLE); #define ATTR_FLAG_STRICT (ATTR_FLAG_MISSING | ATTR_FLAG_EXTRA) #define ATTR_FLAG_ALL (07) - /* - * Delegation for better data abstraction. - */ -typedef int (*ATTR_SCAN_MASTER_FN) (VSTREAM *, int,...); -typedef int (*ATTR_SCAN_SLAVE_FN) (ATTR_SCAN_MASTER_FN, VSTREAM *, int, void *); -typedef int (*ATTR_PRINT_MASTER_FN) (VSTREAM *, int,...); -typedef int (*ATTR_PRINT_SLAVE_FN) (ATTR_PRINT_MASTER_FN, VSTREAM *, int, void *); - /* * Default to null-terminated, as opposed to base64-encoded. */ @@ -118,8 +120,8 @@ extern int attr_vprint64(VSTREAM *, int, va_list); /* * attr_scan64.c. */ -extern int attr_scan64(VSTREAM *, int,...); -extern int attr_vscan64(VSTREAM *, int, va_list); +extern int WARN_UNUSED_RESULT attr_scan64(VSTREAM *, int,...); +extern int WARN_UNUSED_RESULT attr_vscan64(VSTREAM *, int, va_list); /* * attr_print0.c. @@ -130,8 +132,8 @@ extern int attr_vprint0(VSTREAM *, int, va_list); /* * attr_scan0.c. */ -extern int attr_scan0(VSTREAM *, int,...); -extern int attr_vscan0(VSTREAM *, int, va_list); +extern int WARN_UNUSED_RESULT attr_scan0(VSTREAM *, int,...); +extern int WARN_UNUSED_RESULT attr_vscan0(VSTREAM *, int, va_list); /* * attr_scan_plain.c. @@ -142,8 +144,8 @@ extern int attr_vprint_plain(VSTREAM *, int, va_list); /* * attr_print_plain.c. */ -extern int attr_scan_plain(VSTREAM *, int,...); -extern int attr_vscan_plain(VSTREAM *, int, va_list); +extern int WARN_UNUSED_RESULT attr_scan_plain(VSTREAM *, int,...); +extern int WARN_UNUSED_RESULT attr_vscan_plain(VSTREAM *, int, va_list); /* diff --git a/postfix/src/util/base32_code.h b/postfix/src/util/base32_code.h index 56906f44c..2ee686c15 100644 --- a/postfix/src/util/base32_code.h +++ b/postfix/src/util/base32_code.h @@ -20,7 +20,7 @@ * External interface. */ extern VSTRING *base32_encode(VSTRING *, const char *, ssize_t); -extern VSTRING *base32_decode(VSTRING *, const char *, ssize_t); +extern VSTRING *WARN_UNUSED_RESULT base32_decode(VSTRING *, const char *, ssize_t); /* LICENSE /* .ad diff --git a/postfix/src/util/base64_code.h b/postfix/src/util/base64_code.h index 006ff3126..4d3855ea9 100644 --- a/postfix/src/util/base64_code.h +++ b/postfix/src/util/base64_code.h @@ -20,7 +20,7 @@ * External interface. */ extern VSTRING *base64_encode_opt(VSTRING *, const char *, ssize_t, int); -extern VSTRING *base64_decode_opt(VSTRING *, const char *, ssize_t, int); +extern VSTRING *WARN_UNUSED_RESULT base64_decode_opt(VSTRING *, const char *, ssize_t, int); #define BASE64_FLAG_NONE 0 #define BASE64_FLAG_APPEND (1<<0) diff --git a/postfix/src/util/edit_file.h b/postfix/src/util/edit_file.h index ffa9aec04..7f55c1950 100644 --- a/postfix/src/util/edit_file.h +++ b/postfix/src/util/edit_file.h @@ -31,7 +31,7 @@ typedef struct { #define EDIT_FILE_SUFFIX ".tmp" extern EDIT_FILE *edit_file_open(const char *, int, mode_t); -extern int edit_file_close(EDIT_FILE *); +extern int WARN_UNUSED_RESULT edit_file_close(EDIT_FILE *); extern void edit_file_cleanup(EDIT_FILE *); /* LICENSE diff --git a/postfix/src/util/hex_code.h b/postfix/src/util/hex_code.h index e868fe6b2..cdc176552 100644 --- a/postfix/src/util/hex_code.h +++ b/postfix/src/util/hex_code.h @@ -20,7 +20,7 @@ * External interface. */ extern VSTRING *hex_encode(VSTRING *, const char *, ssize_t); -extern VSTRING *hex_decode(VSTRING *, const char *, ssize_t); +extern VSTRING *WARN_UNUSED_RESULT hex_decode(VSTRING *, const char *, ssize_t); /* LICENSE /* .ad diff --git a/postfix/src/util/host_port.h b/postfix/src/util/host_port.h index b690a5228..c1d651dc3 100644 --- a/postfix/src/util/host_port.h +++ b/postfix/src/util/host_port.h @@ -13,7 +13,8 @@ /* External interface. */ -extern const char *host_port(char *, char **, char *, char **, char *); +extern const char *WARN_UNUSED_RESULT host_port(char *, char **, char *, + char **, char *); /* LICENSE /* .ad diff --git a/postfix/src/util/listen.h b/postfix/src/util/listen.h index ccd45bc73..4b5fadc7b 100644 --- a/postfix/src/util/listen.h +++ b/postfix/src/util/listen.h @@ -29,7 +29,7 @@ extern int inet_accept(int); extern int unix_accept(int); extern int stream_accept(int); -extern int recv_pass_attr(int, HTABLE **, int, ssize_t); +extern int WARN_UNUSED_RESULT recv_pass_attr(int, HTABLE **, int, ssize_t); extern int pass_accept(int); extern int pass_accept_attr(int, HTABLE **); diff --git a/postfix/src/util/lstat_as.h b/postfix/src/util/lstat_as.h index 824b32115..d221ec64c 100644 --- a/postfix/src/util/lstat_as.h +++ b/postfix/src/util/lstat_as.h @@ -14,7 +14,7 @@ /* External interface. */ -extern int lstat_as(const char *, struct stat *, uid_t, gid_t); +extern int WARN_UNUSED_RESULT lstat_as(const char *, struct stat *, uid_t, gid_t); /* LICENSE /* .ad diff --git a/postfix/src/util/mac_parse.h b/postfix/src/util/mac_parse.h index 80c825312..e016ea792 100644 --- a/postfix/src/util/mac_parse.h +++ b/postfix/src/util/mac_parse.h @@ -30,7 +30,7 @@ typedef int (*MAC_PARSE_FN) (int, VSTRING *, void *); -extern int mac_parse(const char *, MAC_PARSE_FN, void *); +extern int WARN_UNUSED_RESULT mac_parse(const char *, MAC_PARSE_FN, void *); /* LICENSE /* .ad diff --git a/postfix/src/util/myaddrinfo.h b/postfix/src/util/myaddrinfo.h index 95d5ee9ee..b11e5f317 100644 --- a/postfix/src/util/myaddrinfo.h +++ b/postfix/src/util/myaddrinfo.h @@ -154,14 +154,14 @@ typedef struct { char buf[MAI_SERVPORT_STRSIZE]; } MAI_SERVPORT_STR; -extern int hostname_to_sockaddr_pf(const char *, int, const char *, int, - struct addrinfo **); -extern int hostaddr_to_sockaddr(const char *, const char *, int, - struct addrinfo **); -extern int sockaddr_to_hostaddr(const struct sockaddr *, SOCKADDR_SIZE, - MAI_HOSTADDR_STR *, MAI_SERVPORT_STR *, int); -extern int sockaddr_to_hostname(const struct sockaddr *, SOCKADDR_SIZE, - MAI_HOSTNAME_STR *, MAI_SERVNAME_STR *, int); +extern int WARN_UNUSED_RESULT hostname_to_sockaddr_pf(const char *, + int, const char *, int, struct addrinfo **); +extern int WARN_UNUSED_RESULT hostaddr_to_sockaddr(const char *, + const char *, int, struct addrinfo **); +extern int WARN_UNUSED_RESULT sockaddr_to_hostaddr(const struct sockaddr *, + SOCKADDR_SIZE, MAI_HOSTADDR_STR *, MAI_SERVPORT_STR *, int); +extern int WARN_UNUSED_RESULT sockaddr_to_hostname(const struct sockaddr *, + SOCKADDR_SIZE, MAI_HOSTNAME_STR *, MAI_SERVNAME_STR *, int); extern void myaddrinfo_control(int,...); #define MAI_CTL_END 0 /* list terminator */ diff --git a/postfix/src/util/myflock.h b/postfix/src/util/myflock.h index 624ea2d94..72c6420e8 100644 --- a/postfix/src/util/myflock.h +++ b/postfix/src/util/myflock.h @@ -14,7 +14,7 @@ /* * External interface. */ -extern int myflock(int, int, int); +extern int WARN_UNUSED_RESULT myflock(int, int, int); /* * Lock styles. diff --git a/postfix/src/util/recv_pass_attr.c b/postfix/src/util/recv_pass_attr.c index 845f0e633..c0bc33b88 100644 --- a/postfix/src/util/recv_pass_attr.c +++ b/postfix/src/util/recv_pass_attr.c @@ -13,7 +13,7 @@ /* ssize_t bufsize; /* DESCRIPTION /* recv_pass_attr() receives named attributes over the specified -/* The result value is zero for success, -1 for error. +/* descriptor. The result value is zero for success, -1 for error. /* /* Arguments: /* .IP fd @@ -21,7 +21,7 @@ /* .IP attr /* Pointer to attribute list pointer. The target is set to /* zero on error or when the received attribute list is empty, -/* ohterwise it is assigned a pointer to non-empty attribute +/* otherwise it is assigned a pointer to non-empty attribute /* list. /* .IP timeout /* The deadline for receiving all attributes. @@ -70,10 +70,10 @@ int recv_pass_attr(int fd, HTABLE **attr, int timeout, ssize_t bufsize) CA_VSTREAM_CTL_TIMEOUT(timeout), CA_VSTREAM_CTL_START_DEADLINE, CA_VSTREAM_CTL_END); - (void) attr_scan(fp, ATTR_FLAG_NONE, - ATTR_TYPE_HASH, *attr = htable_create(1), - ATTR_TYPE_END); - stream_err = (vstream_feof(fp) || vstream_ferror(fp)); + stream_err = (attr_scan(fp, ATTR_FLAG_NONE, + ATTR_TYPE_HASH, *attr = htable_create(1), + ATTR_TYPE_END) < 0 + || vstream_feof(fp) || vstream_ferror(fp)); vstream_fdclose(fp); /* diff --git a/postfix/src/util/sane_fsops.h b/postfix/src/util/sane_fsops.h index 0c9b3ac2a..91f48d01b 100644 --- a/postfix/src/util/sane_fsops.h +++ b/postfix/src/util/sane_fsops.h @@ -13,8 +13,8 @@ /* External interface. */ -extern int sane_rename(const char *, const char *); -extern int sane_link(const char *, const char *); +extern int WARN_UNUSED_RESULT sane_rename(const char *, const char *); +extern int WARN_UNUSED_RESULT sane_link(const char *, const char *); /* LICENSE /* .ad diff --git a/postfix/src/util/sane_socketpair.h b/postfix/src/util/sane_socketpair.h index 3c8e239a9..9b59f6a3c 100644 --- a/postfix/src/util/sane_socketpair.h +++ b/postfix/src/util/sane_socketpair.h @@ -13,7 +13,7 @@ /* External interface. */ -extern int sane_socketpair(int, int, int, int *); +extern int WARN_UNUSED_RESULT sane_socketpair(int, int, int, int *); /* LICENSE /* .ad diff --git a/postfix/src/util/stat_as.h b/postfix/src/util/stat_as.h index aad37d30a..37783afcf 100644 --- a/postfix/src/util/stat_as.h +++ b/postfix/src/util/stat_as.h @@ -14,7 +14,7 @@ /* External interface. */ -extern int stat_as(const char *, struct stat *, uid_t, gid_t); +extern int WARN_UNUSED_RESULT stat_as(const char *, struct stat *, uid_t, gid_t); /* LICENSE /* .ad diff --git a/postfix/src/util/stringops.h b/postfix/src/util/stringops.h index 61ea515d8..de2ecc739 100644 --- a/postfix/src/util/stringops.h +++ b/postfix/src/util/stringops.h @@ -45,10 +45,10 @@ extern int alldig(const char *); extern int allprint(const char *); extern int allspace(const char *); extern int allascii_len(const char *, ssize_t); -extern const char *split_nameval(char *, char **, char **); +extern const char *WARN_UNUSED_RESULT split_nameval(char *, char **, char **); extern int valid_utf8_string(const char *, ssize_t); extern size_t balpar(const char *, const char *); -extern char *extpar(char **, const char *, int); +extern char *WARN_UNUSED_RESULT extpar(char **, const char *, int); extern int strcasecmp_utf8x(int, const char *, const char *); extern int strncasecmp_utf8x(int, const char *, const char *, ssize_t); diff --git a/postfix/src/util/sys_defs.h b/postfix/src/util/sys_defs.h index 5b381af40..569289eb1 100644 --- a/postfix/src/util/sys_defs.h +++ b/postfix/src/util/sys_defs.h @@ -1645,6 +1645,28 @@ typedef int pid_t; #define EXPECTED(x) (x) #define UNEXPECTED(x) (x) #endif +#endif + + /* + * Warn about ignored function result values that must never be ignored. + * Typically, this is for error results from "read" functions that normally + * write to output parameters (for example, stat- or scanf-like functions) + * or from functions that have other useful side effects (for example, + * fseek- or rename-like functions). + * + * DO NOT use this for functions that write to a stream; it is entirely + * legitimate to detect write errors with fflush() or fclose() only. On the + * other hand most (but not all) functions that read from a stream must + * never ignore result values. + * + * XXX Prepending "(void)" won't shut up GCC. Clang behaves as expected. + */ +#if ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ > 3) +#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#elif defined(__clang__) && __has_attribute(warn_unused_result) +#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#else +#define WARN_UNUSED_RESULT #endif /* diff --git a/postfix/src/util/timed_wait.h b/postfix/src/util/timed_wait.h index bdbc270c6..006ecfd95 100644 --- a/postfix/src/util/timed_wait.h +++ b/postfix/src/util/timed_wait.h @@ -14,7 +14,7 @@ /* * External interface. */ -extern int timed_waitpid(pid_t, WAIT_STATUS_T *, int, int); +extern int WARN_UNUSED_RESULT timed_waitpid(pid_t, WAIT_STATUS_T *, int, int); /* LICENSE /* .ad diff --git a/postfix/src/util/vstream.h b/postfix/src/util/vstream.h index bcb496bc5..cb2f517bc 100644 --- a/postfix/src/util/vstream.h +++ b/postfix/src/util/vstream.h @@ -93,7 +93,7 @@ extern VSTREAM vstream_fstd[]; /* pre-defined streams */ extern VSTREAM *vstream_fopen(const char *, int, mode_t); extern int vstream_fclose(VSTREAM *); -extern off_t vstream_fseek(VSTREAM *, off_t, int); +extern off_t WARN_UNUSED_RESULT vstream_fseek(VSTREAM *, off_t, int); extern off_t vstream_ftell(VSTREAM *); extern int vstream_fpurge(VSTREAM *, int); extern int vstream_fflush(VSTREAM *); diff --git a/postfix/src/util/vstring_vstream.h b/postfix/src/util/vstring_vstream.h index 9bd9d7127..1ce63df73 100644 --- a/postfix/src/util/vstring_vstream.h +++ b/postfix/src/util/vstring_vstream.h @@ -19,12 +19,12 @@ /* * External interface. */ -extern int vstring_get(VSTRING *, VSTREAM *); -extern int vstring_get_nonl(VSTRING *, VSTREAM *); -extern int vstring_get_null(VSTRING *, VSTREAM *); -extern int vstring_get_bound(VSTRING *, VSTREAM *, ssize_t); -extern int vstring_get_nonl_bound(VSTRING *, VSTREAM *, ssize_t); -extern int vstring_get_null_bound(VSTRING *, VSTREAM *, ssize_t); +extern int WARN_UNUSED_RESULT vstring_get(VSTRING *, VSTREAM *); +extern int WARN_UNUSED_RESULT vstring_get_nonl(VSTRING *, VSTREAM *); +extern int WARN_UNUSED_RESULT vstring_get_null(VSTRING *, VSTREAM *); +extern int WARN_UNUSED_RESULT vstring_get_bound(VSTRING *, VSTREAM *, ssize_t); +extern int WARN_UNUSED_RESULT vstring_get_nonl_bound(VSTRING *, VSTREAM *, ssize_t); +extern int WARN_UNUSED_RESULT vstring_get_null_bound(VSTRING *, VSTREAM *, ssize_t); /* * Backwards compatibility for code that still uses the vstring_fgets()