]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-2.10-20121226
authorWietse Venema <wietse@porcupine.org>
Wed, 26 Dec 2012 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <viktor@dukhovni.org>
Tue, 5 Feb 2013 06:38:23 +0000 (06:38 +0000)
postfix/HISTORY
postfix/src/global/mail_version.h
postfix/src/postconf/Makefile.in
postfix/src/postconf/postconf.h
postfix/src/postconf/postconf_builtin.c
postfix/src/postconf/postconf_dbms.c
postfix/src/postconf/postconf_lookup.c
postfix/src/postconf/postconf_main.c
postfix/src/postconf/postconf_master.c
postfix/src/postconf/postconf_user.c
postfix/src/smtpd/smtpd.c

index 8cabbf7357f661eb3e6af84075a675f20c826ea0..79c4f0881638951efcc3cf39c7f7f93aabbcfb94 100644 (file)
@@ -17203,6 +17203,7 @@ Apologies for any names omitted.
        smtp/smtp_params.c, smtp/smtp_proto.c, smtpd/smtpd.c,
        tls/tls.h, tls/tls_client.c, tls/tls_misc.c, tls/tls_server.c,
        tlsmgr/tlsmgr.c, tlsproxy/tlsproxy.c.
+
 20111203
 
        Cleanup: time-dependent sender addresses of address
@@ -18181,3 +18182,12 @@ Apologies for any names omitted.
        Feature: "postconf -Mn" support to print only master.cf
        entries that have "-o name=value" parameter setttings.
        Files: postconf/postconf_master.c.
+
+20121226
+
+       Miscellaneous cleanups of postconf internal APIs,
+       identifiers and comments. No changes in behavior.
+
+       Bugfix (omission in feature 20111203): the SMTP server
+       supported time-dependent address-verification sender addresses
+       only with RCPT TO but not with MAIL FROM. File: smtpd/smtpd.c.
index d3bbd539a8c19c099788c38beee34695fe0aed6a..9cd5501eef25468a330b22cc3a69042acbcc6d2b 100644 (file)
@@ -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      "20121224"
+#define MAIL_RELEASE_DATE      "20121226"
 #define MAIL_VERSION_NUMBER    "2.10"
 
 #ifdef SNAPSHOT
index 6b44aa6773949e7648f8f22b1c6d951cea454f69..41423d32f57ea989b00eb06fde29b65e879f9da2 100644 (file)
@@ -56,7 +56,7 @@ update: ../../bin/$(PROG) $(SAMPLES)
 
 $(MAKES): makes_dummy
 
-makes_dummy: $(INC_DIR)/mail_params.h ../global/mail_params.c
+makes_dummy: $(INC_DIR)/mail_params.h ../global/mail_params.c extract.awk Makefile.in
        $(AWK) -f extract.awk ../*/*.c | $(SHELL)
        touch makes_dummy
 
index 0f7e5864d12681a741eae37fbeb3fd0b8eb8d5c8..363d4d48deffafa81dcc9e648d266a5b35647ac3 100644 (file)
@@ -185,7 +185,7 @@ extern void register_user_parameters(void);
   * postconf_dbms.c
   */
 extern void register_dbms_parameters(const char *,
-                               const char *(*) (const char *, int, char *),
+                      const char *(*) (const char *, int, PC_MASTER_ENT *),
                                             PC_MASTER_ENT *);
 
  /*
@@ -193,7 +193,8 @@ extern void register_dbms_parameters(const char *,
   */
 const char *lookup_parameter_value(int, const char *, PC_MASTER_ENT *,
                                           PC_PARAM_NODE *);
-const char *expand_parameter_value(int, const char *, PC_MASTER_ENT *);
+
+char   *expand_parameter_value(VSTRING *, int, const char *, PC_MASTER_ENT *);
 
  /*
   * postconf_unused.c.
index 239477ed522baafbecfe37609f0d1548781547b1..d845d49510268899a7c3f9685362089799f8aa8a 100644 (file)
@@ -143,8 +143,8 @@ static const CONFIG_STR_TABLE legacy_str_table[] = {
   * function. We direct the calls to our own versions of those functions
   * because the run-time conditions are slightly different.
   * 
-  * Important: if the evaluation of these parameters has any side effects, then
-  * those side effects must happen only once.
+  * Important: if the evaluation of a parameter default value has any side
+  * effects, then those side effects must happen only once.
   */
 static const char *pc_check_myhostname(void);
 static const char *pc_check_mydomainname(void);
