]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.9.3
authorWietse Venema <wietse@porcupine.org>
Sun, 20 May 2012 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 15:53:37 +0000 (15:53 +0000)
postfix/HISTORY
postfix/src/dnsblog/dnsblog.c
postfix/src/global/mail_version.h
postfix/src/postconf/postconf_user.c
postfix/src/postqueue/Makefile.in
postfix/src/postqueue/postqueue.c
postfix/src/tls/tls.h
postfix/src/tls/tls_client.c
postfix/src/tls/tls_server.c
postfix/src/util/events.c

index cbcd3bb881d8b449dd947d345ff2238911d8cb9b..0f043271a724040aab65d87efe18b3ee9a167890 100644 (file)
@@ -17644,3 +17644,60 @@ Apologies for any names omitted.
        a patch by Victor Duchovni.  Files: proto/TLS_README.html,
        proto/postconf.proto, tls/tls.h, tls/tls_misc.c, tls/tls_client.c,
        tls/tls_server.c.
+
+20120425
+
+       Workaround: bugs in 10-year old gcc versions break compilation
+       with #ifdef inside a macro invocation (NOT: definition).
+       This synchronizes the Postfix 2.9 TLS implementation with
+       Postfix 2.10 to simplify code maintenance.  Files: tls/tls.h,
+       tls/tls_client.c, tls/tls_server.c.
+
+20120426
+
+       Bugfix (introduced Postfix 2.9): the postconf command flagged
+       parameters defined in master.cf as "unused" when they were
+       used only in main.cf. Problem reported by Michael Tokarev.
+       Files: postconf/postconf_user.c.
+
+20120516
+
+       Workaround: apparently, FreeBSD 8.3 kqueue notifications
+       sometimes break when a dnsblog(8) process loses an accept()
+       race on a shared socket, resulting in repeated "connect to
+       private/dnsblog service: Connection refused" warnings.  This
+       condition is unique to dnsblog(8). The postscreen(8) daemon
+       closes a postscreen-to-dnsblog connection as soon as it
+       receives a dnsblog(8) reply, resulting in hundreds or
+       thousands of connection requests per second.  All other
+       multi-server daemons such as anvil(8) or proxymap(8) have
+       connection lifetimes ranging from 5s to 1000s depending on
+       server load.  The workaround is for dnsblog to use the
+       single_server driver instead of the multi_server driver.
+       This one-line code change eliminates the accept() race
+       without any Postfix performance impact.  Problem reported
+       by Sahil Tandon.  File: dnsblog/dnsblog.c.
+
+20120517
+
+       Workaround: to avoid crashes when the OpenSSL library is
+       updated without "postfix reload", the Postfix TLS session
+       cache ID now includes the OpenSSL library version number.
+       Note: this problem cannot be fixed in tlsmgr(8). Code by
+       Victor Duchovni. Files: tls/tls_server.c, tls_client.c.
+
+20120520
+
+       Bugfix (introduced Postfix 2.4): the event_drain() function
+       was comparing bitmasks incorrectly causing the program to
+       always wait for the full time limit. This error affected
+       the unused postkick command, but only after s/fifo/unix/
+       in master.cf.  File: util/events.c.
+
+       Cleanup: laptop users have always been able to avoid
+       unnecessary disk spin-up by doing s/fifo/unix/ in master.cf
+       (this is currently not supported on Solaris systems).
+       However, to make this work reliably, the "postqueue -f"
+       command must wait until its requests have reached the pickup
+       and qmgr servers before closing the UNIX-domain request
+       sockets.  Files: postqueue/postqueue.c, postqueue/Makefile.in.
index 977a683476c415bf0550e888f8935d282ffac061..d2f6843a880ea61cb9326b6e110b23ee6443d561 100644 (file)
@@ -257,6 +257,7 @@ static void post_jail_init(char *unused_name, char **unused_argv)
     query = vstring_alloc(100);
     why = vstring_alloc(100);
     result = vstring_alloc(100);
+    var_use_limit = 0;
 }
 
 MAIL_VERSION_STAMP_DECLARE;
@@ -275,9 +276,9 @@ int     main(int argc, char **argv)
      */
     MAIL_VERSION_STAMP_ALLOCATE;
 
-    multi_server_main(argc, argv, dnsblog_service,
-                     MAIL_SERVER_TIME_TABLE, time_table,
-                     MAIL_SERVER_POST_INIT, post_jail_init,
-                     MAIL_SERVER_UNLIMITED,
-                     0);
+    single_server_main(argc, argv, dnsblog_service,
+                      MAIL_SERVER_TIME_TABLE, time_table,
+                      MAIL_SERVER_POST_INIT, post_jail_init,
+                      MAIL_SERVER_UNLIMITED,
+                      0);
 }
index 91e9f1eac464078a08a42328f25b8f10a66b41d9..cd3f0ccffc57da9b72e9c365635aaf7233c488dd 100644 (file)
@@ -20,8 +20,8 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20120424"
-#define MAIL_VERSION_NUMBER    "2.9.2"
+#define MAIL_RELEASE_DATE      "20120520"
+#define MAIL_VERSION_NUMBER    "2.9.3"
 
 #ifdef SNAPSHOT
 # define MAIL_VERSION_DATE     "-" MAIL_RELEASE_DATE
index d3ff7e3184faac97f818673c66d863a44ab1f258..1ad955869c855bb29965e6f6e142919654f32def 100644 (file)
@@ -126,15 +126,28 @@ static const char *flag_user_parameter(const char *mac_name,
      * compatibility after a feature name change.
      */
     if (local_scope && dict_get(local_scope->all_params, mac_name)) {
+       /* $name in master.cf references name=value in master.cf. */
        if (PC_PARAM_TABLE_LOCATE(local_scope->valid_names, mac_name) == 0)
            PC_PARAM_TABLE_ENTER(local_scope->valid_names, mac_name,
                                 PC_PARAM_FLAG_USER, PC_PARAM_NO_DATA,
                                 convert_user_parameter);
     } else if (mail_conf_lookup(mac_name) != 0) {
+       /* $name in main/master.cf references name=value in main.cf. */
        if (PC_PARAM_TABLE_LOCATE(param_table, mac_name) == 0)
            PC_PARAM_TABLE_ENTER(param_table, mac_name, PC_PARAM_FLAG_USER,
                                 PC_PARAM_NO_DATA, convert_user_parameter);
     }
+    if (local_scope == 0) {
+       for (local_scope = master_table; local_scope->argv; local_scope++) {
+           if (local_scope->all_params != 0
+               && dict_get(local_scope->all_params, mac_name) != 0
+           /* $name in main.cf references name=value in master.cf. */
+               && PC_PARAM_TABLE_LOCATE(local_scope->valid_names, mac_name) == 0)
+               PC_PARAM_TABLE_ENTER(local_scope->valid_names, mac_name,
+                                    PC_PARAM_FLAG_USER, PC_PARAM_NO_DATA,
+                                    convert_user_parameter);
+       }
+    }
     return (0);
 }
 
@@ -277,21 +290,7 @@ void    register_user_parameters(void)
     rest_class_table = htable_create(1);
 
     /*
-     * Scan parameter values that are left at their defaults in the global
-     * name space. Some defaults contain the $name of an obsolete parameter
-     * for backwards compatilility purposes. We might warn that an explicit
-     * name=value is obsolete, but we must not warn that the parameter is
-     * unused.
-     */
-    scan_default_parameter_values(param_table, CONFIG_DICT, (PC_MASTER_ENT *) 0);
-
-    /*
-     * Scan the explicit name=value entries in the global name space.
-     */
-    scan_user_parameter_namespace(CONFIG_DICT, (PC_MASTER_ENT *) 0);
-
-    /*
-     * Scan the "-o parameter=value" instances in each master.cf name space.
+     * Initialize the per-service parameter name spaces.
      */
     for (masterp = master_table; (argv = masterp->argv) != 0; masterp++) {
        for (field = PC_MASTER_MIN_FIELDS; argv->argv[field] != 0; field++) {
@@ -309,7 +308,27 @@ void    register_user_parameters(void)
        if ((dict = dict_handle(masterp->name_space)) != 0) {
            masterp->all_params = dict;
            masterp->valid_names = htable_create(1);
-           scan_user_parameter_namespace(masterp->name_space, masterp);
        }
     }
+
+    /*
+     * Scan parameter values that are left at their defaults in the global
+     * name space. Some defaults contain the $name of an obsolete parameter
+     * for backwards compatilility purposes. We might warn that an explicit
+     * name=value is obsolete, but we must not warn that the parameter is
+     * unused.
+     */
+    scan_default_parameter_values(param_table, CONFIG_DICT, (PC_MASTER_ENT *) 0);
+
+    /*
+     * Scan the explicit name=value entries in the global name space.
+     */
+    scan_user_parameter_namespace(CONFIG_DICT, (PC_MASTER_ENT *) 0);
+
+    /*
+     * Scan the "-o parameter=value" instances in each master.cf name space.
+     */
+    for (masterp = master_table; masterp->argv != 0; masterp++)
+       if (masterp->all_params != 0)
+           scan_user_parameter_namespace(masterp->name_space, masterp);
 }
