Fix pcre2 interface for older versions
[exim.git] / src / src / exim.c
index 833045018cb352c20f65196420e894135c9ffb7e..a31a8a1b937b54c71c19eaf9f71920a353aed43c 100644 (file)
@@ -3,7 +3,7 @@
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2018 */
-/* Copyright (c) The Exim Maintainers 2020 */
+/* Copyright (c) The Exim Maintainers 2020 - 2021 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -40,20 +40,7 @@ extern void init_lookup_list(void);
 for store allocation via Exim's store manager. The normal calls are actually
 macros that pass over location information to make tracing easier. These
 functions just interface to the standard macro calls. A good compiler will
-optimize out the tail recursion and so not make them too expensive. There
-are two sets of functions; one for use when we want to retain the compiled
-regular expression for a long time; the other for short-term use. */
-
-static void *
-function_store_get(PCRE2_SIZE size, void * tag)
-{
-/* For now, regard all RE results as potentially tainted.  We might need
-more intelligence on this point. */
-return store_get((int)size, TRUE);
-}
-
-static void
-function_dummy_free(void * block, void * tag) {}
+optimize out the tail recursion and so not make them too expensive. */
 
 static void *
 function_store_malloc(PCRE2_SIZE size, void * tag)
@@ -64,7 +51,8 @@ return store_malloc((int)size);
 static void
 function_store_free(void * block, void * tag)
 {
-store_free(block);
+/* At least some version of pcre2 pass a null pointer */
+if (block) store_free(block);
 }
 
 
@@ -122,7 +110,7 @@ if (!(yield = pcre2_compile((PCRE2_SPTR)pattern, PCRE2_ZERO_TERMINATED, options,
   uschar errbuf[128];
   pcre2_get_error_message(err, errbuf, sizeof(errbuf));
   log_write(0, LOG_MAIN|LOG_PANIC_DIE, "regular expression error: "
-    "%s at offset %d while compiling %s", errbuf, (long)offset, pattern);
+    "%s at offset %ld while compiling %s", errbuf, (long)offset, pattern);
   }
 
 if (use_malloc)
@@ -1056,7 +1044,7 @@ g = string_cat(NULL, US"Support for:");
   g = string_cat(g, US" OCSP");
 #endif
 #ifndef DISABLE_PIPE_CONNECT
-  g = string_cat(g, US" PIPE_CONNECT");
+  g = string_cat(g, US" PIPECONNECT");
 #endif
 #ifndef DISABLE_PRDR
   g = string_cat(g, US" PRDR");
@@ -1065,7 +1053,7 @@ g = string_cat(NULL, US"Support for:");
   g = string_cat(g, US" PROXY");
 #endif
 #ifndef DISABLE_QUEUE_RAMP
-  g = string_cat(g, US" Experimental_Queue_Ramp");
+  g = string_cat(g, US" Queue_Ramp");
 #endif
 #ifdef SUPPORT_SOCKS
   g = string_cat(g, US" SOCKS");
@@ -5433,7 +5421,7 @@ if (smtp_input)
   {
   if (!f.is_inetd) set_process_info("accepting a local %sSMTP message from <%s>",
     smtp_batched_input? "batched " : "",
-    (sender_address!= NULL)? sender_address : originator_login);
+    sender_address ? sender_address : originator_login);
   }
 else
   {
@@ -5483,7 +5471,8 @@ if (smtp_input)
     }
   }
 
-/* Otherwise, set up the input size limit here. */
+/* Otherwise, set up the input size limit here and set no stdin stdio buffer
+(we handle buferring so as to have visibility of fill level). */
 
 else
   {
@@ -5495,6 +5484,8 @@ else
     else
       log_write(0, LOG_MAIN|LOG_PANIC_DIE, "invalid value for "
         "message_size_limit: %s", expand_string_message);
+
+  setvbuf(stdin, NULL, _IONBF, 0);
   }
 
 /* Loop for several messages when reading SMTP input. If we fork any child