00001
00002 #ifndef CXXUTILS_PAGEACCESSCONTROL_H
00003 #define CXXUTILS_PAGEACCESSCONTROL_H 1
00004
00017 #include <vector>
00018 #include <sys/mman.h>
00019
00020 #include "CxxUtils/procmaps.h"
00021
00022 class PageAccessControl {
00023 public:
00024 PageAccessControl(size_t reservedSize=65535) :
00025 m_pmaps(),
00026 m_protectedIsSorted(false)
00027 {
00028
00029 m_protected.reserve(reservedSize);
00030 }
00031 PageAccessControl(procmaps& pmaps, size_t reservedSize=65535) :
00032 m_pmaps(pmaps),
00033 m_protectedIsSorted(false)
00034 {
00035
00036 m_protected.reserve(reservedSize);
00037 }
00038
00043 template <typename T>
00044 bool protectPage(T* addr, int prot) {
00045 return protectPage(addr, sizeof(T), prot);
00046 }
00047
00049 template <typename T>
00050 bool forbidPage(const T* addr) {
00051 return forbidPage(addr, sizeof(T));
00052 }
00053
00055 bool forbidPage(const void* addr, size_t objSize) {
00056 return protectPage(addr, objSize, PROT_NONE);
00057 }
00058
00060 bool forbidPage(const void* addr) {
00061 return protectPage(addr, 4, PROT_NONE);
00062 }
00063
00065 bool protectPage(const void* addr, size_t objSize, int prot);
00066
00067 bool restorePageProt(const void * addr);
00068 void sort();
00069
00071 struct Entry {
00072 Entry(void* a, size_t l, int p, void* pl);
00074 void* addr;
00076 size_t lenProt;
00077 int prot;
00079 void* leak;
00082 int restored;
00083 };
00084
00086 typedef std::vector<Entry> protected_t;
00087 typedef protected_t::const_iterator const_iterator;
00088 const protected_t& protectedPtrs() const { return m_protected; }
00089 const_iterator beginProtectedPtrs() const { return m_protected.begin(); }
00090 const_iterator endProtectedPtrs() const { return m_protected.end(); }
00091 void reset() { m_protected.clear(); }
00092
00094 bool accessed(const void* address) const;
00095
00096 private:
00097
00099 procmaps m_pmaps;
00100
00101
00102
00103
00104 protected_t m_protected;
00105 bool m_protectedIsSorted;
00106 };
00107 inline
00108 bool operator <(const PageAccessControl::Entry& lhs, const PageAccessControl::Entry& rhs) {
00109 return lhs.addr < rhs.addr;
00110 }
00111 #endif