summaryrefslogtreecommitdiff
path: root/monitor_mm.c
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2003-09-01 02:05:26 +0000
committerColin Watson <cjwatson@debian.org>2003-09-01 02:05:26 +0000
commit6d5a72bc1d98a42ba42f082e50a22e911c1d82d3 (patch)
tree1bf23174bdb6fc71e2846dda0eca195a418484e7 /monitor_mm.c
parent2ee26b431f98cf1dc0e4fb9809ad1e0c879b8c08 (diff)
parent58657d96514cd6f16d82add8d6f4adbb36765758 (diff)
Debian release 3.5p1-1.
Diffstat (limited to 'monitor_mm.c')
-rw-r--r--monitor_mm.c64
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"
27RCSID("$OpenBSD: monitor_mm.c,v 1.6 2002/06/04 23:05:49 markus Exp $"); 27RCSID("$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 $");
39static int 39static int
40mm_compare(struct mm_share *a, struct mm_share *b) 40mm_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
45RB_GENERATE(mmtree, mm_share, next, mm_compare) 52RB_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)