diff options
Diffstat (limited to 'monitor_mm.c')
-rw-r--r-- | monitor_mm.c | 64 |
1 files changed, 15 insertions, 49 deletions
diff --git a/monitor_mm.c b/monitor_mm.c index 55d1e8e52..b4a6e40c9 100644 --- a/monitor_mm.c +++ b/monitor_mm.c | |||
@@ -24,13 +24,13 @@ | |||
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include "includes.h" | 26 | #include "includes.h" |
27 | RCSID("$OpenBSD: monitor_mm.c,v 1.6 2002/06/04 23:05:49 markus Exp $"); | 27 | RCSID("$OpenBSD: monitor_mm.c,v 1.8 2002/08/02 14:43:15 millert Exp $"); |
28 | 28 | ||
29 | #ifdef HAVE_SYS_MMAN_H | 29 | #ifdef HAVE_SYS_MMAN_H |
30 | #include <sys/mman.h> | 30 | #include <sys/mman.h> |
31 | #endif | 31 | #endif |
32 | #include <sys/shm.h> | ||
33 | 32 | ||
33 | #include "openbsd-compat/xmmap.h" | ||
34 | #include "ssh.h" | 34 | #include "ssh.h" |
35 | #include "xmalloc.h" | 35 | #include "xmalloc.h" |
36 | #include "log.h" | 36 | #include "log.h" |
@@ -39,7 +39,14 @@ RCSID("$OpenBSD: monitor_mm.c,v 1.6 2002/06/04 23:05:49 markus Exp $"); | |||
39 | static int | 39 | static int |
40 | mm_compare(struct mm_share *a, struct mm_share *b) | 40 | mm_compare(struct mm_share *a, struct mm_share *b) |
41 | { | 41 | { |
42 | return ((char *)a->address - (char *)b->address); | 42 | long diff = (char *)a->address - (char *)b->address; |
43 | |||
44 | if (diff == 0) | ||
45 | return (0); | ||
46 | else if (diff < 0) | ||
47 | return (-1); | ||
48 | else | ||
49 | return (1); | ||
43 | } | 50 | } |
44 | 51 | ||
45 | RB_GENERATE(mmtree, mm_share, next, mm_compare) | 52 | RB_GENERATE(mmtree, mm_share, next, mm_compare) |
@@ -85,48 +92,9 @@ mm_create(struct mm_master *mmalloc, size_t size) | |||
85 | */ | 92 | */ |
86 | mm->mmalloc = mmalloc; | 93 | mm->mmalloc = mmalloc; |
87 | 94 | ||
88 | #ifdef HAVE_MMAP_ANON_SHARED | 95 | address = xmmap(size); |
89 | mm->shm_not_mmap = 0; | ||
90 | |||
91 | address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED, | ||
92 | -1, 0); | ||
93 | |||
94 | if (address == MAP_FAILED) { | ||
95 | int shmid; | ||
96 | |||
97 | shmid = shmget(IPC_PRIVATE, size, IPC_CREAT|S_IRUSR|S_IWUSR); | ||
98 | if (shmid != -1) { | ||
99 | address = shmat(shmid, NULL, 0); | ||
100 | shmctl(shmid, IPC_RMID, NULL); | ||
101 | if (address != MAP_FAILED) | ||
102 | mm->shm_not_mmap = 1; | ||
103 | } | ||
104 | } | ||
105 | |||
106 | if (address == MAP_FAILED) { | ||
107 | char tmpname[sizeof(MM_SWAP_TEMPLATE)] = MM_SWAP_TEMPLATE; | ||
108 | int tmpfd; | ||
109 | int save_errno; | ||
110 | |||
111 | tmpfd = mkstemp(tmpname); | ||
112 | if (tmpfd == -1) | ||
113 | fatal("mkstemp(\"%s\"): %s", | ||
114 | MM_SWAP_TEMPLATE, strerror(errno)); | ||
115 | unlink(tmpname); | ||
116 | ftruncate(tmpfd, size); | ||
117 | address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_SHARED, | ||
118 | tmpfd, 0); | ||
119 | save_errno = errno; | ||
120 | close(tmpfd); | ||
121 | errno = save_errno; | ||
122 | } | ||
123 | |||
124 | if (address == MAP_FAILED) | 96 | if (address == MAP_FAILED) |
125 | fatal("mmap(%lu): %s", (u_long)size, strerror(errno)); | 97 | fatal("mmap(%lu): %s", (u_long)size, strerror(errno)); |
126 | #else | ||
127 | fatal("%s: UsePrivilegeSeparation=yes and Compression=yes not supported", | ||
128 | __func__); | ||
129 | #endif | ||
130 | 98 | ||
131 | mm->address = address; | 99 | mm->address = address; |
132 | mm->size = size; | 100 | mm->size = size; |
@@ -164,11 +132,7 @@ mm_destroy(struct mm_master *mm) | |||
164 | mm_freelist(mm->mmalloc, &mm->rb_free); | 132 | mm_freelist(mm->mmalloc, &mm->rb_free); |
165 | mm_freelist(mm->mmalloc, &mm->rb_allocated); | 133 | mm_freelist(mm->mmalloc, &mm->rb_allocated); |
166 | 134 | ||
167 | #ifdef HAVE_MMAP_ANON_SHARED | 135 | #ifdef HAVE_MMAP |
168 | if (mm->shm_not_mmap) { | ||
169 | if (shmdt(mm->address) == -1) | ||
170 | fatal("shmdt(%p): %s", mm->address, strerror(errno)); | ||
171 | } else | ||
172 | if (munmap(mm->address, mm->size) == -1) | 136 | if (munmap(mm->address, mm->size) == -1) |
173 | fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size, | 137 | fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size, |
174 | strerror(errno)); | 138 | strerror(errno)); |
@@ -203,8 +167,10 @@ mm_malloc(struct mm_master *mm, size_t size) | |||
203 | 167 | ||
204 | if (size == 0) | 168 | if (size == 0) |
205 | fatal("mm_malloc: try to allocate 0 space"); | 169 | fatal("mm_malloc: try to allocate 0 space"); |
170 | if (size > SIZE_T_MAX - MM_MINSIZE + 1) | ||
171 | fatal("mm_malloc: size too big"); | ||
206 | 172 | ||
207 | size = ((size + MM_MINSIZE - 1) / MM_MINSIZE) * MM_MINSIZE; | 173 | size = ((size + (MM_MINSIZE - 1)) / MM_MINSIZE) * MM_MINSIZE; |
208 | 174 | ||
209 | RB_FOREACH(mms, mmtree, &mm->rb_free) { | 175 | RB_FOREACH(mms, mmtree, &mm->rb_free) { |
210 | if (mms->size >= size) | 176 | if (mms->size >= size) |