VirtualBox

Changeset 533 in vbox for trunk


Ignore:
Timestamp:
Feb 2, 2007 2:02:14 AM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
18143
Message:

Fixed the RTMemExecAlloc issue with selinux enabled systems (and the assertion on amd64 in RTMemExecFree() during shutdown.)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/Runtime/r3/posix/alloc-posix.cpp

    r341 r533  
    3535#include <sys/mman.h>
    3636
     37#if !defined(RT_USE_MMAP) && (defined(__LINUX__))
     38# define RT_USE_MMAP
     39#endif
     40
     41/*******************************************************************************
     42*   Structures and Typedefs                                                    *
     43*******************************************************************************/
     44#ifdef RT_USE_MMAP
     45/**
     46 * RTMemExecAlloc() header used when using mmap for allocating the memory.
     47 */
     48typedef struct RTMEMEXECHDR
     49{
     50    /** Magic number (RTMEMEXECHDR_MAGIC). */
     51    size_t      uMagic;
     52    /** The size we requested from mmap. */
     53    size_t      cb;
     54# if ARCH_BITS == 32
     55    uint32_t    Alignment[2];
     56# endif
     57} RTMEMEXECHDR, *PRTMEMEXECHDR;
     58
     59/** MAgic for RTMEMEXECHDR. */
     60#define RTMEMEXECHDR_MAGIC (~(size_t)0xfeedbabe)
     61
     62#endif  /* RT_USE_MMAP */
     63
     64
    3765
    3866#ifdef IN_RING3
     
    4977    AssertMsg(cb, ("Allocating ZERO bytes is really not a good idea! Good luck with the next assertion!\n"));
    5078
    51 #if defined(__AMD64__) && defined(__LINUX__)
     79#ifdef RT_USE_MMAP
    5280    /*
    5381     * Use mmap to get low memory.
    5482     */
    55     void *pv = mmap(NULL, RT_ALIGN_Z(cb, PAGE_SIZE), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS | MAP_32BIT, -1, 0);
     83    void *pv = mmap(NULL, RT_ALIGN_Z(cb, PAGE_SIZE), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS
     84#if defined(__AMD64__) && defined(MAP_32BIT)
     85                    | MAP_32BIT
     86#endif
     87                    , -1, 0);
    5688    AssertMsgReturn(pv != MAP_FAILED, ("errno=%d cb=%#zx\n", errno, cb), NULL);
     89    PRTMEMEXECHDR pHdr = (PRTMEMEXECHDR)pv;
     90    pHdr->uMagic = RTMEMEXECHDR_MAGIC;
     91    pHdr->cb = RT_ALIGN_Z(cb, PAGE_SIZE);
     92    pv = pHdr + 1;
    5793
    5894#else
     
    98134    if (pv)
    99135    {
    100 #if defined(__AMD64__) && defined(__LINUX__)
    101         int rc = munmap(pv, 0);/** @todo fix me! */
     136#ifdef RT_USE_MMAP
     137        PRTMEMEXECHDR pHdr = (PRTMEMEXECHDR)pv - 1;
     138        AssertMsgReturnVoid(RT_ALIGN_P(pHdr, PAGE_SIZE) == pHdr, ("pHdr=%p pv=%p\n", pHdr, pv));
     139        AssertMsgReturnVoid(pHdr->uMagic == RTMEMEXECHDR_MAGIC, ("pHdr=%p(uMagic=%#zx) pv=%p\n", pHdr, pHdr->uMagic, pv));
     140        int rc = munmap(pHdr, pHdr->cb);
    102141        AssertMsg(!rc, ("munmap -> %d errno=%d\n", rc, errno));
    103142#else
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette