]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-3.6.4 v3.6.4
authorWietse Venema <wietse@porcupine.org>
Fri, 14 Jan 2022 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Wed, 19 Jan 2022 03:36:14 +0000 (22:36 -0500)
postfix/HISTORY
postfix/src/global/mail_params.h
postfix/src/global/mail_version.h
postfix/src/oqmgr/qmgr_feedback.c
postfix/src/proxymap/proxymap.c
postfix/src/qmgr/qmgr_feedback.c
postfix/src/smtpd/smtpd.c

index 538f86001fd0c4aad4c1c7a258d583159275c27a..07f458c1c0e6e6cc1b1105524bffa24d72c95173 100644 (file)
@@ -25694,3 +25694,34 @@ Apologies for any names omitted.
        previously occupied by the original message body.
 
        Problem report by BenoĆ®t Panizzon.
+
+20211115
+
+       Bugfix (introduced: 20210708): duplicate bounce_notice_recipient
+       entries in postconf output. The fix to send SMTP session
+       transcripts to bounce_notice_recipient was incomplete.
+       Reported by Vincent Lefevre. File: smtpd/smtpd.c.
+
+20211216
+
+       Bugfix (introduced: Postfix 3.0): the proxymap daemon did
+       not automatically authorize proxied maps inside pipemap
+       (example: pipemap:{proxy:maptype:mapname, ...}) or inside
+       unionmap. Problem reported by Mirko Vogt. Files:
+       proxymap/proxymap.c.
+
+20211220
+
+       Bugfix (introduced: Postfix 2.5): off-by-one error while
+       writing a string terminator. This code had passed all memory
+       corruption tests, presumably because it wrote over an
+       alignment padding byte, or over an adjacent character byte
+       that was never read. Reported by Robert Siemer. Files:
+       *qmgr/qmgr_feedback.c.
+
+20211223
+
+       Cleanup: added missing _maps parameter names to the
+       proxy_read_maps default value, based on output from the
+       mantools/missing-proxy-read-maps script.  File:
+       global/mail_params.h.
index ed99874eb01e176f2a9a1350ce408eb5943be087..d0c50eb17f498829daef10a254e8f942ebd90022 100644 (file)
@@ -2491,7 +2491,11 @@ extern int var_local_rcpt_code;
                                " $" VAR_SMTPD_EHLO_DIS_MAPS \
                                " $" VAR_SMTPD_MILTER_MAPS \
                                " $" VAR_VIRT_GID_MAPS \
-                               " $" VAR_VIRT_UID_MAPS
+                               " $" VAR_VIRT_UID_MAPS \
+                               " $" VAR_LOCAL_LOGIN_SND_MAPS \
+                               " $" VAR_PSC_REJ_FTR_MAPS \
+                               " $" VAR_SMTPD_REJ_FTR_MAPS \
+                               " $" VAR_TLS_SERVER_SNI_MAPS
 extern char *var_proxy_read_maps;
 
 #define VAR_PROXY_WRITE_MAPS   "proxy_write_maps"
index 099c17c901807d534b13ccb02d525748ba592886..b995ab32466e304d9cd8b76cb4b583576db8a4f1 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      "20211107"
-#define MAIL_VERSION_NUMBER    "3.6.3"
+#define MAIL_RELEASE_DATE      "20220114"
+#define MAIL_VERSION_NUMBER    "3.6.4"
 
 #ifdef SNAPSHOT
 #define MAIL_VERSION_DATE      "-" MAIL_RELEASE_DATE
