]> andersk Git - openssh.git/blobdiff - monitor_mm.c
- djm@cvs.openbsd.org 2010/01/30 02:54:53
[openssh.git] / monitor_mm.c
index bce98c93cf2fefb7a0d98d7e5818c40c1f798b8e..faf9f3dcb4f6e9eadd14732c5d77e36c37a6fd18 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenBSD: monitor_mm.c,v 1.16 2009/06/22 05:39:28 dtucker Exp $ */
 /*
  * Copyright 2002 Niels Provos <provos@citi.umich.edu>
  * All rights reserved.
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: monitor_mm.c,v 1.3 2002/03/19 10:41:32 markus Exp $");
 
+#include <sys/types.h>
+#ifdef HAVE_SYS_MMAN_H
 #include <sys/mman.h>
+#endif
+#include <sys/param.h>
+#include "openbsd-compat/sys-tree.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <string.h>
 
-#include "ssh.h"
 #include "xmalloc.h"
+#include "ssh.h"
 #include "log.h"
 #include "monitor_mm.h"
 
 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 +72,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 +98,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 +138,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 +159,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 +173,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 +246,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 +269,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 +310,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 +335,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
This page took 0.149422 seconds and 4 git commands to generate.