]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-3.4.26 v3.4.26
authorWietse Venema <wietse@porcupine.org>
Mon, 18 Apr 2022 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Mon, 18 Apr 2022 19:04:20 +0000 (15:04 -0400)
postfix/HISTORY
postfix/src/cleanup/cleanup.h
postfix/src/cleanup/cleanup_init.c
postfix/src/cleanup/cleanup_milter.c
postfix/src/cleanup/cleanup_state.c
postfix/src/global/dynamicmaps.c
postfix/src/global/mail_params.h
postfix/src/global/mail_version.h
postfix/src/util/inet_connect.c

index 8a684a2614137d61d9a7f2fbfaa703d7f36e2f2b..794a85f743b54d99f5f1d036f79bf6b5c2e08fa4 100644 (file)
@@ -24763,3 +24763,38 @@ Apologies for any names omitted.
 
        Bitrot: Berkeley DB 18 is like Berkeley DB 6. Yasuhiro
        Kimura. File: util/dict_db.c.
+
+20220322
+
+       Cleanup: added missing _checks, _reply_footer, _reply_filter,
+       _command_filter, and _delivery_status_filter parameter names
+       to the proxy_read_maps default value. Files: global/mail_params.h,
+       mantools/missing-proxy-read-maps.
+
+20220404
+
+       Bugfix: in an internal client module, "host or service not
+       found" was a fatal error, causing the milter_default_action
+       setting to be ignored. It is now a non-fatal error. The
+       same client is used by many Postfix clients (smtpd_proxy,
+       dovecot auth, tcp_table, memcache, socketmap, and so on).
+       Problem reported by Christian Degenkolb. File: util/inet_connect.c.
+
+20220415
+
+       Cleanup (problem introduced: Postfix 3.0): with dynamic map
+       loading enabled, an attempt to create a map with "postmap
+       regexp:path" would result in a bogus error message "Is the
+       postfix-regexp package installed?" instead of "unsupported
+       map type for this operation". This happened with all built-in
+       map types (static, cidr, etc.) that have no 'bulk create'
+       support. Problem reported by Greg Klanderman. File:
+       global/dynamicmaps.c.
+
+20220417
+
+       Cleanup (problem introduced: Postfix 2.7): milter_header_checks
+       maps are now opened before the cleanup server enters the
+       chroot jail. Problem reported by Jesper Dybdal. Files:
+       cleanup/cleanup.h, cleanup/cleanup_init.c,
+       cleanup/cleanup_milter.c, cleanup/cleanup_state.c.
index 50fe6ebd02d8487626f6f41c01a5dd319b83154c..df88a70d36ff0448554acc23ab5675dd914b42c3 100644 (file)
@@ -117,8 +117,6 @@ typedef struct CLEANUP_STATE {
     VSTRING *milter_ext_from;          /* externalized sender */
     VSTRING *milter_ext_rcpt;          /* externalized recipient */
     VSTRING *milter_err_text;          /* milter call-back reply */
-    HBC_CHECKS *milter_hbc_checks;     /* Milter header checks */
-    VSTRING *milter_hbc_reply;         /* Milter header checks reply */
     VSTRING *milter_dsn_buf;           /* Milter DSN parsing buffer */
 
     /*
@@ -318,6 +316,7 @@ extern int cleanup_bounce(CLEANUP_STATE *);
  /*
   * cleanup_milter.c.
   */
+extern void cleanup_milter_header_checks_init(void);
 extern void cleanup_milter_receive(CLEANUP_STATE *, int);
 extern void cleanup_milter_inspect(CLEANUP_STATE *, MILTERS *);
 extern void cleanup_milter_emul_mail(CLEANUP_STATE *, MILTERS *, const char *);
index e411992d6d4a27a6d7b10e40de53c2d10425f830..cc85172d4673492a0e97529ea6bdfef7077c3226 100644 (file)
@@ -426,6 +426,8 @@ void    cleanup_pre_jail(char *unused_name, char **unused_argv)
                                        var_milt_eod_macros,
                                        var_milt_unk_macros,
                                        var_milt_macro_deflts);
+    if (*var_milt_head_checks)
+       cleanup_milter_header_checks_init();
 
     flush_init();
 }