index f341b9591d3b77d65472f4b669ac7feedd87638d..bf7aebb20354df3b13196d9bf0e832ad7afd27e7 100644 (file)
@@ -109,7 +109,7 @@ void    qmgr_feedback_init(QMGR_FEEDBACK *fb,
     double  enum_val;
     char    denom_str[30 + 1];
     double  denom_val;
-    char    slash;
+    char    slash[1 + 1];
     char    junk;
     char   *fbck_name;
     char   *fbck_val;
@@ -135,7 +135,7 @@ void    qmgr_feedback_init(QMGR_FEEDBACK *fb,
     fb->base = -1;                             /* assume error */
 
     switch (sscanf(fbck_val, "%lf %1[/] %30s%c",
-                  &enum_val, &slash, denom_str, &junk)) {
+                  &enum_val, slash, denom_str, &junk)) {
     case 1:
        fb->index = QMGR_FEEDBACK_IDX_NONE;
        fb->base = enum_val;
index b0b844678061e1938eab316db5ce64052775882a..73163905eb52d4da8e185062cff1f667a815ef87 100644 (file)
 #include <htable.h>
 #include <stringops.h>
 #include <dict.h>
+#include <dict_pipe.h>
+#include <dict_union.h>
 
 /* Global library. */
 
@@ -295,6 +297,27 @@ static int proxy_writer;
 #define STR(x)                 vstring_str(x)
 #define VSTREQ(x,y)            (strcmp(STR(x),y) == 0)
 
+/* get_nested_dict_name - return nested dictionary name pointer, or null */
+
+static char *get_nested_dict_name(char *type_name)
+{
+    const struct {
+       const char *type_col;
+       ssize_t type_col_len;
+    }      *prefix, prefixes[] = {
+       DICT_TYPE_UNION ":", (sizeof(DICT_TYPE_UNION ":") - 1),
+       DICT_TYPE_PIPE ":", (sizeof(DICT_TYPE_PIPE ":") - 1),
+    };
+
+#define COUNT_OF(x) (sizeof(x)/sizeof((x)[0]))
+
+    for (prefix = prefixes; prefix < prefixes + COUNT_OF(prefixes); prefix++) {
+       if (strncmp(type_name, prefix->type_col, prefix->type_col_len) == 0)
+           return (type_name + prefix->type_col_len);
+    }
+    return (0);
+}
+
 /* proxy_map_find - look up or open table */
 
 static DICT *proxy_map_find(const char *map_type_name, int request_flags,
@@ -660,41 +683,17 @@ DICT   *dict_proxy_open(const char *map, int open_flags, int dict_flags)
     return (dict_open(map, open_flags, dict_flags));
 }
 
-/* post_jail_init - initialization after privilege drop */
+/* authorize_proxied_maps - recursively authorize maps */
 
-static void post_jail_init(char *service_name, char **unused_argv)
+static void authorize_proxied_maps(char *bp)
 {
     const char *sep = CHARS_COMMA_SP;
     const char *parens = CHARS_BRACE;
-    char   *saved_filter;
-    char   *bp;
     char   *type_name;
 
-    /*
-     * Are we proxy writer?
-     */
-    if (strcmp(service_name, MAIL_SERVICE_PROXYWRITE) == 0)
-       proxy_writer = 1;
-    else if (strcmp(service_name, MAIL_SERVICE_PROXYMAP) != 0)
-       msg_fatal("service name must be one of %s or %s",
-                 MAIL_SERVICE_PROXYMAP, MAIL_SERVICE_PROXYMAP);
-
-    /*
-     * Pre-allocate buffers.
-     */
-    request = vstring_alloc(10);
-    request_map = vstring_alloc(10);
-    request_key = vstring_alloc(10);
-    request_value = vstring_alloc(10);
-    map_type_name_flags = vstring_alloc(10);
-
-    /*
-     * Prepare the pre-approved list of proxied tables.
-     */
-    saved_filter = bp = mystrdup(proxy_writer ? var_proxy_write_maps :
-                                var_proxy_read_maps);
-    proxy_auth_maps = htable_create(13);
     while ((type_name = mystrtokq(&bp, sep, parens)) != 0) {
+       char   *nested_info;
+
        /* Maybe { maptype:mapname attr=value... } */
        if (*type_name == parens[0]) {
            char   *err;
@@ -710,6 +709,22 @@ static void post_jail_init(char *service_name, char **unused_argv)
            if ((type_name = mystrtokq(&type_name, sep, parens)) == 0)
                continue;
        }
+       /* Recurse into nested map (pipemap, unionmap). */
+       if ((nested_info = get_nested_dict_name(type_name)) != 0) {
+           char   *err;
+
+           if (*nested_info != parens[0])
+               continue;
+           /* Warn about blatant syntax error. */
+           if ((err = extpar(&nested_info, parens, EXTPAR_FLAG_NONE)) != 0) {
+               msg_warn("bad %s parameter value: %s",
+                        PROXY_MAP_PARAM_NAME(proxy_writer), err);
+               myfree(err);
+               continue;
+           }
+           authorize_proxied_maps(nested_info);
+           continue;
+       }
        if (strncmp(type_name, PROXY_COLON, PROXY_COLON_LEN))
            continue;
        do {
@@ -723,6 +738,39 @@ static void post_jail_init(char *service_name, char **unused_argv)
                         PROXY_MAP_PARAM_NAME(proxy_writer));
        }
     }
+}
+
+/* post_jail_init - initialization after privilege drop */
+
+static void post_jail_init(char *service_name, char **unused_argv)
+{
+    char   *saved_filter;
+
+    /*
+     * Are we proxy writer?
+     */
+    if (strcmp(service_name, MAIL_SERVICE_PROXYWRITE) == 0)
+       proxy_writer = 1;
+    else if (strcmp(service_name, MAIL_SERVICE_PROXYMAP) != 0)
+       msg_fatal("service name must be one of %s or %s",
+                 MAIL_SERVICE_PROXYMAP, MAIL_SERVICE_PROXYMAP);
+
+    /*
+     * Pre-allocate buffers.
+     */
+    request = vstring_alloc(10);
+    request_map = vstring_alloc(10);
+    request_key = vstring_alloc(10);
+    request_value = vstring_alloc(10);
+    map_type_name_flags = vstring_alloc(10);
+
+    /*
+     * Prepare the pre-approved list of proxied tables.
+     */
+    saved_filter = mystrdup(proxy_writer ? var_proxy_write_maps :
+                           var_proxy_read_maps);
+    proxy_auth_maps = htable_create(13);
+    authorize_proxied_maps(saved_filter);
     myfree(saved_filter);
 
     /*
index f341b9591d3b77d65472f4b669ac7feedd87638d..bf7aebb20354df3b13196d9bf0e832ad7afd27e7 100644 (file)
@@ -109,7 +109,7 @@ void    qmgr_feedback_init(QMGR_FEEDBACK *fb,
     double  enum_val;
     char    denom_str[30 + 1];
     double  denom_val;
-    char    slash;
+    char    slash[1 + 1];
     char    junk;
     char   *fbck_name;
     char   *fbck_val;
@@ -135,7 +135,7 @@ void    qmgr_feedback_init(QMGR_FEEDBACK *fb,
     fb->base = -1;                             /* assume error */
 
     switch (sscanf(fbck_val, "%lf %1[/] %30s%c",
-                  &enum_val, &slash, denom_str, &junk)) {
+                  &enum_val, slash, denom_str, &junk)) {
     case 1:
        fb->index = QMGR_FEEDBACK_IDX_NONE;
        fb->base = enum_val;
index fc47e012f6cf3740173cc79dac5b30e51e70e2a8..7e95b32fd69b13e9b0b86a9cc6b2740bf35fe2c2 100644 (file)
@@ -6432,7 +6432,7 @@ int     main(int argc, char **argv)
        VAR_EOD_CHECKS, DEF_EOD_CHECKS, &var_eod_checks, 0, 0,
        VAR_MAPS_RBL_DOMAINS, DEF_MAPS_RBL_DOMAINS, &var_maps_rbl_domains, 0, 0,
        VAR_RBL_REPLY_MAPS, DEF_RBL_REPLY_MAPS, &var_rbl_reply_maps, 0, 0,
-       VAR_BOUNCE_RCPT, DEF_ERROR_RCPT, &var_bounce_rcpt, 1, 0,
+       VAR_BOUNCE_RCPT, DEF_BOUNCE_RCPT, &var_bounce_rcpt, 1, 0,
        VAR_ERROR_RCPT, DEF_ERROR_RCPT, &var_error_rcpt, 1, 0,
        VAR_REST_CLASSES, DEF_REST_CLASSES, &var_rest_classes, 0, 0,
        VAR_CANONICAL_MAPS, DEF_CANONICAL_MAPS, &var_canonical_maps, 0, 0,