X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/1853d1ef0d12e0942aca46cf9e6af2c69804d0a7..823221b29186882ad56bfb9bf95c6b2dc86e8bbe:/monitor_mm.c diff --git a/monitor_mm.c b/monitor_mm.c index bce98c93..b0ec37cf 100644 --- a/monitor_mm.c +++ b/monitor_mm.c @@ -24,9 +24,11 @@ */ #include "includes.h" -RCSID("$OpenBSD: monitor_mm.c,v 1.3 2002/03/19 10:41:32 markus Exp $"); +RCSID("$OpenBSD: monitor_mm.c,v 1.9 2004/05/11 19:01:43 deraadt Exp $"); +#ifdef HAVE_SYS_MMAN_H #include +#endif #include "ssh.h" #include "xmalloc.h" @@ -36,7 +38,14 @@ RCSID("$OpenBSD: monitor_mm.c,v 1.3 2002/03/19 10:41:32 markus Exp $"); static int mm_compare(struct mm_share *a, struct mm_share *b) { - return ((char *)a->address - (char *)b->address); + long diff = (char *)a->address - (char *)b->address; + + if (diff == 0) + return (0); + else if (diff < 0) + return (-1); + else + return (1); } RB_GENERATE(mmtree, mm_share, next, mm_compare) @@ -56,8 +65,8 @@ mm_make_entry(struct mm_master *mm, struct mmtree *head, tmp2 = RB_INSERT(mmtree, head, tmp); if (tmp2 != NULL) - fatal("mm_make_entry(%p): double address %p->%p(%d)", - mm, tmp2, address, size); + fatal("mm_make_entry(%p): double address %p->%p(%lu)", + mm, tmp2, address, (u_long)size); return (tmp); } @@ -82,10 +91,9 @@ mm_create(struct mm_master *mmalloc, size_t size) */ mm->mmalloc = mmalloc; - address = mmap(NULL, size, PROT_WRITE|PROT_READ, MAP_ANON|MAP_SHARED, - -1, 0); - if (address == MAP_FAILED) - fatal("mmap(%d)", size); + address = xmmap(size); + if (address == (void *)MAP_FAILED) + fatal("mmap(%lu): %s", (u_long)size, strerror(errno)); mm->address = address; mm->size = size; @@ -123,8 +131,14 @@ mm_destroy(struct mm_master *mm) mm_freelist(mm->mmalloc, &mm->rb_free); mm_freelist(mm->mmalloc, &mm->rb_allocated); +#ifdef HAVE_MMAP if (munmap(mm->address, mm->size) == -1) - fatal("munmap(%p, %d)", mm->address, mm->size); + fatal("munmap(%p, %lu): %s", mm->address, (u_long)mm->size, + strerror(errno)); +#else + fatal("%s: UsePrivilegeSeparation=yes and Compression=yes not supported", + __func__); +#endif if (mm->mmalloc == NULL) xfree(mm); else @@ -138,7 +152,7 @@ mm_xmalloc(struct mm_master *mm, size_t size) address = mm_malloc(mm, size); if (address == NULL) - fatal("%s: mm_malloc(%d)", __FUNCTION__, size); + fatal("%s: mm_malloc(%lu)", __func__, (u_long)size); return (address); } @@ -152,8 +166,10 @@ mm_malloc(struct mm_master *mm, size_t size) if (size == 0) fatal("mm_malloc: try to allocate 0 space"); + if (size > SIZE_T_MAX - MM_MINSIZE + 1) + fatal("mm_malloc: size too big"); - size = ((size + MM_MINSIZE - 1) / MM_MINSIZE) * MM_MINSIZE; + size = ((size + (MM_MINSIZE - 1)) / MM_MINSIZE) * MM_MINSIZE; RB_FOREACH(mms, mmtree, &mm->rb_free) { if (mms->size >= size) @@ -223,8 +239,8 @@ mm_free(struct mm_master *mm, void *address) /* Check if range does not overlap */ if (prev != NULL && MM_ADDRESS_END(prev) > address) - fatal("mm_free: memory corruption: %p(%d) > %p", - prev->address, prev->size, address); + fatal("mm_free: memory corruption: %p(%lu) > %p", + prev->address, (u_long)prev->size, address); /* See if we can merge backwards */ if (prev != NULL && MM_ADDRESS_END(prev) == address) { @@ -246,8 +262,8 @@ mm_free(struct mm_master *mm, void *address) return; if (MM_ADDRESS_END(prev) > mms->address) - fatal("mm_free: memory corruption: %p < %p(%d)", - mms->address, prev->address, prev->size); + fatal("mm_free: memory corruption: %p < %p(%lu)", + mms->address, prev->address, (u_long)prev->size); if (MM_ADDRESS_END(prev) != mms->address) return; @@ -287,7 +303,7 @@ mm_share_sync(struct mm_master **pmm, struct mm_master **pmmalloc) struct mm_master *mmold; struct mmtree rb_free, rb_allocated; - debug3("%s: Share sync", __FUNCTION__); + debug3("%s: Share sync", __func__); mm = *pmm; mmold = mm->mmalloc; @@ -312,7 +328,7 @@ mm_share_sync(struct mm_master **pmm, struct mm_master **pmmalloc) *pmm = mm; *pmmalloc = mmalloc; - debug3("%s: Share sync end", __FUNCTION__); + debug3("%s: Share sync end", __func__); } void