@@ -162,8 +162,8 @@ static const CONFIG_STR_FN_TABLE str_fn_table[] = {
   * The AWK script cannot identify these parameters or values, so we provide
   * our own.
   * 
-  * Important: if the evaluation of these parameters has any side effects, then
-  * those side effects must happen only once.
+  * Important: if the evaluation of a parameter default value has any side
+  * effects, then those side effects must happen only once.
   */
 static CONFIG_STR_TABLE adhoc_procname = {VAR_PROCNAME};
 static CONFIG_INT_TABLE adhoc_pid = {VAR_PID};
@@ -205,7 +205,7 @@ static void get_myhostname(void)
 
     if ((name = mail_conf_lookup_eval(VAR_MYHOSTNAME)) == 0)
        name = pc_check_myhostname();
-    var_mynetworks = mystrdup(name);
+    var_myhostname = mystrdup(name);
 }
 
 /* pc_check_mydomainname - lookup domain name and validate */
@@ -225,9 +225,9 @@ static const char *pc_check_mydomainname(void)
      * Use the hostname when it is not a FQDN ("foo"), or when the hostname
      * actually is a domain name ("foo.com").
      */
-    if (var_mynetworks == 0)
+    if (var_myhostname == 0)
        get_myhostname();
-    if ((dot = strchr(var_mynetworks, '.')) == 0 || strchr(dot + 1, '.') == 0)
+    if ((dot = strchr(var_myhostname, '.')) == 0 || strchr(dot + 1, '.') == 0)
        return (domain = DEF_MYDOMAIN);
     return (domain = mystrdup(dot + 1));
 }
@@ -373,7 +373,7 @@ void    register_builtin_parameters(const char *procname, pid_t pid)
     /*
      * Initialize the global parameter table.
      */