index f2f585f42f89ac8195ff8f82808a9a36696a9a4a..4758e92a53c63349902827769a5c1811a9dad4ff 100644 (file)
@@ -6,6 +6,8 @@
 /* SYNOPSIS
 /*     #include <cleanup.h>
 /*
+/*     void    cleanup_milter_header_checks_init(void)
+/*
 /*     void    cleanup_milter_receive(state, count)
 /*     CLEANUP_STATE *state;
 /*     int     count;
@@ -32,6 +34,9 @@
 /*     filter (milter) applications, including in-place queue file
 /*     modification.
 /*
+/*     cleanup_milter_header_checks_init() does pre-jail
+/*     initializations.
+/*
 /*     cleanup_milter_receive() receives mail filter definitions,
 /*     typically from an smtpd(8) server process, and registers
 /*     local call-back functions for macro expansion and for queue
 
 /*#define msg_verbose  2*/
 
+static HBC_CHECKS *cleanup_milter_hbc_checks;
+static VSTRING *cleanup_milter_hbc_reply;
 static void cleanup_milter_set_error(CLEANUP_STATE *, int);
 static const char *cleanup_add_rcpt_par(void *, const char *, const char *);
 
@@ -342,9 +349,9 @@ static char *cleanup_milter_hbc_extend(void *context, const char *command,
            state->errs |= CLEANUP_STAT_CONT;
        state->flags &= ~CLEANUP_FLAG_FILTER_ALL;
        cleanup_milter_hbc_log(context, "reject", where, buf, state->reason);
-       vstring_sprintf(state->milter_hbc_reply, "%d %s",
+       vstring_sprintf(cleanup_milter_hbc_reply, "%d %s",
                        detail->smtp, state->reason);
-       STR(state->milter_hbc_reply)[0] = *state->reason;
+       STR(cleanup_milter_hbc_reply)[0] = *state->reason;
        return ((char *) buf);
     }
     if (STREQUAL(command, "FILTER", cmd_len)) {
@@ -365,7 +372,7 @@ static char *cleanup_milter_hbc_extend(void *context, const char *command,
     }
     if (STREQUAL(command, "DISCARD", cmd_len)) {
        cleanup_milter_hbc_log(context, "discard", where, buf, optional_text);
-       vstring_strcpy(state->milter_hbc_reply, "D");
+       vstring_strcpy(cleanup_milter_hbc_reply, "D");
        state->flags |= CLEANUP_FLAG_DISCARD;
        state->flags &= ~CLEANUP_FLAG_FILTER_ALL;
        return ((char *) buf);
@@ -406,7 +413,7 @@ static int cleanup_milter_header_checks(CLEANUP_STATE *state, VSTRING *buf)
      * end-of-message stage, therefore all the header operations are relative
      * to the primary message header.
      */
-    ret = hbc_header_checks((void *) state, state->milter_hbc_checks,
+    ret = hbc_header_checks((void *) state, cleanup_milter_hbc_checks,
                            MIME_HDR_PRIMARY, (HEADER_OPTS *) 0,
                            buf, (off_t) 0);
     if (ret == 0) {
@@ -501,8 +508,10 @@ static void cleanup_milter_hbc_add_meta_records(CLEANUP_STATE *state)
 
 /* cleanup_milter_header_checks_init - initialize post-Milter header checks */
 
-static void cleanup_milter_header_checks_init(CLEANUP_STATE *state)
+void    cleanup_milter_header_checks_init(void)
 {
+    static const char myname[] = "cleanup_milter_header_checks_init";
+
 #define NO_NESTED_HDR_NAME     ""
 #define NO_NESTED_HDR_VALUE    ""
 #define NO_MIME_HDR_NAME       ""
@@ -514,30 +523,60 @@ static void cleanup_milter_header_checks_init(CLEANUP_STATE *state)
        cleanup_milter_hbc_extend,
     };
 
-    state->milter_hbc_checks =
+    if (*var_milt_head_checks == 0)
+       msg_panic("%s: %s is empty", myname, VAR_MILT_HEAD_CHECKS);
+
+    if (cleanup_milter_hbc_checks)
+       msg_panic("%s: cleanup_milter_hbc_checks is not null");
+    cleanup_milter_hbc_checks =
        hbc_header_checks_create(VAR_MILT_HEAD_CHECKS, var_milt_head_checks,
                                 NO_MIME_HDR_NAME, NO_MIME_HDR_VALUE,
                                 NO_NESTED_HDR_NAME, NO_NESTED_HDR_VALUE,
                                 &call_backs);
-    state->milter_hbc_reply = vstring_alloc(100);
+
+    if (cleanup_milter_hbc_reply)
+       msg_panic("%s: cleanup_milter_hbc_reply is not null");
+    cleanup_milter_hbc_reply = vstring_alloc(100);
+}
+
+#ifdef TEST
+
+/* cleanup_milter_header_checks_deinit - undo cleanup_milter_header_checks_init */
+
+static void cleanup_milter_header_checks_deinit(void)
+{
+    static const char myname[] = "cleanup_milter_header_checks_deinit";
+
+    if (cleanup_milter_hbc_checks == 0)
+       msg_panic("%s: cleanup_milter_hbc_checks is null", myname);
+    hbc_header_checks_free(cleanup_milter_hbc_checks);
+    cleanup_milter_hbc_checks = 0;
+
+    if (cleanup_milter_hbc_reply == 0)
+       msg_panic("%s: cleanup_milter_hbc_reply is null", myname);
+    vstring_free(cleanup_milter_hbc_reply);
+    cleanup_milter_hbc_reply = 0;
+}
+
+#endif
+
+/* cleanup_milter_header_checks_reinit - re-init post-Milter header checks */
+
+static void cleanup_milter_header_checks_reinit(CLEANUP_STATE *state)
+{
     if (state->filter)
        myfree(state->filter);
     state->filter = 0;
     if (state->redirect)
        myfree(state->redirect);
     state->redirect = 0;
+    VSTRING_RESET(cleanup_milter_hbc_reply);
 }
 
 /* cleanup_milter_hbc_finish - finalize post-Milter header checks */
 
 static void cleanup_milter_hbc_finish(CLEANUP_STATE *state)
 {
-    if (state->milter_hbc_checks)
-       hbc_header_checks_free(state->milter_hbc_checks);
-    state->milter_hbc_checks = 0;
-    if (state->milter_hbc_reply)
-       vstring_free(state->milter_hbc_reply);
-    state->milter_hbc_reply = 0;
     if (CLEANUP_OUT_OK(state)
        && !CLEANUP_MILTER_REJECTING_OR_DISCARDING_MESSAGE(state)
        && (state->filter || state->redirect))
@@ -641,7 +680,7 @@ static const char *cleanup_add_header(void *context, const char *name,
      */
     buf = vstring_alloc(100);
     vstring_sprintf(buf, "%s:%s%s", name, space, value);
-    if (state->milter_hbc_checks) {
+    if (cleanup_milter_hbc_checks) {
        if (cleanup_milter_header_checks(state, buf) == 0
            || (state->flags & CLEANUP_FLAG_DISCARD)) {
            vstring_free(buf);
@@ -704,8 +743,8 @@ static const char *cleanup_add_header(void *context, const char *name,
      * In case of error while doing record output.
      */
     return (CLEANUP_OUT_OK(state) == 0 ? cleanup_milter_error(state, 0) :
-           state->milter_hbc_reply && LEN(state->milter_hbc_reply) ?
-           STR(state->milter_hbc_reply) : 0);
+           cleanup_milter_hbc_reply && LEN(cleanup_milter_hbc_reply) ?
+           STR(cleanup_milter_hbc_reply) : 0);
 
     /*
      * Note: state->append_hdr_pt_target never changes.
@@ -1029,7 +1068,7 @@ static const char *cleanup_patch_header(CLEANUP_STATE *state,
      * be dropped.
      */
     vstring_sprintf(buf, "%s:%s%s", new_hdr_name, hdr_space, new_hdr_value);
-    if (state->milter_hbc_checks
+    if (cleanup_milter_hbc_checks
        && cleanup_milter_header_checks(state, buf) == 0)
        CLEANUP_PATCH_HEADER_RETURN(0);
 
@@ -1098,8 +1137,8 @@ static const char *cleanup_patch_header(CLEANUP_STATE *state,
      */
     CLEANUP_PATCH_HEADER_RETURN(
               CLEANUP_OUT_OK(state) == 0 ? cleanup_milter_error(state, 0) :
-                  state->milter_hbc_reply && LEN(state->milter_hbc_reply) ?
-                               STR(state->milter_hbc_reply) : 0);
+                cleanup_milter_hbc_reply && LEN(cleanup_milter_hbc_reply) ?
+                               STR(cleanup_milter_hbc_reply) : 0);
 
     /*
      * Note: state->append_hdr_pt_target never changes.
@@ -1979,8 +2018,8 @@ static const char *cleanup_milter_apply(CLEANUP_STATE *state, const char *event,
      * Don't process our own milter_header/body checks replies. See comments
      * in cleanup_milter_hbc_extend().
      */
-    if (state->milter_hbc_reply &&
-       strcmp(resp, STR(state->milter_hbc_reply)) == 0)
+    if (cleanup_milter_hbc_reply &&
+       strcmp(resp, STR(cleanup_milter_hbc_reply)) == 0)
        return (0);
 
     /*
@@ -2144,7 +2183,7 @@ void    cleanup_milter_inspect(CLEANUP_STATE *state, MILTERS *milters)
      * Prologue: prepare for Milter header/body checks.
      */
     if (*var_milt_head_checks)
-       cleanup_milter_header_checks_init(state);
+       cleanup_milter_header_checks_reinit(state);
 
     /*
      * Process mail filter replies. The reply format is verified by the mail
@@ -2557,9 +2596,10 @@ int     main(int unused_argc, char **argv)
                cleanup_milter_hbc_finish(state);
                myfree(var_milt_head_checks);
                var_milt_head_checks = "";
+               cleanup_milter_header_checks_deinit();
            }
            close_queue_file(state);
-       } else if (state->milter_hbc_reply && LEN(state->milter_hbc_reply)) {
+       } else if (cleanup_milter_hbc_reply && LEN(cleanup_milter_hbc_reply)) {
            /* Postfix libmilter would skip further requests. */
            msg_info("ignoring: %s %s %s", argv->argv[0],
                     argv->argc > 1 ? argv->argv[1] : "",
@@ -2661,7 +2701,7 @@ int     main(int unused_argc, char **argv)
                msg_warn("can't change header checks");
            } else {
                var_milt_head_checks = mystrdup(argv->argv[1]);
-               cleanup_milter_header_checks_init(state);
+               cleanup_milter_header_checks_init();
            }
        } else if (strcmp(argv->argv[0], "sender_bcc_maps") == 0) {
            if (argv->argc != 2) {
index 7790f1b515dcb6eae72dd091b4489d1dc59d9f1d..99adf84b9863f9fd21c4a4a6a55997a8d79ea6a4 100644 (file)
@@ -107,8 +107,6 @@ CLEANUP_STATE *cleanup_state_alloc(VSTREAM *src)
     state->append_hdr_pt_target = -1;
     state->append_meta_pt_offset = -1;
     state->append_meta_pt_target = -1;
-    state->milter_hbc_checks = 0;
-    state->milter_hbc_reply = 0;
     state->rcpt_count = 0;
     state->reason = 0;
     state->smtp_reply = 0;
index f97846013b6b6bfbe1e0b1c3fc6151ff31ed873b..c624a3e49083dc104e4db17a5283d084f6ec413b 100644 (file)
@@ -168,11 +168,23 @@ static MKMAP_OPEN_FN dymap_mkmap_lookup(const char *dict_type)
      * All errors are fatal. If the postmap(1) or postalias(1) command can't
      * create the requested database, then graceful degradation is not
      * useful.
+     * 
+     * Fix 20220416: if this dictionary type is registered for some non-mkmap
+     * purpose, then don't talk nonsense about a missing package.
      */
-    if ((dp = (DYMAP_INFO *) htable_find(dymap_info, dict_type)) == 0)
+    if ((dp = (DYMAP_INFO *) htable_find(dymap_info, dict_type)) == 0) {
+       ARGV   *types = dict_mapnames();
+       char  **cpp;
+
+       for (cpp = types->argv; *cpp; cpp++) {
+           if (strcmp(dict_type, *cpp) == 0)
+               msg_fatal("unsupported dictionary type: %s does not support "
+                         "bulk-mode creation.", dict_type);
+       }
        msg_fatal("unsupported dictionary type: %s. "
                  "Is the postfix-%s package installed?",
                  dict_type, dict_type);
+    }
     if (!dp->mkmap_name)
        msg_fatal("unsupported dictionary type: %s does not support "
                  "bulk-mode creation.", dict_type);
index 91aa3a344962d5d6aa9ad1ddd8b8bff826c8fad4..5e738b70294f5182a2aa7f6d8840258e72d9e77b 100644 (file)
@@ -2442,7 +2442,33 @@ extern int var_local_rcpt_code;
                                " $" VAR_VIRT_UID_MAPS \
                                " $" VAR_PSC_REJ_FTR_MAPS \
                                " $" VAR_SMTPD_REJ_FTR_MAPS \
-                               " $" VAR_TLS_SERVER_SNI_MAPS
+                               " $" VAR_TLS_SERVER_SNI_MAPS \
+                               " $" VAR_DSN_FILTER \
+                               " $" VAR_LMTP_DSN_FILTER \
+                               " $" VAR_LMTP_DNS_RE_FILTER \
+                               " $" VAR_LMTP_RESP_FILTER \
+                               " $" VAR_LOCAL_DSN_FILTER \
+                               " $" VAR_PIPE_DSN_FILTER \
+                               " $" VAR_PSC_CMD_FILTER \
+                               " $" VAR_SMTP_DSN_FILTER \
+                               " $" VAR_SMTP_DNS_RE_FILTER \
+                               " $" VAR_SMTP_RESP_FILTER \
+                               " $" VAR_SMTPD_CMD_FILTER \
+                               " $" VAR_SMTPD_DNS_RE_FILTER \
+                               " $" VAR_VIRT_DSN_FILTER \
+                               " $" VAR_BODY_CHECKS \
+                               " $" VAR_HEADER_CHECKS \
+                               " $" VAR_LMTP_BODY_CHKS \
+                               " $" VAR_LMTP_HEAD_CHKS \
+                               " $" VAR_LMTP_MIME_CHKS \
+                               " $" VAR_LMTP_NEST_CHKS \
+                               " $" VAR_MILT_HEAD_CHECKS \
+                               " $" VAR_MIMEHDR_CHECKS \
+                               " $" VAR_NESTHDR_CHECKS \
+                               " $" VAR_SMTP_BODY_CHKS \
+                               " $" VAR_SMTP_HEAD_CHKS \
+                               " $" VAR_SMTP_MIME_CHKS \
+                               " $" VAR_SMTP_NEST_CHKS
 extern char *var_proxy_read_maps;
 
 #define VAR_PROXY_WRITE_MAPS   "proxy_write_maps"
index 7855a343123d9e0cde86c27148738fdcacdbb174..4347e5b041901c5b1e37b18444be4778cf275271 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      "20220205"
-#define MAIL_VERSION_NUMBER    "3.4.25"
+#define MAIL_RELEASE_DATE      "20220418"
+#define MAIL_VERSION_NUMBER    "3.4.26"
 
 #ifdef SNAPSHOT
 #define MAIL_VERSION_DATE      "-" MAIL_RELEASE_DATE
index 51bd13930b400592cc5957375bb67be8bcca4dd6..256e98cdc7c33c9364a9c2e954a104960bb7496f 100644 (file)
@@ -96,10 +96,13 @@ int     inet_connect(const char *addr, int block_mode, int timeout)
     if ((parse_err = host_port(buf, &host, "localhost", &port, (char *) 0)) != 0)
        msg_fatal("%s: %s", addr, parse_err);
     if ((aierr = hostname_to_sockaddr(host, port, SOCK_STREAM, &res0)) != 0)
-       msg_fatal("host/service %s/%s not found: %s",
-                 host, port, MAI_STRERROR(aierr));
+       msg_warn("host or service %s not found: %s",
+                addr, MAI_STRERROR(aierr));
     myfree(buf);
-
+    if (aierr) {
+       errno = EADDRNOTAVAIL;                  /* for up-stream "%m" */
+       return (-1);
+    }
     proto_info = inet_proto_info();
     for (sock = -1, found = 0, res = res0; res != 0; res = res->ai_next) {