| Index: sandbox/linux/seccomp/library.h
|
| ===================================================================
|
| --- sandbox/linux/seccomp/library.h (revision 57969)
|
| +++ sandbox/linux/seccomp/library.h (working copy)
|
| @@ -1,199 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef LIBRARY_H__
|
| -#define LIBRARY_H__
|
| -
|
| -#include <elf.h>
|
| -#include <functional>
|
| -#include <map>
|
| -#include <set>
|
| -#include <string>
|
| -#include <string.h>
|
| -#include <sys/mman.h>
|
| -
|
| -#include "maps.h"
|
| -
|
| -#if defined(__x86_64__)
|
| -typedef Elf64_Ehdr Elf_Ehdr;
|
| -typedef Elf64_Shdr Elf_Shdr;
|
| -typedef Elf64_Sym Elf_Sym;
|
| -typedef Elf64_Addr Elf_Addr;
|
| -#elif defined(__i386__)
|
| -typedef Elf32_Ehdr Elf_Ehdr;
|
| -typedef Elf32_Shdr Elf_Shdr;
|
| -typedef Elf32_Sym Elf_Sym;
|
| -typedef Elf32_Addr Elf_Addr;
|
| -#else
|
| -#error Unsupported target platform
|
| -#endif
|
| -
|
| -struct SyscallTable;
|
| -namespace playground {
|
| -
|
| -class Library {
|
| - friend class Maps;
|
| - public:
|
| - typedef Maps::string string;
|
| -
|
| - Library() :
|
| - valid_(false),
|
| - isVDSO_(false),
|
| - asr_offset_(0),
|
| - vsys_offset_(0),
|
| - maps_(0),
|
| - image_(0),
|
| - image_size_(0) {
|
| - }
|
| -
|
| - ~Library();
|
| -
|
| - void setLibraryInfo(Maps* maps) {
|
| - if (!maps_) {
|
| - maps_ = maps;
|
| - }
|
| - }
|
| -
|
| - void addMemoryRange(void* start, void* stop, Elf_Addr offset,
|
| - int prot, int isVDSO) {
|
| - isVDSO_ = isVDSO;
|
| - RangeMap::const_iterator iter = memory_ranges_.find(offset);
|
| - if (iter != memory_ranges_.end()) {
|
| - // It is possible to have overlapping mappings. This is particularly
|
| - // likely to happen with very small programs or libraries. If it does
|
| - // happen, we really only care about the text segment. Look for a
|
| - // mapping that is mapped executable.
|
| - if ((prot & PROT_EXEC) == 0) {
|
| - return;
|
| - }
|
| - }
|
| - memory_ranges_.insert(std::make_pair(offset, Range(start, stop, prot)));
|
| - }
|
| -
|
| - char *get(Elf_Addr offset, char *buf, size_t len);
|
| - string get(Elf_Addr offset);
|
| - char *getOriginal(Elf_Addr offset, char *buf, size_t len);
|
| - string getOriginal(Elf_Addr offset);
|
| -
|
| - template<class T>T* get(Elf_Addr offset, T* t) {
|
| - if (!valid_) {
|
| - memset(t, 0, sizeof(T));
|
| - return NULL;
|
| - }
|
| - return reinterpret_cast<T *>(get(offset, reinterpret_cast<char *>(t),
|
| - sizeof(T)));
|
| - }
|
| -
|
| - template<class T>T* getOriginal(Elf_Addr offset, T* t) {
|
| - if (!valid_) {
|
| - memset(t, 0, sizeof(T));
|
| - return NULL;
|
| - }
|
| - return reinterpret_cast<T *>(getOriginal(offset,
|
| - reinterpret_cast<char *>(t),
|
| - sizeof(T)));
|
| - }
|
| -
|
| - template<class T>bool set(void *addr, T* value) {
|
| - if (!valid_) {
|
| - return false;
|
| - }
|
| - *reinterpret_cast<T *>(addr) = *value;
|
| - return true;
|
| - }
|
| -
|
| - template<class T>bool set(Elf_Addr offset, T* value) {
|
| - if (!valid_) {
|
| - return false;
|
| - }
|
| - RangeMap::const_iterator iter = memory_ranges_.lower_bound(offset);
|
| - if (iter == memory_ranges_.end()) {
|
| - return false;
|
| - }
|
| - offset -= iter->first;
|
| - if (offset >
|
| - reinterpret_cast<char *>(iter->second.stop) -
|
| - reinterpret_cast<char *>(iter->second.start) -
|
| - sizeof(T)) {
|
| - return false;
|
| - }
|
| - *reinterpret_cast<T *>(
|
| - reinterpret_cast<char *>(iter->second.start) + offset) = *value;
|
| - return true;
|
| - }
|
| -
|
| - bool parseElf();
|
| - const Elf_Ehdr* getEhdr();
|
| - const Elf_Shdr* getSection(const string& section);
|
| - int getSectionIndex(const string& section);
|
| - void makeWritable(bool state) const;
|
| - void patchSystemCalls();
|
| - bool isVDSO() const { return isVDSO_; }
|
| -
|
| - protected:
|
| - bool parseSymbols();
|
| -
|
| - private:
|
| - class GreaterThan : public std::binary_function<Elf_Addr, Elf_Addr, bool> {
|
| - // We create the RangeMap with a GreaterThan rather than the default
|
| - // comparator, as that allows us to use lower_bound() to find memory
|
| - // mappings.
|
| - public:
|
| - bool operator() (Elf_Addr s1, Elf_Addr s2) const {
|
| - return s1 > s2;
|
| - }
|
| - };
|
| -
|
| - struct Range {
|
| - Range(void* start, void* stop, int prot) :
|
| - start(start), stop(stop), prot(prot) { }
|
| - void* start;
|
| - void* stop;
|
| - int prot;
|
| - };
|
| -
|
| - typedef std::map<Elf_Addr, Range, GreaterThan,
|
| - SystemAllocator<std::pair<const Elf_Addr,
|
| - Range> > > RangeMap;
|
| - typedef std::map<string, std::pair<int, Elf_Shdr>, std::less<string>,
|
| - SystemAllocator<std::pair<const string,
|
| - std::pair<int, Elf_Shdr> > > >
|
| - SectionTable;
|
| - typedef std::map<string, Elf_Sym, std::less<string>,
|
| - SystemAllocator<std::pair<const string,
|
| - Elf_Sym> > > SymbolTable;
|
| - typedef std::map<string, Elf_Addr, std::less<string>,
|
| - SystemAllocator<std::pair<const string,
|
| - Elf_Addr> > > PltTable;
|
| -
|
| - char* getBytes(char* dst, const char* src, ssize_t len);
|
| - static bool isSafeInsn(unsigned short insn);
|
| - static int isSimpleSystemCall(char *start, char *end);
|
| - static char* getScratchSpace(const Maps* maps, char* near, int needed,
|
| - char** extraSpace, int* extraLength);
|
| - void patchSystemCallsInFunction(const Maps* maps, char *start, char *end,
|
| - char** extraSpace, int* extraLength);
|
| - int patchVSystemCalls();
|
| - void patchVDSO(char** extraSpace, int* extraLength);
|
| -
|
| - RangeMap memory_ranges_;
|
| - bool valid_;
|
| - bool isVDSO_;
|
| - char* asr_offset_;
|
| - int vsys_offset_;
|
| - Maps* maps_;
|
| - Elf_Ehdr ehdr_;
|
| - SectionTable section_table_;
|
| - SymbolTable symbols_;
|
| - PltTable plt_entries_;
|
| - char* image_;
|
| - size_t image_size_;
|
| - static char* __kernel_vsyscall;
|
| - static char* __kernel_sigreturn;
|
| - static char* __kernel_rt_sigreturn;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -#endif // LIBRARY_H__
|
|
|