Fix regex substring capture variables for null matches (again). Bug 2933
[exim.git] / src / src / exim.c
index f2a787e8aca0da2f1389a40aa5227625bf44e91c..16c0184e0e5439309093397af9b79956c26a36e1 100644 (file)
@@ -127,14 +127,15 @@ BOOL yield;
 
 if ((yield = (res >= 0)))
   {
+  PCRE2_SIZE * ovec = pcre2_get_ovector_pointer(md);
   res = pcre2_get_ovector_count(md);
   expand_nmax = setup < 0 ? 0 : setup + 1;
   for (int matchnum = setup < 0 ? 0 : 1; matchnum < res; matchnum++)
     {
-    PCRE2_SIZE len;
-    pcre2_substring_get_bynumber(md, matchnum,
-      (PCRE2_UCHAR **)&expand_nstring[expand_nmax], &len);
-    expand_nlength[expand_nmax++] = (int)len;
+    int off = matchnum * 2;
+    int len = ovec[off + 1] - ovec[off];
+    expand_nstring[expand_nmax] = string_copyn(subject + ovec[off], len);
+    expand_nlength[expand_nmax++] = len;
     }
   expand_nmax--;
   }
@@ -3329,7 +3330,7 @@ on the second character (the one after '-'), to save some effort. */
 
        else if (Ustrcmp(argrest, "ai") == 0)
          authenticated_id = string_copy_taint(
-           exim_str_fail_toolong(argv[++i], EXIM_EMAILADDR_MAX, "-oMas"),
+           exim_str_fail_toolong(argv[++i], EXIM_EMAILADDR_MAX, "-oMai"),
            GET_TAINTED);
 
        /* -oMi: Set incoming interface address */