Add a hook to enable load-time inspection of program headers

This hook can be used to perform additional compatibility checks
between shared libraries by inspecting custom program header
information.

	* elf/dl-machine-reject-phdr.h: New file.
	* elf/dl-load.c: #include that.
	(open_verify): Call elf_machine_reject_phdr_p and ignore the file
	if that returned true.
This commit is contained in:
Matthew Fortune 2014-10-01 17:08:51 +01:00
parent 67c379871e
commit d6f373d21b
3 changed files with 47 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2014-10-31 Matthew Fortune <matthew.fortune@imgtec.com>
* elf/dl-machine-reject-phdr.h: New file.
* elf/dl-load.c: #include that.
(open_verify): Call elf_machine_reject_phdr_p and ignore the file
if that returned true.
2014-10-31 Roland McGrath <roland@hack.frob.com>
[BZ #17496]

View File

@ -41,6 +41,7 @@
#include <dl-load.h>
#include <dl-map-segments.h>
#include <dl-unmap-segments.h>
#include <dl-machine-reject-phdr.h>
#include <endian.h>
@ -1683,6 +1684,11 @@ open_verify (const char *name, struct filebuf *fbp, struct link_map *loader,
}
}
if (__glibc_unlikely (elf_machine_reject_phdr_p
(phdr, ehdr->e_phnum, fbp->buf, fbp->len,
loader, fd)))
goto close_and_out;
/* Check .note.ABI-tag if present. */
for (ph = phdr; ph < &phdr[ehdr->e_phnum]; ++ph)
if (ph->p_type == PT_NOTE && ph->p_filesz >= 32 && ph->p_align >= 4)

View File

@ -0,0 +1,34 @@
/* Machine-dependent program header inspection for the ELF loader.
Copyright (C) 2014 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
<http://www.gnu.org/licenses/>. */
#ifndef _DL_MACHINE_REJECT_PHDR_H
#define _DL_MACHINE_REJECT_PHDR_H 1
#include <stdbool.h>
/* Return true iff ELF program headers are incompatible with the running
host. */
static inline bool
elf_machine_reject_phdr_p (const ElfW(Phdr) *phdr, uint_fast16_t phnum,
const char *buf, size_t len, struct link_map *map,
int fd)
{
return false;
}
#endif /* dl-machine-reject-phdr.h */