Fix regext substring capture variables for null matches. Bug 2933
[exim.git] / src / exim_monitor / em_init.c
index c9ef66a7e4c5df5d9465ad2bf8e6108659865179..e0bc3b0663d577b7564daf197ad5059d2e2386a6 100644 (file)
@@ -3,6 +3,7 @@
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2009 */
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2009 */
+/* Copyright (c) The Exim Maintainers 2020 - 2021 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* This module contains code to initialize things from the
 /* See the file NOTICE for conditions of use and distribution. */
 
 /* This module contains code to initialize things from the
@@ -31,7 +32,6 @@ int i;
 work. */
 
 for (i = 0; i <= 1; i++)
 work. */
 
 for (i = 0; i <= 1; i++)
-
   {
   int first = 1;
   int count = 0;
   {
   int first = 1;
   int count = 0;
@@ -68,14 +68,18 @@ for (i = 0; i <= 1; i++)
       buffer[p-pp] = 0;
       if (first)
         {
       buffer[p-pp] = 0;
       if (first)
         {
-        int offset;
-        const uschar *error;
-        stripchart_regex[indx] = pcre_compile(CS buffer, PCRE_COPT,
-          (const char **)&error, &offset, NULL);
-        if (stripchart_regex[indx] == NULL)
+        size_t offset;
+        int err;
+
+        if (!(stripchart_regex[indx] =
+               pcre2_compile((PCRE2_SPTR)buffer,
+                     PCRE2_ZERO_TERMINATED, PCRE_COPT,
+                     &err, &offset, NULL)))
           {
           {
-          printf("regular expression error: %s at offset %d "
-            "while compiling %s\n", error, offset, buffer);
+         uschar errbuf[128];
+         pcre2_get_error_message(err, errbuf, sizeof(errbuf));
+          printf("regular expression error: %s at offset %ld "
+            "while compiling %s\n", errbuf, (long)offset, buffer);
           exit(99);
           }
         }
           exit(99);
           }
         }
@@ -95,7 +99,7 @@ for (i = 0; i <= 1; i++)
   if (i == 0)
     {
     stripchart_number += count;
   if (i == 0)
     {
     stripchart_number += count;
-    stripchart_regex = (pcre **)store_malloc(stripchart_number * sizeof(pcre *));
+    stripchart_regex = (pcre2_code **)store_malloc(stripchart_number * sizeof(pcre2_code *));
     stripchart_title = (uschar **)store_malloc(stripchart_number * sizeof(uschar *));
     }
   }
     stripchart_title = (uschar **)store_malloc(stripchart_number * sizeof(uschar *));
     }
   }