index c7ebd3c74a85ee1b97ea3d8237b17304f754127a..396ab97c6e1d4dbb3c4c44683ea4845d3ac40718 100644 (file)
@@ -61,6 +61,7 @@ postqueue.o: ../../include/argv.h
 postqueue.o: ../../include/attr.h
 postqueue.o: ../../include/clean_env.h
 postqueue.o: ../../include/connect.h
+postqueue.o: ../../include/events.h
 postqueue.o: ../../include/flush_clnt.h
 postqueue.o: ../../include/iostuff.h
 postqueue.o: ../../include/mail_conf.h
index 6ea91f90be262e5e83ea598bc38169f1f92e8220..ade5af9eefa2060431019943c1bd2612f83ec90f 100644 (file)
 #include <connect.h>
 #include <valid_hostname.h>
 #include <warn_stat.h>
+#include <events.h>
 
 /* Global library. */
 
@@ -352,6 +353,7 @@ static void flush_queue(void)
     if (mail_flush_maildrop() < 0)
        msg_fatal_status(EX_UNAVAILABLE,
                         "Cannot flush mail queue - mail system is down");
+    event_drain(2);
 }
 
 /* flush_site - flush mail for site */
index 870e7f4b3515e9a44b533338ab6ac1354af68a80..66972c509ffc255524e439616c82339c07cf55d2 100644 (file)
@@ -63,8 +63,6 @@ extern const NAME_CODE tls_level_table[];
 #include <name_mask.h>
 #include <name_code.h>
 
-#define TLS_BIO_BUFSIZE        8192
-
  /*
   * Names of valid tlsmgr(8) session caches.
   */
@@ -179,11 +177,15 @@ extern void tls_param_init(void);
 #define TLS_PROTOCOL_TLSv1_1   (1<<3)  /* TLSv1_1 */
 #else
 #define TLS_PROTOCOL_TLSv1_1   0       /* Unknown */
+#undef  SSL_OP_NO_TLSv1_1
+#define SSL_OP_NO_TLSv1_1      0L      /* Noop */
 #endif
 #ifdef SSL_TXT_TLSV1_2
 #define TLS_PROTOCOL_TLSv1_2   (1<<4)  /* TLSv1_2 */
 #else
 #define TLS_PROTOCOL_TLSv1_2   0       /* Unknown */
