Mark variables unused before release of store in the daemon loop
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 13 Mar 2018 13:52:26 +0000 (13:52 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 13 Mar 2018 14:53:16 +0000 (14:53 +0000)
doc/doc-txt/ChangeLog
src/src/daemon.c
src/src/functions.h
src/src/smtp_in.c

index 786df05063e5e9df9aafb83a4e66c9e6206a2840..344671add0e5e6e84b2f3b102a16bc221571e1aa 100644 (file)
@@ -141,6 +141,11 @@ JH/27 Bug 2251: Fix ldap lookups that return a single attribute having zero-
 HS/02 Support Avast multiline protoocol, this allows passing flags to
       newer versions of the scanner.
 
+JH/28 Ensure that variables possibly set during message acceptance are marked
+      dead before release of memory in the daemon loop.  This stops complaints
+      about them when the debug_store option is enabled.  Discovered specifically
+      for sender_rate_period, but applies to a whole set of variables.
+
 
 Exim version 4.90
 -----------------
index 476ed296b61e57f62b7a801c1f18f788a34c8246..4a89afe742b0ba8005ad19950ec22239f53d6496 100644 (file)
@@ -563,18 +563,13 @@ if (pid == 0)
 
     /* Reclaim up the store used in accepting this message */
 
-    return_path = sender_address = NULL;
-    authenticated_sender = NULL;
-    sending_ip_address = NULL;
-    deliver_host_address = deliver_host =
-    deliver_domain_orig = deliver_localpart_orig = NULL;
-    dnslist_domain = dnslist_matched = NULL;
-    callout_address = NULL;
-#ifndef DISABLE_DKIM
-    dkim_cur_signer = NULL;
-#endif
-    acl_var_m = NULL;
-    store_reset(reset_point);
+      {
+      int r = receive_messagecount;
+      BOOL q = queue_only_policy;
+      smtp_reset(reset_point);
+      queue_only_policy = q;
+      receive_messagecount = r;
+      }
 
     /* If queue_only is set or if there are too many incoming connections in
     existence, session_local_queue_only will be TRUE. If it is not, check
index 1f201fc69b1eb0347ded3b2dcd943b04b18b03fc..4e60ec2c817444f54a1a7862dd96640d857e95bf 100644 (file)
@@ -442,6 +442,7 @@ extern void    smtp_log_no_mail(void);
 extern void    smtp_message_code(uschar **, int *, uschar **, uschar **, BOOL);
 extern void    smtp_proxy_tls(uschar *, size_t, int *, int);
 extern BOOL    smtp_read_response(smtp_inblock *, uschar *, int, int, int);
+extern void    smtp_reset(void *);
 extern void    smtp_respond(uschar *, int, BOOL, uschar *);
 extern void    smtp_notquit_exit(uschar *, uschar *, uschar *, ...);
 extern void    smtp_port_for_connect(host_item *, int);
index a0cc581c26c07387834baf3b8302833d977c9097..a229721cfb7891668635a3bc874d8d322b8b7bce 100644 (file)
@@ -1947,13 +1947,13 @@ return TRUE;
 *************************************************/
 
 /* This function is called whenever the SMTP session is reset from
-within either of the setup functions.
+within either of the setup functions; also from the daemon loop.
 
 Argument:   the stacking pool storage reset point
 Returns:    nothing
 */
 
-static void
+void
 smtp_reset(void *reset_point)
 {
 recipients_list = NULL;
@@ -1997,9 +1997,8 @@ bmi_verdicts = NULL;
 #endif
 dnslist_domain = dnslist_matched = NULL;
 #ifndef DISABLE_DKIM
-dkim_signers = NULL;
-dkim_disable_verify = FALSE;
-dkim_collect_input = FALSE;
+dkim_cur_signer = dkim_signers = NULL;
+dkim_disable_verify = dkim_collect_input = FALSE;
 #endif
 dsn_ret = 0;
 dsn_envid = NULL;
@@ -2008,10 +2007,7 @@ deliver_host = deliver_host_address = NULL;      /* Can be set by ACL */
 prdr_requested = FALSE;
 #endif
 #ifdef SUPPORT_SPF
-spf_header_comment = NULL;
-spf_received = NULL;
-spf_result = NULL;
-spf_smtp_comment = NULL;
+spf_header_comment = spf_received = spf_result = spf_smtp_comment = NULL;
 #endif
 #ifdef SUPPORT_I18N
 message_smtputf8 = FALSE;