-
-
Notifications
You must be signed in to change notification settings - Fork 45
/
protect.c
142 lines (127 loc) · 3.18 KB
/
protect.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* Memory protection functions
*
* Copyright 2020 by Gray Watson
*
* This file is part of the dmalloc package.
*
* Permission to use, copy, modify, and distribute this software for
* any purpose and without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies, and that the name of Gray Watson not be used in advertising
* or publicity pertaining to distribution of the document or software
* without specific, written prior permission.
*
* Gray Watson makes no representations about the suitability of the
* software described herein for any purpose. It is provided "as is"
* without express or implied warranty.
*
* The author may be contacted via https://dmalloc.com/
*/
/*
* This file contains memory protection calls which allow dmalloc to
* protect its administrative information until it needs to use it.
*/
#include <ctype.h>
#if HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#if HAVE_SYS_MMAN_H
# include <sys/mman.h>
#endif
#define DMALLOC_DISABLE
#include "conf.h"
#include "dmalloc.h"
#include "dmalloc_loc.h"
#include "error.h"
#include "heap.h"
#include "protect.h"
/*
* void _dmalloc_protect_set_read_only
*
* Set the protections on a block to be read-only.
*
* ARGUMENTS:
*
* mem -> Pointer to block that we are protecting.
*
* block_n -> Number of blocks that we are protecting.
*/
void _dmalloc_protect_set_read_only(void *mem, const int block_n)
{
#if PROTECT_ALLOWED && PROTECT_BLOCKS
int size = block_n * BLOCK_SIZE;
void *block_pnt;
if (ON_BLOCK(mem)) {
block_pnt = mem;
}
else {
block_pnt = BLOCK_ROUND(mem);
}
if (mprotect(block_pnt, size, PROT_READ) != 0) {
dmalloc_message("mprotect on '%#p' size %d failed", block_pnt, size);
}
#endif
}
/*
* void _dmalloc_protect_set_read_write
*
* Set the protections on a block to be read-write.
*
* ARGUMENTS:
*
* mem -> Pointer to block that we are protecting.
*
* block_n -> Number of blocks that we are protecting.
*/
void _dmalloc_protect_set_read_write(void *mem, const int block_n)
{
#if PROTECT_ALLOWED && PROTECT_BLOCKS
int prot, size = block_n * BLOCK_SIZE;
void *block_pnt;
if (ON_BLOCK(mem)) {
block_pnt = mem;
}
else {
block_pnt = BLOCK_ROUND(mem);
}
/*
* We set executable if possible in case the user has allocated
* stack space or some such
*/
prot = PROT_READ | PROT_WRITE;
#ifdef PROT_EXEC
prot |= PROT_EXEC;
#endif
if (mprotect(block_pnt, size, prot) != 0) {
dmalloc_message("mprotect on '%#p' size %d failed", block_pnt, size);
}
#endif
}
/*
* void _dmalloc_protect_set_no_access
*
* Set the protections on a block to be no-access.
*
* ARGUMENTS:
*
* mem -> Pointer to block that we are protecting.
*
* block_n -> Number of blocks that we are protecting.
*/
void _dmalloc_protect_set_no_access(void *mem, const int block_n)
{
#if PROTECT_ALLOWED && PROTECT_BLOCKS
int size = block_n * BLOCK_SIZE;
void *block_pnt;
if (ON_BLOCK(mem)) {
block_pnt = mem;
}
else {
block_pnt = BLOCK_ROUND(mem);
}
if (mprotect(block_pnt, size, PROT_NONE) != 0) {
dmalloc_message("mprotect on '%#p' size %d failed", block_pnt, size);
}
#endif
}