+#undef  SSL_OP_NO_TLSv1_2
+#define SSL_OP_NO_TLSv1_2      0L      /* Noop */
 #endif
 #define TLS_KNOWN_PROTOCOLS    \
        ( TLS_PROTOCOL_SSLv2 | TLS_PROTOCOL_SSLv3 | TLS_PROTOCOL_TLSv1 \
index b75bca5b538793f296094a42c483b2f20a02e3af..fc2684944a30112f8ec1c64204b121dcbf69c4d0 100644 (file)
@@ -826,6 +826,12 @@ TLS_SESS_STATE *tls_client_start(const TLS_CLIENT_START_PROPS *props)
        msg_info("%s: TLS cipher list \"%s\"", props->namaddr, cipher_list);
     vstring_sprintf_append(myserverid, "&c=%s", cipher_list);
 
+    /*
+     * Finally, salt the session key with the OpenSSL library version,
+     * (run-time, rather than compile-time, just in case that matters).
+     */
+    vstring_sprintf_append(myserverid, "&l=%ld", (long) SSLeay());
+
     /*
      * Allocate a new TLScontext for the new connection and get an SSL
      * structure. Add the location of TLScontext to the SSL to later retrieve
@@ -859,12 +865,8 @@ TLS_SESS_STATE *tls_client_start(const TLS_CLIENT_START_PROPS *props)
     if (protomask != 0)
        SSL_set_options(TLScontext->con,
                   ((protomask & TLS_PROTOCOL_TLSv1) ? SSL_OP_NO_TLSv1 : 0L)
-#ifdef SSL_OP_NO_TLSv1_1
             | ((protomask & TLS_PROTOCOL_TLSv1_1) ? SSL_OP_NO_TLSv1_1 : 0L)
-#endif
-#ifdef SSL_OP_NO_TLSv1_2
             | ((protomask & TLS_PROTOCOL_TLSv1_2) ? SSL_OP_NO_TLSv1_2 : 0L)
-#endif
                 | ((protomask & TLS_PROTOCOL_SSLv3) ? SSL_OP_NO_SSLv3 : 0L)
               | ((protomask & TLS_PROTOCOL_SSLv2) ? SSL_OP_NO_SSLv2 : 0L));
 
index 245722216caca5fac729dd4e0374505164841c01..f0ebf669c5046a2fbe299ca562f4ea4c8cb3b654 100644 (file)
@@ -181,9 +181,10 @@ static SSL_SESSION *get_server_session_cb(SSL *ssl, unsigned char *session_id,
 
 #define GEN_CACHE_ID(buf, id, len, service) \
     do { \
-       buf = vstring_alloc(2 * (len) + 1 + strlen(service) + 3); \
+       buf = vstring_alloc(2 * (len + strlen(service))); \
        hex_encode(buf, (char *) (id), (len)); \
        vstring_sprintf_append(buf, "&s=%s", (service)); \
+       vstring_sprintf_append(buf, "&l=%ld", (long) SSLeay()); \
     } while (0)
 
 
@@ -403,12 +404,8 @@ TLS_APPL_STATE *tls_server_init(const TLS_SERVER_INIT_PROPS *props)
     if (protomask != 0)
        SSL_CTX_set_options(server_ctx,
                   ((protomask & TLS_PROTOCOL_TLSv1) ? SSL_OP_NO_TLSv1 : 0L)
-#ifdef SSL_OP_NO_TLSv1_1
             | ((protomask & TLS_PROTOCOL_TLSv1_1) ? SSL_OP_NO_TLSv1_1 : 0L)
-#endif
-#ifdef SSL_OP_NO_TLSv1_2
             | ((protomask & TLS_PROTOCOL_TLSv1_2) ? SSL_OP_NO_TLSv1_2 : 0L)
-#endif
                 | ((protomask & TLS_PROTOCOL_SSLv3) ? SSL_OP_NO_SSLv3 : 0L)
               | ((protomask & TLS_PROTOCOL_SSLv2) ? SSL_OP_NO_SSLv2 : 0L));
 
index d79596f57bf3184835745761ebce3efc66bee033..5dcfe5d553fc9bf48bab970e1b04378565d860e0 100644 (file)
@@ -180,6 +180,7 @@ typedef fd_set EVENT_MASK;
 #define EVENT_MASK_SET(fd, mask)       FD_SET((fd), (mask))
 #define EVENT_MASK_ISSET(fd, mask)     FD_ISSET((fd), (mask))
 #define EVENT_MASK_CLR(fd, mask)       FD_CLR((fd), (mask))
+#define EVENT_MASK_CMP(m1, m2) memcmp((m1), (m2), EVENT_MASK_BYTE_COUNT(m1))
 #else
 
  /*
@@ -226,6 +227,8 @@ typedef struct {
        (EVENT_MASK_FD_BYTE((fd), (mask)) & EVENT_MASK_FD_BIT(fd))
 #define EVENT_MASK_CLR(fd, mask) \
        (EVENT_MASK_FD_BYTE((fd), (mask)) &= ~EVENT_MASK_FD_BIT(fd))
+#define EVENT_MASK_CMP(m1, m2) \
+       memcmp((m1)->data, (m2)->data, EVENT_MASK_BYTE_COUNT(m1))
 #endif
 
  /*
@@ -664,8 +667,7 @@ void    event_drain(int time_limit)
     max_time = event_present + time_limit;
     while (event_present < max_time
           && (event_timer_head.pred != &event_timer_head
-              || memcmp(&zero_mask, &event_xmask,
-                        EVENT_MASK_BYTE_COUNT(&zero_mask)) != 0)) {
+              || EVENT_MASK_CMP(&zero_mask, &event_xmask) != 0)) {
        event_loop(1);
 #if (EVENTS_STYLE != EVENTS_STYLE_SELECT)
        if (EVENT_MASK_BYTE_COUNT(&zero_mask)