diff options
author | Colin Watson <cjwatson@debian.org> | 2003-09-01 00:51:03 +0000 |
---|---|---|
committer | Colin Watson <cjwatson@debian.org> | 2003-09-01 00:51:03 +0000 |
commit | 79cf0b3654d7b597de323153eb57015cdfbd90a4 (patch) | |
tree | 274e78bc3369e218e59aa1fcc9b7e90697f424f1 /monitor_mm.c | |
parent | d984a3c6658e950881edcfb2aae464add93f68d4 (diff) |
Debian release 3.4p1-1.
Diffstat (limited to 'monitor_mm.c')
-rw-r--r-- | monitor_mm.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/monitor_mm.c b/monitor_mm.c index c363036e6..55d1e8e52 100644 --- a/monitor_mm.c +++ b/monitor_mm.c | |||
@@ -29,6 +29,7 @@ RCSID("$OpenBSD: monitor_mm.c,v 1.6 2002/06/04 23:05:49 markus Exp $"); | |||
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> | ||
32 | 33 | ||
33 | #include "ssh.h" | 34 | #include "ssh.h" |
34 | #include "xmalloc.h" | 35 | #include "xmalloc.h" |
@@ -85,8 +86,41 @@ mm_create(struct mm_master *mmalloc, size_t size) | |||
85 | mm->mmalloc = mmalloc; | 86 | mm->mmalloc = mmalloc; |
86 | 87 | ||
87 | #ifdef HAVE_MMAP_ANON_SHARED | 88 | #ifdef HAVE_MMAP_ANON_SHARED |
89 | mm->shm_not_mmap = 0; | ||
90 | |||
88 | address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED, | 91 | address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED, |
89 | -1, 0); | 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 | |||
90 | if (address == MAP_FAILED) | 124 | if (address == MAP_FAILED) |
91 | fatal("mmap(%lu): %s", (u_long)size, strerror(errno)); | 125 | fatal("mmap(%lu): %s", (u_long)size, strerror(errno)); |
92 | #else | 126 | #else |
@@ -131,6 +165,10 @@ mm_destroy(struct mm_master *mm) | |||
131 | mm_freelist(mm->mmalloc, &mm->rb_allocated); | 165 | mm_freelist(mm->mmalloc, &mm->rb_allocated); |
132 | 166 | ||
133 | #ifdef HAVE_MMAP_ANON_SHARED | 167 | #ifdef HAVE_MMAP_ANON_SHARED |
168 | if (mm->shm_not_mmap) { | ||
169 | if (shmdt(mm->address) == -1) | ||
170 | fatal("shmdt(%p): %s", mm->address, strerror(errno)); | ||
171 | } else | ||
134 | if (munmap(mm->address, mm->size) == -1) | 172 | if (munmap(mm->address, mm->size) == -1) |
135 | fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size, | 173 | fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size, |
136 | strerror(errno)); | 174 | strerror(errno)); |