-    param_table = PC_PARAM_TABLE_CREATE(100);
+    param_table = PC_PARAM_TABLE_CREATE(1000);
 
     /*
      * Add the built-in parameters to the global name space. The class
index 024c2bf5a201646936f41053fb3159f59f0da672..128a8adda8dc990a58d116ef0f74dc8ca15bfdc1 100644 (file)
@@ -9,7 +9,7 @@
 /*     void    register_dbms_parameters(param_value, flag_parameter,
 /*                                     local_scope)
 /*     const char *param_value;
-/*     const char *(flag_parameter) (const char *, int, char *);
+/*     const char *(flag_parameter) (const char *, int, PC_MASTER_ENT *);
 /*     PC_MASTER_ENT *local_scope;
 /* DESCRIPTION
 /*     This module implements legacy support for database configuration
@@ -25,7 +25,7 @@
 /*     names for that database type.
 /* .IP flag_parameter
 /*     A function that takes as arguments a candidate parameter
-/*     name, an unused value, and a PC_PARAM_CTX pointer.  The
+/*     name, parameter flags, and a PC_MASTER_ENT pointer.  The
 /*     function will flag the parameter as "used" if it has a
 /*     "name=value" entry in the local or global namespace.
 /* .IP local_scope
@@ -145,7 +145,7 @@ static const PC_DBMS_INFO dbms_info[] = {
 /* register_dbms_parameters - look for database_type:prefix_name */
 
 void    register_dbms_parameters(const char *param_value,
-                  const char *(flag_parameter) (const char *, int, char *),
+          const char *(flag_parameter) (const char *, int, PC_MASTER_ENT *),
                                         PC_MASTER_ENT *local_scope)
 {
     const PC_DBMS_INFO *dp;
@@ -155,18 +155,15 @@ void    register_dbms_parameters(const char *param_value,
     static VSTRING *buffer = 0;
     static VSTRING *candidate = 0;
     const char **cpp;
-    PC_PARAM_CTX param_ctx;
-
-    param_ctx.local_scope = local_scope;
-    param_ctx.param_class = PC_PARAM_FLAG_DBMS | PC_PARAM_FLAG_USER;
 
     /*
      * XXX This does not examine both sides of conditional macro expansion,
      * and may expand the "wrong" conditional macros. This is the best we can
      * do for legacy database configuration support.
      */
-    bufp = STR(vstring_strcpy(buffer ? buffer : (buffer = vstring_alloc(100)),
-             expand_parameter_value(SHOW_EVAL, param_value, local_scope)));
+    if (buffer == 0)
+       buffer = vstring_alloc(100);
+    bufp = expand_parameter_value(buffer, SHOW_EVAL, param_value, local_scope);
 
     /*
      * Naive parsing. We don't really know if the parameter specifies free
@@ -192,7 +189,9 @@ void    register_dbms_parameters(const char *param_value,
                        vstring_sprintf(candidate ? candidate :
                                        (candidate = vstring_alloc(30)),
                                        "%s_%s", prefix, *cpp);
-                       flag_parameter(STR(candidate), 0, (char *) &param_ctx);
+                       flag_parameter(STR(candidate),
+                                   PC_PARAM_FLAG_DBMS | PC_PARAM_FLAG_USER,
+                                      local_scope);
                    }
                    break;
                }
index 6ad1b9f8c70ae96a6488fbaa71670c1879c1fc3d..dc3c6964bd100011101fa781ff46be27d9f30c96 100644 (file)
@@ -12,7 +12,8 @@
 /*     PC_MASTER_ENT *local_scope;
 /*     PC_PARAM_NODE *node;
 /*
-/*     const char *expand_parameter_value(mode, value, local_scope)
+/*     char    *expand_parameter_value(buf, mode, value, local_scope)
+/*     VSTRING *buf;
 /*     int     mode;
 /*     const char *value;
 /*     PC_MASTER_ENT *local_scope;
@@ -38,6 +39,8 @@
 /*     each call.
 /*
 /*     Arguments:
+/* .IP buf
+/*     Null pointer, or pointer to output storage.
 /* .IP mode
 /*     Bit-wise OR of zero or one of the following (other flags
 /*     are ignored):
@@ -54,9 +57,9 @@
 /*     The parameter value where $name should be expanded.
 /* .IP local_scope
 /*     Null pointer, or pointer to master.cf entry with local
-/*     parameter definitions.
+/*     name=value settings.
 /* .IP node
-/*     Null pointer, or global default settings for the named
+/*     Null pointer, or global default setting for the named
 /*     parameter.
 /* DIAGNOSTICS
 /*     Problems are reported to the standard error stream.
@@ -128,11 +131,11 @@ typedef struct {
     PC_MASTER_ENT *local_scope;
 } PC_EVAL_CTX;
 
-/* expand_parameter_value_helper - macro parser call-back routine */
+/* lookup_parameter_value_wrapper - macro parser call-back routine */
 
-static const char *expand_parameter_value_helper(const char *key,
-                                                        int unused_type,
-                                                        char *context)
+static const char *lookup_parameter_value_wrapper(const char *key,
+                                                         int unused_type,
+                                                         char *context)
 {
     PC_EVAL_CTX *cp = (PC_EVAL_CTX *) context;
 
@@ -142,19 +145,22 @@ static const char *expand_parameter_value_helper(const char *key,
 
 /* expand_parameter_value - expand $name in parameter value */
 
-const char *expand_parameter_value(int mode, const char *value,
-                                          PC_MASTER_ENT *local_scope)
+char   *expand_parameter_value(VSTRING *buf, int mode, const char *value,
+                                      PC_MASTER_ENT *local_scope)
 {
     const char *myname = "expand_parameter_value";
-    static VSTRING *buf;
+    static VSTRING *local_buf;
     int     status;
     PC_EVAL_CTX eval_ctx;
 
     /*
      * Initialize.
      */
-    if (buf == 0)
-       buf = vstring_alloc(10);
+    if (buf == 0) {
+       if (local_buf == 0)
+           local_buf = vstring_alloc(10);
+       buf = local_buf;
+    }
 
     /*
      * Expand macros recursively.
@@ -170,7 +176,7 @@ const char *expand_parameter_value(int mode, const char *value,
     eval_ctx.mode = (mode & ~SHOW_NONDEF);
     eval_ctx.local_scope = local_scope;
     status = mac_expand(buf, value, MAC_EXP_FLAG_RECURSE, DONT_FILTER,
-                       expand_parameter_value_helper, (char *) &eval_ctx);
+                       lookup_parameter_value_wrapper, (char *) &eval_ctx);
     if (status & MAC_PARSE_ERROR)
        msg_fatal("macro processing error");
     if (msg_verbose > 1) {
index 21626cd2a4440819b53350ae98ea8a126ae86fa5..a2e2e34aac640b8a3cc18387ea0f393d4b806396 100644 (file)
@@ -177,7 +177,8 @@ static void print_parameter(int mode, const char *name,
      */
     if (value != 0) {
        if ((mode & SHOW_EVAL) != 0 && PC_RAW_PARAMETER(node) == 0)
-           value = expand_parameter_value(mode, value, (PC_MASTER_ENT *) 0);
+           value = expand_parameter_value((VSTRING *) 0, mode, value,
+                                          (PC_MASTER_ENT *) 0);
        if (mode & SHOW_NAME) {
            print_line(mode, "%s = %s\n", name, value);
        } else {
index 0e1ac970e2349fec9de28159986b8b6b1b46c74d..8e16a2a5c5430f2766a5c084dae02477f34851f5 100644 (file)
@@ -245,7 +245,8 @@ static void print_master_line(int mode, PC_MASTER_ENT *masterp)
                if (strcmp(arg, "-o") == 0
                    && (aval = argv[field + 1]) != 0
                    && (mode & SHOW_EVAL) != 0)
-                   aval = expand_parameter_value(mode, aval, masterp);
+                   aval = expand_parameter_value((VSTRING *) 0, mode,
+                                                 aval, masterp);
 
                /*
                 * Keep option and value on the same line.
index 563da5c0912b5f401b4c910f97058fbb96ef604f..195c8173957be6672b8334a8d757c6a267934dd2 100644 (file)
@@ -96,16 +96,7 @@ static HTABLE *rest_class_table;
     _ctx.local_scope = (scope); \
     _ctx.param_class = (class); \
     (void) mac_expand(NO_SCAN_RESULT, (value), MAC_EXP_FLAG_SCAN, \
-           NO_SCAN_FILTER, flag_user_parameter, (char *) &_ctx); \
-} while (0)
-
-/* FLAG_USER_PARAMETER - flag user-defined name "valid" if it has name=value */
-
-#define FLAG_USER_PARAMETER(name, class, scope) do { \
-    PC_PARAM_CTX _ctx; \
-    _ctx.local_scope = (scope); \
-    _ctx.param_class = (class); \
-    flag_user_parameter((name), NO_SCAN_MODE, (char *) &_ctx); \
+           NO_SCAN_FILTER, flag_user_parameter_wrapper, (char *) &_ctx); \
 } while (0)
 
 /* convert_user_parameter - get user-defined parameter string value */
@@ -118,12 +109,9 @@ static const char *convert_user_parameter(char *unused_ptr)
 /* flag_user_parameter - flag user-defined name "valid" if it has name=value */
 
 static const char *flag_user_parameter(const char *mac_name,
-                                              int unused_mode,
-                                              char *context)
+                                              int param_class,
+                                              PC_MASTER_ENT *local_scope)
 {
-    PC_PARAM_CTX *param_ctx = (PC_PARAM_CTX *) context;
-    PC_MASTER_ENT *local_scope = param_ctx->local_scope;
-    int     param_class = param_ctx->param_class;
     const char *source = local_scope ? MASTER_CONF_FILE : MAIN_CONF_FILE;
     int     user_supplied = 0;
 
@@ -201,6 +189,17 @@ static const char *flag_user_parameter(const char *mac_name,
     return (0);
 }
 
+/* flag_user_parameter_wrapper - max_expand call-back helper */
+
+static const char *flag_user_parameter_wrapper(const char *mac_name,
+                                                      int unused_mode,
+                                                      char *context)
+{
+    PC_PARAM_CTX *ctx = (PC_PARAM_CTX *) context;
+
+    return (flag_user_parameter(mac_name, ctx->param_class, ctx->local_scope));
+}
+
 /* pc_lookup_eval - generalized mail_conf_lookup_eval */
 
 static const char *pc_lookup_eval(const char *dict_name, const char *name)
@@ -243,7 +242,7 @@ static void scan_user_parameter_namespace(const char *dict_name,
            if (local_scope == 0
                && htable_locate(rest_class_table, param_name) == 0)
                htable_enter(rest_class_table, param_name, "");
-           FLAG_USER_PARAMETER(param_name, PC_PARAM_FLAG_USER, local_scope);
+           flag_user_parameter(param_name, PC_PARAM_FLAG_USER, local_scope);
        }
        myfree(saved_class_list);
     }
index ce0b937bcbe0ab2d4413068b057b345a661a48d7..8cf16913184a9637ea6c0268104da7f949c2329a 100644 (file)
@@ -2352,6 +2352,21 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
                         VERP_CMD);
        return (-1);
     }
+    if (SMTPD_STAND_ALONE(state) == 0) {
+       const char *verify_sender;
+
+       /*
+        * XXX Don't reject the address when we're probed with our own
+        * address verification sender address. Otherwise, some timeout or
+        * some UCE block may result in mutual negative caching, making it
+        * painful to get the mail through. Unfortunately we still have to
+        * send the address to the Milters otherwise they may bail out with a
+        * "missing recipient" protocol error.
+        */
+       verify_sender = valid_verify_sender_addr(STR(state->addr_buf));
+       if (verify_sender != 0)
+           vstring_strcpy(state->addr_buf, verify_sender);
+    }
     if (SMTPD_STAND_ALONE(state) == 0
        && var_smtpd_delay_reject == 0
        && (err = smtpd_check_mail(state, STR(state->addr_buf))) != 0) {