From a69597834ae6c4677aeb2b30d6a523f40941dbfa Mon Sep 17 00:00:00 2001
|
From: Florian Weimer <fweimer@redhat.com>
|
Date: Sat, 2 Nov 2019 21:55:35 +0100
|
Subject: [PATCH 12/19] Properly initialize audit cookie for the dynamic loader
|
[BZ #25157]
|
|
The l_audit array is indexed by audit module, not audit function.
|
|
Change-Id: I180eb3573dc1c57433750f5d8cb18271460ba5f2
|
(cherry picked from commit c7bf5ceab6ec776ac7350d3b0190776bf532ac54)
|
Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
|
---
|
elf/rtld.c | 14 ++++-----
|
elf/tst-auditmany.c | 26 +++++++++++++++++
|
elf/tst-auditmanymod.h | 64 +++++++++++++++++++++++++++++++++++++++++
|
elf/tst-auditmanymod1.c | 20 +++++++++++++
|
elf/tst-auditmanymod2.c | 20 +++++++++++++
|
elf/tst-auditmanymod3.c | 20 +++++++++++++
|
elf/tst-auditmanymod4.c | 20 +++++++++++++
|
elf/tst-auditmanymod5.c | 20 +++++++++++++
|
elf/tst-auditmanymod6.c | 20 +++++++++++++
|
elf/tst-auditmanymod7.c | 20 +++++++++++++
|
elf/tst-auditmanymod8.c | 20 +++++++++++++
|
elf/tst-auditmanymod9.c | 20 +++++++++++++
|
12 files changed, 277 insertions(+), 7 deletions(-)
|
create mode 100644 elf/tst-auditmany.c
|
create mode 100644 elf/tst-auditmanymod.h
|
create mode 100644 elf/tst-auditmanymod1.c
|
create mode 100644 elf/tst-auditmanymod2.c
|
create mode 100644 elf/tst-auditmanymod3.c
|
create mode 100644 elf/tst-auditmanymod4.c
|
create mode 100644 elf/tst-auditmanymod5.c
|
create mode 100644 elf/tst-auditmanymod6.c
|
create mode 100644 elf/tst-auditmanymod7.c
|
create mode 100644 elf/tst-auditmanymod8.c
|
create mode 100644 elf/tst-auditmanymod9.c
|
|
diff --git a/elf/rtld.c b/elf/rtld.c
|
index 1524328f..46fc53b1 100644
|
--- a/elf/rtld.c
|
+++ b/elf/rtld.c
|
@@ -990,13 +990,7 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
|
|
/* Store the pointer. */
|
if (err_str == NULL && largs.result != NULL)
|
- {
|
- newp->fptr[cnt] = largs.result;
|
-
|
- /* The dynamic linker link map is statically allocated,
|
- initialize the data now. */
|
- GL(dl_rtld_map).l_audit[cnt].cookie = (intptr_t) &GL(dl_rtld_map);
|
- }
|
+ newp->fptr[cnt] = largs.result;
|
else
|
newp->fptr[cnt] = NULL;
|
++cnt;
|
@@ -1012,6 +1006,12 @@ ERROR: audit interface '%s' requires version %d (maximum supported version %d);
|
*last_audit = GLRO(dl_audit) = &newp->ifaces;
|
else
|
*last_audit = (*last_audit)->next = &newp->ifaces;
|
+
|
+ /* The dynamic linker link map is statically allocated, initialize
|
+ the data now. */
|
+ GL (dl_rtld_map).l_audit[GLRO (dl_naudit)].cookie
|
+ = (intptr_t) &GL (dl_rtld_map);
|
+
|
++GLRO(dl_naudit);
|
|
/* Mark the DSO as being used for auditing. */
|
diff --git a/elf/tst-auditmany.c b/elf/tst-auditmany.c
|
new file mode 100644
|
index 00000000..9d68105b
|
--- /dev/null
|
+++ b/elf/tst-auditmany.c
|
@@ -0,0 +1,26 @@
|
+/* Check cookie initialization for many auditors. Main program.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+/* It does not make sense to use the test harness for this test
|
+ because the testing happens in auditors. */
|
+
|
+int
|
+main (void)
|
+{
|
+ return 0;
|
+}
|
diff --git a/elf/tst-auditmanymod.h b/elf/tst-auditmanymod.h
|
new file mode 100644
|
index 00000000..d1d89e08
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod.h
|
@@ -0,0 +1,64 @@
|
+/* Check cookie initialization for many auditors. Auditor template.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+/* The macro MOD must be defined to the number of this auditor (an
|
+ integer) before including this file. */
|
+
|
+#include <link.h>
|
+#include <stdio.h>
|
+#include <unistd.h>
|
+
|
+/* Error counter for delayed error reporting. */
|
+static int errors;
|
+
|
+unsigned int
|
+la_version (unsigned int version)
|
+{
|
+ return version;
|
+}
|
+
|
+unsigned int
|
+la_objopen (struct link_map *map, Lmid_t lmid,
|
+ uintptr_t *cookie)
|
+{
|
+ struct link_map *cookie_map = (struct link_map *) *cookie;
|
+ printf ("info: %d, la_objopen: map=%p name=%s cookie=%p:%p diff=%td\n",
|
+ MOD, map, map->l_name, cookie, cookie_map,
|
+ (char *) cookie - (char *) map);
|
+ fflush (stdout);
|
+ if (map != cookie_map)
|
+ {
|
+ printf ("error: %d, la_objopen:"
|
+ " map address does not match cookie value\n",
|
+ MOD);
|
+ fflush (stdout);
|
+ ++errors;
|
+ }
|
+ return 0;
|
+}
|
+
|
+extern unsigned int
|
+la_objclose (uintptr_t *__cookie)
|
+{
|
+ if (errors != 0)
|
+ {
|
+ printf ("error: exiting due to previous errors");
|
+ _exit (1);
|
+ }
|
+ return 0;
|
+}
|
diff --git a/elf/tst-auditmanymod1.c b/elf/tst-auditmanymod1.c
|
new file mode 100644
|
index 00000000..c7de49d4
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod1.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 1.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 1
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod2.c b/elf/tst-auditmanymod2.c
|
new file mode 100644
|
index 00000000..4254f022
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod2.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 2.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 2
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod3.c b/elf/tst-auditmanymod3.c
|
new file mode 100644
|
index 00000000..ee90f4eb
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod3.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 3.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 3
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod4.c b/elf/tst-auditmanymod4.c
|
new file mode 100644
|
index 00000000..6379fa1d
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod4.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 4.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 4
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod5.c b/elf/tst-auditmanymod5.c
|
new file mode 100644
|
index 00000000..17c0f617
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod5.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 5.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 5
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod6.c b/elf/tst-auditmanymod6.c
|
new file mode 100644
|
index 00000000..86bc6801
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod6.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 6.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 6
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod7.c b/elf/tst-auditmanymod7.c
|
new file mode 100644
|
index 00000000..92b0bf60
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod7.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 7.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 7
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod8.c b/elf/tst-auditmanymod8.c
|
new file mode 100644
|
index 00000000..d42f884d
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod8.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 8.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 8
|
+#include "tst-auditmanymod.h"
|
diff --git a/elf/tst-auditmanymod9.c b/elf/tst-auditmanymod9.c
|
new file mode 100644
|
index 00000000..6bee81d6
|
--- /dev/null
|
+++ b/elf/tst-auditmanymod9.c
|
@@ -0,0 +1,20 @@
|
+/* Check cookie initialization for many auditors. Auditor 9.
|
+ Copyright (C) 2019 Free Software Foundation, Inc.
|
+ This file is part of the GNU C Library.
|
+
|
+ The GNU C Library is free software; you can redistribute it and/or
|
+ modify it under the terms of the GNU Lesser General Public
|
+ License as published by the Free Software Foundation; either
|
+ version 2.1 of the License, or (at your option) any later version.
|
+
|
+ The GNU C Library is distributed in the hope that it will be useful,
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
+ Lesser General Public License for more details.
|
+
|
+ You should have received a copy of the GNU Lesser General Public
|
+ License along with the GNU C Library; if not, see
|
+ <https://www.gnu.org/licenses/>. */
|
+
|
+#define MOD 9
|
+#include "tst-auditmanymod.h"
|
--
|
2.20.1
|