| commit c7bf5ceab6ec776ac7350d3b0190776bf532ac54 |
| Author: Florian Weimer <fweimer@redhat.com> |
| Date: Sat Nov 2 21:55:35 2019 +0100 |
| |
| 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 |
| |
| Conflicts: |
| elf/Makefile |
| (Test backport differences.) |
| |
| diff --git a/elf/Makefile b/elf/Makefile |
| index 4e1356b9172aee02..4ab73dc48d9ac126 100644 |
| |
| |
| @@ -192,7 +192,8 @@ tests += restest1 preloadtest loadfail multiload origtest resolvfail \ |
| tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \ |
| tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \ |
| tst-audit13 \ |
| - tst-sonamemove-link tst-sonamemove-dlopen tst-initfinilazyfail \ |
| + tst-sonamemove-link tst-sonamemove-dlopen \ |
| + tst-auditmany tst-initfinilazyfail \ |
| tst-dlopenfail tst-dlopenfail-2 \ |
| tst-filterobj tst-filterobj-dlopen tst-auxobj tst-auxobj-dlopen |
| # reldep9 |
| @@ -303,6 +304,9 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \ |
| tst-absolute-zero-lib tst-big-note-lib \ |
| tst-audit13mod1 tst-sonamemove-linkmod1 \ |
| tst-sonamemove-runmod1 tst-sonamemove-runmod2 \ |
| + tst-auditmanymod1 tst-auditmanymod2 tst-auditmanymod3 \ |
| + tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \ |
| + tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 \ |
| tst-initlazyfailmod tst-finilazyfailmod \ |
| tst-dlopenfailmod1 tst-dlopenfaillinkmod tst-dlopenfailmod2 \ |
| tst-dlopenfailmod3 \ |
| @@ -1433,6 +1437,14 @@ $(objpfx)tst-audit13.out: $(objpfx)tst-audit13mod1.so |
| LDFLAGS-tst-audit13mod1.so = -Wl,-z,lazy |
| tst-audit13-ENV = LD_AUDIT=$(objpfx)tst-audit13mod1.so |
| |
| +$(objpfx)tst-auditmany.out: $(objpfx)tst-auditmanymod1.so \ |
| + $(objpfx)tst-auditmanymod2.so $(objpfx)tst-auditmanymod3.so \ |
| + $(objpfx)tst-auditmanymod4.so $(objpfx)tst-auditmanymod5.so \ |
| + $(objpfx)tst-auditmanymod6.so $(objpfx)tst-auditmanymod7.so \ |
| + $(objpfx)tst-auditmanymod8.so $(objpfx)tst-auditmanymod9.so |
| +tst-auditmany-ENV = \ |
| + 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 |
| + |
| # tst-sonamemove links against an older implementation of the library. |
| LDFLAGS-tst-sonamemove-linkmod1.so = \ |
| -Wl,--version-script=tst-sonamemove-linkmod1.map \ |
| diff --git a/elf/rtld.c b/elf/rtld.c |
| index ffbd8f4553bb3425..f557f39a70669c09 100644 |
| |
| |
| @@ -1008,13 +1008,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; |
| @@ -1030,6 +1024,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 0000000000000000..9d68105b9e707b46 |
| |
| |
| @@ -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 0000000000000000..d1d89e08431ce32f |
| |
| |
| @@ -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 0000000000000000..c7de49d446a7e52d |
| |
| |
| @@ -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 0000000000000000..4254f022a177b844 |
| |
| |
| @@ -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 0000000000000000..ee90f4eb3a5c1b35 |
| |
| |
| @@ -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 0000000000000000..6379fa1d55014998 |
| |
| |
| @@ -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 0000000000000000..17c0f617aa4d1893 |
| |
| |
| @@ -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 0000000000000000..86bc6801a4454742 |
| |
| |
| @@ -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 0000000000000000..92b0bf6006876dff |
| |
| |
| @@ -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 0000000000000000..d42f884d2f24f4c0 |
| |
| |
| @@ -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 0000000000000000..6bee81d69c6d3c22 |
| |
| |
| @@ -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" |