Handle a v4mapped sender address given us by a proxy. Bug 2855
[exim.git] / src / exim_monitor / em_main.c
index 7aa760eb3e2d5e7f19b3eac7671ce01638f77c0e..5714b999caad38dd4b8b071b4a5f6dd8cab20d15 100644 (file)
@@ -3,6 +3,7 @@
 *************************************************/
 
 /* Copyright (c) University of Cambridge 1995 - 2018 */
+/* Copyright (c) The Exim Maintainers 2021 - 2022 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 
@@ -173,8 +174,6 @@ va_start(ap, format);
 vfprintf(stderr, format, ap);
 fprintf(stderr, "\n");
 va_end(ap);
-selector = selector;     /* Keep picky compilers happy */
-flags = flags;
 }
 
 
@@ -198,19 +197,47 @@ Returns:     0 if there is no port, else the port number.
 */
 
 int
-host_address_extract_port(uschar *address)
+host_address_extract_port(uschar * address)
 {
-int skip = -3;                     /* Skip 3 dots in IPv4 addresses */
-address--;
-while (*(++address) != 0)
+int port = 0;
+uschar *endptr;
+
+/* Handle the "bracketed with colon on the end" format */
+
+if (*address == '[')
+  {
+  uschar *rb = address + 1;
+  while (*rb != 0 && *rb != ']') rb++;
+  if (*rb++ == 0) return 0;            /* Missing ]; leave invalid address */
+  if (*rb == ':')
+    {
+    port = Ustrtol(rb + 1, &endptr, 10);
+    if (*endptr != 0) return 0;                /* Invalid port; leave invalid address */
+    }
+  else if (*rb != 0) return 0;         /* Bad syntax; leave invalid address */
+  memmove(address, address + 1, rb - address - 2);
+  rb[-2] = 0;
+  }
+
+/* Handle the "dot on the end" format */
+
+else
   {
-  int ch = *address;
-  if (ch == ':') skip = 0;         /* Skip 0 dots in IPv6 addresses */
-    else if (ch == '.' && skip++ >= 0) break;
+  int skip = -3;                       /* Skip 3 dots in IPv4 addresses */
+  address--;
+  while (*(++address) != 0)
+    {
+    int ch = *address;
+    if (ch == ':') skip = 0;           /* Skip 0 dots in IPv6 addresses */
+      else if (ch == '.' && skip++ >= 0) break;
+    }
+  if (*address == 0) return 0;
+  port = Ustrtol(address + 1, &endptr, 10);
+  if (*endptr != 0) return 0;          /* Invalid port; leave invalid address */
+  *address = 0;
   }
-if (*address == 0) return 0;
-*address++ = 0;
-return Uatoi(address);
+
+return port;
 }
 
 
@@ -240,9 +267,6 @@ if (action_queue_update) tick_queue_accumulator = 999999;
 
 void updateAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
-w = w;       /* Keep picky compilers happy */
-client_data = client_data;
-call_data = call_data;
 scan_spool_input(TRUE);
 queue_display();
 tick_queue_accumulator = 0;
@@ -250,9 +274,6 @@ tick_queue_accumulator = 0;
 
 void hideAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
-w = w;       /* Keep picky compilers happy */
-client_data = client_data;
-call_data = call_data;
 actioned_message[0] = 0;
 dialog_ref_widget = w;
 dialog_action = da_hide;
@@ -263,11 +284,7 @@ void unhideAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
 skip_item *sk = queue_skip;
 
-w = w;       /* Keep picky compilers happy */
-client_data = client_data;
-call_data = call_data;
-
-while (sk != NULL)
+while (sk)
   {
   skip_item *next = sk->next;
   store_free(sk);
@@ -285,9 +302,6 @@ tick_queue_accumulator = 0;
 
 void quitAction(Widget w, XtPointer client_data, XtPointer call_data)
 {
-w = w;       /* Keep picky compilers happy */
-client_data = client_data;
-call_data = call_data;
 exit(0);
 }
 
@@ -318,10 +332,6 @@ Dimension width, height;
 XWindowAttributes a;
 Window w = XtWindow(toplevel_widget);
 
-button = button;    /* Keep picky compilers happy */
-client_data = client_data;
-call_data = call_data;
-
 /* Get the position and size of the top level widget. */
 
 sizepos_args[0].value = (XtArgVal)(&width);
@@ -473,9 +483,6 @@ tick_queue_accumulator += tick_interval;
 tick_stripchart_accumulator += tick_interval;
 read_log();
 
-pt = pt;    /* Keep picky compilers happy */
-i = i;
-
 /* If we have passed the queue update time, we must do a full
 scan of the queue, checking for new arrivals, etc. This will
 as a by-product set the count of items for use by the stripchart
@@ -592,7 +599,8 @@ return ret;
 *               Initialize                       *
 *************************************************/
 
-int main(int argc, char **argv)
+int
+main(int argc, char **argv)
 {
 int i;
 struct stat statdata;
@@ -613,7 +621,8 @@ message_subdir[1] = 0;
 constructing file names and things. This call will initialize
 the store_get() function. */
 
-big_buffer = store_get(big_buffer_size);
+store_init();
+big_buffer = store_get(big_buffer_size, GET_UNTAINTED);
 
 /* Set up the version string and date and output them */
 
@@ -655,7 +664,7 @@ if (log_file[0] != 0)
   {
   /* Do *not* use "%s" here, we need the %D datestamp in the log_file to
   be expanded! */
-  (void)string_format(log_file_open, sizeof(log_file_open), CS log_file);
+  (void)string_format(log_file_open, sizeof(log_file_open), CS log_file, NULL);
   log_datestamping = string_datestamp_offset >= 0;
 
   LOG = fopen(CS log_file_open, "r");