From patchwork Sun Nov 3 17:11:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 35581 Received: (qmail 2407 invoked by alias); 3 Nov 2019 17:11:55 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 2386 invoked by uid 89); 3 Nov 2019 17:11:54 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT autolearn=ham version=3.3.1 spammy= X-HELO: mx1.osci.io X-Gerrit-PatchSet: 2 Date: Sun, 3 Nov 2019 12:11:45 -0500 From: "Florian Weimer (Code Review)" To: Florian Weimer , libc-alpha@sourceware.org Auto-Submitted: auto-generated X-Gerrit-MessageType: newpatchset Subject: [review v2] Properly initialize audit cookie for the dynamic loader [BZ #25157] X-Gerrit-Change-Id: I180eb3573dc1c57433750f5d8cb18271460ba5f2 X-Gerrit-Change-Number: 486 X-Gerrit-ChangeURL: X-Gerrit-Commit: 05efd60143cf982e502054b6239907d91820c7b7 In-Reply-To: References: Reply-To: fweimer@redhat.com, fweimer@redhat.com, libc-alpha@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-75-g9005159e5d Message-Id: <20191103171146.090DE25B28@gnutoolchain-gerrit.osci.io> Change URL: https://gnutoolchain-gerrit.osci.io/r/c/glibc/+/486 ...................................................................... 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 --- M elf/Makefile M elf/rtld.c A elf/tst-auditmany.c A elf/tst-auditmanymod.h A elf/tst-auditmanymod1.c A elf/tst-auditmanymod2.c A elf/tst-auditmanymod3.c A elf/tst-auditmanymod4.c A elf/tst-auditmanymod5.c A elf/tst-auditmanymod6.c A elf/tst-auditmanymod7.c A elf/tst-auditmanymod8.c A elf/tst-auditmanymod9.c 13 files changed, 290 insertions(+), 9 deletions(-) diff --git a/elf/Makefile b/elf/Makefile index 5e4cdb4..0668818 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -193,7 +193,7 @@ tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \ tst-unwind-ctor tst-unwind-main tst-audit13 \ tst-sonamemove-link tst-sonamemove-dlopen tst-dlopen-tlsmodid \ - tst-dlopen-self + tst-dlopen-self tst-auditmany # reldep9 tests-internal += loadtest unload unload2 circleload1 \ neededtest neededtest2 neededtest3 neededtest4 \ @@ -281,7 +281,10 @@ tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \ tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib \ tst-audit13mod1 tst-sonamemove-linkmod1 \ - tst-sonamemove-runmod1 tst-sonamemove-runmod2 + tst-sonamemove-runmod1 tst-sonamemove-runmod2 \ + tst-auditmanymod1 tst-auditmanymod2 tst-auditmanymod3 \ + tst-auditmanymod4 tst-auditmanymod5 tst-auditmanymod6 \ + tst-auditmanymod7 tst-auditmanymod8 tst-auditmanymod9 # Most modules build with _ISOMAC defined, but those filtered out # depend on internal headers. modules-names-tests = $(filter-out ifuncmod% tst-libc_dlvsym-dso tst-tlsmod%,\ @@ -1426,6 +1429,14 @@ 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 8a6e1a1..d54a796 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1008,13 +1008,7 @@ /* 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 @@ *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 0000000..9d68105 --- /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 + . */ + +/* 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 0000000..d1d89e0 --- /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 + . */ + +/* The macro MOD must be defined to the number of this auditor (an + integer) before including this file. */ + +#include +#include +#include + +/* 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 0000000..c7de49d --- /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 + . */ + +#define MOD 1 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod2.c b/elf/tst-auditmanymod2.c new file mode 100644 index 0000000..4254f02 --- /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 + . */ + +#define MOD 2 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod3.c b/elf/tst-auditmanymod3.c new file mode 100644 index 0000000..ee90f4e --- /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 + . */ + +#define MOD 3 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod4.c b/elf/tst-auditmanymod4.c new file mode 100644 index 0000000..6379fa1 --- /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 + . */ + +#define MOD 4 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod5.c b/elf/tst-auditmanymod5.c new file mode 100644 index 0000000..17c0f61 --- /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 + . */ + +#define MOD 5 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod6.c b/elf/tst-auditmanymod6.c new file mode 100644 index 0000000..86bc680 --- /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 + . */ + +#define MOD 6 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod7.c b/elf/tst-auditmanymod7.c new file mode 100644 index 0000000..92b0bf6 --- /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 + . */ + +#define MOD 7 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod8.c b/elf/tst-auditmanymod8.c new file mode 100644 index 0000000..d42f884 --- /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 + . */ + +#define MOD 8 +#include "tst-auditmanymod.h" diff --git a/elf/tst-auditmanymod9.c b/elf/tst-auditmanymod9.c new file mode 100644 index 0000000..6bee81d --- /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 + . */ + +#define MOD 9 +#include "tst-auditmanymod.h"