b1dca6
commit c7bf5ceab6ec776ac7350d3b0190776bf532ac54
b1dca6
Author: Florian Weimer <fweimer@redhat.com>
b1dca6
Date:   Sat Nov 2 21:55:35 2019 +0100
b1dca6
b1dca6
    Properly initialize audit cookie for the dynamic loader [BZ #25157]
b1dca6
    
b1dca6
    The l_audit array is indexed by audit module, not audit function.
b1dca6
    
b1dca6
    Change-Id: I180eb3573dc1c57433750f5d8cb18271460ba5f2
b1dca6
b1dca6
Conflicts:
b1dca6
	elf/Makefile
b1dca6
	  (Test backport differences.)
b1dca6
b1dca6
diff --git a/elf/Makefile b/elf/Makefile
b1dca6
index 4e1356b9172aee02..4ab73dc48d9ac126 100644
b1dca6
--- a/elf/Makefile
b1dca6
+++ b/elf/Makefile
b1dca6
@@ -192,7 +192,8 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \
b1dca6
 	 tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \
b1dca6
 	 tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \
b1dca6
 	 tst-audit13 \
b1dca6
-	 tst-sonamemove-link tst-sonamemove-dlopen tst-initfinilazyfail \
b1dca6
+	 tst-sonamemove-link tst-sonamemove-dlopen \
b1dca6
+	 tst-auditmany tst-initfinilazyfail \
b1dca6
 	 tst-dlopenfail tst-dlopenfail-2 \
b1dca6
 	 tst-filterobj tst-filterobj-dlopen tst-auxobj tst-auxobj-dlopen
b1dca6
 #	 reldep9
b1dca6
@@ -303,6 +304,9 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
b1dca6
 		tst-absolute-zero-lib tst-big-note-lib \
b1dca6
 		tst-audit13mod1 tst-sonamemove-linkmod1 \
b1dca6
 		tst-sonamemove-runmod1 tst-sonamemove-runmod2 \
b1dca6
+		tst-auditmanymod1 tst-auditmanymod2 tst-auditmanymod3 \
b1dca6
+		tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \
b1dca6
+		tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \
b1dca6
 		tst-initlazyfailmod tst-finilazyfailmod \
b1dca6
 		tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \
b1dca6
 		tst-dlopenfailmod3 \
b1dca6
@@ -1433,6 +1437,14 @@ $(objpfx)tst-audit13.out: $(objpfx)tst-audit13mod1.so
b1dca6
 LDFLAGS-tst-audit13mod1.so = -Wl,-z,lazy
b1dca6
 tst-audit13-ENV = LD_AUDIT=$(objpfx)tst-audit13mod1.so
b1dca6
 
b1dca6
+$(objpfx)tst-auditmany.out: $(objpfx)tst-auditmanymod1.so \
b1dca6
+  $(objpfx)tst-auditmanymod2.so $(objpfx)tst-auditmanymod3.so \
b1dca6
+  $(objpfx)tst-auditmanymod4.so $(objpfx)tst-auditmanymod5.so \
b1dca6
+  $(objpfx)tst-auditmanymod6.so $(objpfx)tst-auditmanymod7.so \
b1dca6
+  $(objpfx)tst-auditmanymod8.so	$(objpfx)tst-auditmanymod9.so
b1dca6
+tst-auditmany-ENV = \
b1dca6
+  LD_AUDIT=tst-auditmanymod1.so:tst-auditmanymod2.so:tst-auditmanymod3.so:tst-auditmanymod4.so:tst-auditmanymod5.so:tst-auditmanymod6.so:tst-auditmanymod7.so:tst-auditmanymod8.so:tst-auditmanymod9.so
b1dca6
+
b1dca6
 # tst-sonamemove links against an older implementation of the library.
b1dca6
 LDFLAGS-tst-sonamemove-linkmod1.so = \
b1dca6
   -Wl,--version-script=tst-sonamemove-linkmod1.map \
b1dca6
diff --git a/elf/rtld.c b/elf/rtld.c
b1dca6
index ffbd8f4553bb3425..f557f39a70669c09 100644
b1dca6
--- a/elf/rtld.c
b1dca6
+++ b/elf/rtld.c
b1dca6
@@ -1008,13 +1008,7 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
b1dca6
 
b1dca6
       /* Store the pointer.  */
b1dca6
       if (err_str == NULL && largs.result != NULL)
b1dca6
-	{
b1dca6
-	  newp->fptr[cnt] = largs.result;
b1dca6
-
b1dca6
-	  /* The dynamic linker link map is statically allocated,
b1dca6
-	     initialize the data now.  */
b1dca6
-	  GL(dl_rtld_map).l_audit[cnt].cookie = (intptr_t) &GL(dl_rtld_map);
b1dca6
-	}
b1dca6
+	newp->fptr[cnt] = largs.result;
b1dca6
       else
b1dca6
 	newp->fptr[cnt] = NULL;
b1dca6
       ++cnt;
b1dca6
@@ -1030,6 +1024,12 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
b1dca6
     *last_audit = GLRO(dl_audit) = &newp->ifaces;
b1dca6
   else
b1dca6
     *last_audit = (*last_audit)->next = &newp->ifaces;
b1dca6
+
b1dca6
+  /* The dynamic linker link map is statically allocated, initialize
b1dca6
+     the data now.  */
b1dca6
+  GL (dl_rtld_map).l_audit[GLRO (dl_naudit)].cookie
b1dca6
+    = (intptr_t) &GL (dl_rtld_map);
b1dca6
+
b1dca6
   ++GLRO(dl_naudit);
b1dca6
 
b1dca6
   /* Mark the DSO as being used for auditing.  */
b1dca6
diff --git a/elf/tst-auditmany.c b/elf/tst-auditmany.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..9d68105b9e707b46
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmany.c
b1dca6
@@ -0,0 +1,26 @@
b1dca6
+/* Check cookie initialization for many auditors.  Main program.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+/* It does not make sense to use the test harness for this test
b1dca6
+   because the testing happens in auditors.  */
b1dca6
+
b1dca6
+int
b1dca6
+main (void)
b1dca6
+{
b1dca6
+  return 0;
b1dca6
+}
b1dca6
diff --git a/elf/tst-auditmanymod.h b/elf/tst-auditmanymod.h
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..d1d89e08431ce32f
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod.h
b1dca6
@@ -0,0 +1,64 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor template.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+/* The macro MOD must be defined to the number of this auditor (an
b1dca6
+   integer) before including this file.  */
b1dca6
+
b1dca6
+#include <link.h>
b1dca6
+#include <stdio.h>
b1dca6
+#include <unistd.h>
b1dca6
+
b1dca6
+/* Error counter for delayed error reporting.  */
b1dca6
+static int errors;
b1dca6
+
b1dca6
+unsigned int
b1dca6
+la_version (unsigned int version)
b1dca6
+{
b1dca6
+  return version;
b1dca6
+}
b1dca6
+
b1dca6
+unsigned int
b1dca6
+la_objopen (struct link_map *map, Lmid_t lmid,
b1dca6
+            uintptr_t *cookie)
b1dca6
+{
b1dca6
+  struct link_map *cookie_map = (struct link_map *) *cookie;
b1dca6
+  printf ("info: %d, la_objopen: map=%p name=%s cookie=%p:%p diff=%td\n",
b1dca6
+          MOD, map, map->l_name, cookie, cookie_map,
b1dca6
+          (char *) cookie - (char *) map);
b1dca6
+  fflush (stdout);
b1dca6
+  if (map != cookie_map)
b1dca6
+    {
b1dca6
+      printf ("error: %d, la_objopen:"
b1dca6
+              " map address does not match cookie value\n",
b1dca6
+              MOD);
b1dca6
+      fflush (stdout);
b1dca6
+      ++errors;
b1dca6
+    }
b1dca6
+  return 0;
b1dca6
+}
b1dca6
+
b1dca6
+extern unsigned int
b1dca6
+la_objclose (uintptr_t *__cookie)
b1dca6
+{
b1dca6
+  if (errors != 0)
b1dca6
+    {
b1dca6
+      printf ("error: exiting due to previous errors");
b1dca6
+      _exit (1);
b1dca6
+    }
b1dca6
+  return 0;
b1dca6
+}
b1dca6
diff --git a/elf/tst-auditmanymod1.c b/elf/tst-auditmanymod1.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..c7de49d446a7e52d
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod1.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 1.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 1
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod2.c b/elf/tst-auditmanymod2.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..4254f022a177b844
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod2.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 2.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 2
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod3.c b/elf/tst-auditmanymod3.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..ee90f4eb3a5c1b35
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod3.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 3.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 3
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod4.c b/elf/tst-auditmanymod4.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..6379fa1d55014998
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod4.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 4.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 4
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod5.c b/elf/tst-auditmanymod5.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..17c0f617aa4d1893
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod5.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 5.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 5
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod6.c b/elf/tst-auditmanymod6.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..86bc6801a4454742
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod6.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 6.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 6
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod7.c b/elf/tst-auditmanymod7.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..92b0bf6006876dff
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod7.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 7.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 7
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod8.c b/elf/tst-auditmanymod8.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..d42f884d2f24f4c0
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod8.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 8.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 8
b1dca6
+#include "tst-auditmanymod.h"
b1dca6
diff --git a/elf/tst-auditmanymod9.c b/elf/tst-auditmanymod9.c
b1dca6
new file mode 100644
b1dca6
index 0000000000000000..6bee81d69c6d3c22
b1dca6
--- /dev/null
b1dca6
+++ b/elf/tst-auditmanymod9.c
b1dca6
@@ -0,0 +1,20 @@
b1dca6
+/* Check cookie initialization for many auditors.  Auditor 9.
b1dca6
+   Copyright (C) 2019 Free Software Foundation, Inc.
b1dca6
+   This file is part of the GNU C Library.
b1dca6
+
b1dca6
+   The GNU C Library is free software; you can redistribute it and/or
b1dca6
+   modify it under the terms of the GNU Lesser General Public
b1dca6
+   License as published by the Free Software Foundation; either
b1dca6
+   version 2.1 of the License, or (at your option) any later version.
b1dca6
+
b1dca6
+   The GNU C Library is distributed in the hope that it will be useful,
b1dca6
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
b1dca6
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
b1dca6
+   Lesser General Public License for more details.
b1dca6
+
b1dca6
+   You should have received a copy of the GNU Lesser General Public
b1dca6
+   License along with the GNU C Library; if not, see
b1dca6
+   <https://www.gnu.org/licenses/>.  */
b1dca6
+
b1dca6
+#define MOD 9
b1dca6
+#include "tst-auditmanymod.h"