@@ -109,40 +113,36 @@ for (i = 0; i <= 1; i++)
 void init(int argc, uschar **argv)
 {
 int x;
 void init(int argc, uschar **argv)
 {
 int x;
-int erroroffset;
+size_t erroroffset;
 uschar *s;
 uschar *s;
-const uschar *error;
 
 argc = argc;     /* These are currently unused. */
 argv = argv;
 
 /* Deal with simple values in the environment. */
 
 
 argc = argc;     /* These are currently unused. */
 argv = argv;
 
 /* Deal with simple values in the environment. */
 
-s = US getenv("ACTION_OUTPUT");
-if (s != NULL)
+if ((s = US getenv("ACTION_OUTPUT")))
   {
   if (Ustrcmp(s, "no") == 0) action_output = FALSE;
   if (Ustrcmp(s, "yes") == 0) action_output = TRUE;
   }
 
   {
   if (Ustrcmp(s, "no") == 0) action_output = FALSE;
   if (Ustrcmp(s, "yes") == 0) action_output = TRUE;
   }
 
-s = US getenv("ACTION_QUEUE_UPDATE");
-if (s != NULL)
+if ((s = US getenv("ACTION_QUEUE_UPDATE")))
   {
   if (Ustrcmp(s, "no") == 0) action_queue_update = FALSE;
   if (Ustrcmp(s, "yes") == 0) action_queue_update = TRUE;
   }
 
 s = US getenv("BODY_MAX");
   {
   if (Ustrcmp(s, "no") == 0) action_queue_update = FALSE;
   if (Ustrcmp(s, "yes") == 0) action_queue_update = TRUE;
   }
 
 s = US getenv("BODY_MAX");
-if (s != NULL && (x = Uatoi(s)) != 0) body_max = x;
+if (s && (x = Uatoi(s)) != 0) body_max = x;
 
 
-s = US getenv("EXIM_PATH");
-if (s != NULL) exim_path = string_copy(s);
+if ((s = US getenv("EXIM_PATH")))
+  exim_path = string_copy(s);
 
 
-s = US getenv("EXIMON_EXIM_CONFIG");
-if (s != NULL) alternate_config = string_copy(s);
+if ((s = US getenv("EXIMON_EXIM_CONFIG")))
+  alternate_config = string_copy(s);
 
 
-s = US getenv("LOG_BUFFER");
-if (s != NULL)
+if ((s = US getenv("LOG_BUFFER")))
   {
   uschar c[1];
   if (sscanf(CS s, "%d%c", &x, c) > 0)
   {
   uschar c[1];
   if (sscanf(CS s, "%d%c", &x, c) > 0)
@@ -154,63 +154,64 @@ if (s != NULL)
   }
 
 s = US getenv("LOG_DEPTH");
   }
 
 s = US getenv("LOG_DEPTH");
-if (s != NULL && (x = Uatoi(s)) != 0) log_depth = x;
+if (s && (x = Uatoi(s)) != 0) log_depth = x;
 
 
-s = US getenv("LOG_FILE_NAME");
-if (s != NULL) log_file = string_copy(s);
+if ((s = US getenv("LOG_FILE_NAME")))
+  log_file = string_copy(s);
 
 
-s = US getenv("LOG_FONT");
-if (s != NULL) log_font = string_copy(s);
+if ((s = US getenv("LOG_FONT")))
+  log_font = string_copy(s);
 
 s = US getenv("LOG_WIDTH");
 
 s = US getenv("LOG_WIDTH");
-if (s != NULL && (x = Uatoi(s)) != 0) log_width = x;
+if (s && (x = Uatoi(s)) != 0) log_width = x;
 
 
-s = US getenv("MENU_EVENT");
-if (s != NULL) menu_event = string_copy(s);
+if ((s = US getenv("MENU_EVENT")))
+  menu_event = string_copy(s);
 
 s = US getenv("MIN_HEIGHT");
 
 s = US getenv("MIN_HEIGHT");
-if (s != NULL && (x = Uatoi(s)) > 0) min_height = x;
+if (s && (x = Uatoi(s)) > 0) min_height = x;
 
 s = US getenv("MIN_WIDTH");
 
 s = US getenv("MIN_WIDTH");
-if (s != NULL && (x = Uatoi(s)) > 0) min_width = x;
+if (s && (x = Uatoi(s)) > 0) min_width = x;
 
 
-s = US getenv("QUALIFY_DOMAIN");
-if (s != NULL) qualify_domain = string_copy(s);
-  else qualify_domain = US"";  /* Don't want NULL */
+if ((s = US getenv("QUALIFY_DOMAIN")))
+  qualify_domain = string_copy(s);
+else
+  qualify_domain = US"";  /* Don't want NULL */
 
 s = US getenv("QUEUE_DEPTH");
 
 s = US getenv("QUEUE_DEPTH");
-if (s != NULL && (x = Uatoi(s)) != 0) queue_depth = x;
+if (s && (x = Uatoi(s)) != 0) queue_depth = x;
 
 
-s = US getenv("QUEUE_FONT");
-if (s != NULL) queue_font = string_copy(s);
+if ((s = US getenv("QUEUE_FONT")))
+  queue_font = string_copy(s);
 
 s = US getenv("QUEUE_INTERVAL");
 
 s = US getenv("QUEUE_INTERVAL");
-if (s != NULL && (x = Uatoi(s)) != 0) queue_update = x;
+if (s && (x = Uatoi(s)) != 0) queue_update = x;
 
 s = US getenv("QUEUE_MAX_ADDRESSES");
 
 s = US getenv("QUEUE_MAX_ADDRESSES");
-if (s != NULL && (x = Uatoi(s)) != 0) queue_max_addresses = x;
+if (s && (x = Uatoi(s)) != 0) queue_max_addresses = x;
 
 s = US getenv("QUEUE_WIDTH");
 
 s = US getenv("QUEUE_WIDTH");
-if (s != NULL && (x = Uatoi(s)) != 0) queue_width = x;
+if (s && (x = Uatoi(s)) != 0) queue_width = x;
 
 
-s = US getenv("SPOOL_DIRECTORY");
-if (s != NULL) spool_directory = string_copy(s);
+if ((s = US getenv("SPOOL_DIRECTORY")))
+  spool_directory = string_copy(s);
 
 s = US getenv("START_SMALL");
 
 s = US getenv("START_SMALL");
-if (s != NULL && Ustrcmp(s, "yes") == 0) start_small = 1;
+if (s && Ustrcmp(s, "yes") == 0) start_small = 1;
 
 s = US getenv("TEXT_DEPTH");
 
 s = US getenv("TEXT_DEPTH");
-if (s != NULL && (x = Uatoi(s)) != 0) text_depth = x;
+if (s && (x = Uatoi(s)) != 0) text_depth = x;
 
 
-s = US getenv("WINDOW_TITLE");
-if (s != NULL) window_title = string_copy(s);
+if ((s = US getenv("WINDOW_TITLE")))
+  window_title = string_copy(s);
 
 /* Deal with stripchart configuration. First see if we are monitoring
 the size of a partition, then deal with log stripcharts in a separate
 function */
 
 s = US getenv("SIZE_STRIPCHART");
 
 /* Deal with stripchart configuration. First see if we are monitoring
 the size of a partition, then deal with log stripcharts in a separate
 function */
 
 s = US getenv("SIZE_STRIPCHART");
-if (s != NULL && *s != 0)
+if (s && *s)
   {
   stripchart_number++;
   stripchart_varstart++;
   {
   stripchart_number++;
   stripchart_varstart++;
@@ -219,19 +220,19 @@ if (s != NULL && *s != 0)
   if (s != NULL && *s != 0) size_stripchart_name = string_copy(s);
   }
 
   if (s != NULL && *s != 0) size_stripchart_name = string_copy(s);
   }
 
-s = US getenv("LOG_STRIPCHARTS");
-if (s != NULL) decode_stripchart_config(s);
+if ((s = US getenv("LOG_STRIPCHARTS")))
+  decode_stripchart_config(s);
 
 s = US getenv("STRIPCHART_INTERVAL");
 
 s = US getenv("STRIPCHART_INTERVAL");
-if (s != NULL && (x = Uatoi(s)) != 0) stripchart_update = x;
+if (s && (x = Uatoi(s)) != 0) stripchart_update = x;
 
 s = US getenv("QUEUE_STRIPCHART_NAME");
 
 s = US getenv("QUEUE_STRIPCHART_NAME");
-queue_stripchart_name = (s != NULL)? string_copy(s) : US"queue";
+queue_stripchart_name = ? string_copy(s) : US"queue";
 
 /* Compile the regex for matching yyyy-mm-dd at the start of a string. */
 
 
 /* Compile the regex for matching yyyy-mm-dd at the start of a string. */
 
-yyyymmdd_regex = pcre_compile("^\\d{4}-\\d\\d-\\d\\d\\s", PCRE_COPT,
-  (const char **)&error, &erroroffset, NULL);
+yyyymmdd_regex = pcre2_compile((PCRE2_SPTR)"^\\d{4}-\\d\\d-\\d\\d\\s",
+  PCRE2_ZERO_TERMINATED, PCRE_COPT, &x, &erroroffset, NULL);
 }
 
 /* End of em_init.c */
 }
 
 /* End of em_init.c */