Author: mturk Date: Wed Aug 12 21:02:46 2009 New Revision: 803710 URL: http://svn.apache.org/viewvc?rev=803710&view=rev Log: Add magic to shared memory for an extra security
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h?rev=803710&r1=803709&r2=803710&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h Wed Aug 12 21:02:46 2009 @@ -32,6 +32,11 @@ */ /** + * Any value will do + */ +#define ACR_SHM_MAGIC 0xB2303964 + +/** * Private, platform-specific data struture representing a shared memory * segment. */ Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c?rev=803710&r1=803709&r2=803710&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c Wed Aug 12 21:02:46 2009 @@ -38,6 +38,13 @@ #define ACR_SHM_OWNER 0 #define ACR_SHM_CHILD 1 +typedef struct memblock_t { + acr_uint32_t magic; /* Is this our memeory */ + pid_t creator; /* Creator's process ID */ + acr_size_t size; + acr_size_t length; +} memblock_t; + struct acr_shm_t { void *base; /* base real address */ void *usable; /* base usable address */ @@ -186,6 +193,7 @@ ACR_DECLARE(int) ACR_ShmCreate(JNIEnv *_E, acr_size_t reqsize, const acr_pchar_t *filename) { + memblock_t hdr; acr_shm_t *shm = NULL; struct shmid_ds shmbuf; int file; /* file where metadata is stored */ @@ -282,9 +290,13 @@ goto cleanup; } - nbytes = sizeof(reqsize); + nbytes = sizeof(memblock_t); + hdr.creator = getpid(); + hdr.magic = ACR_SHM_MAGIC; + hdr.size = shm->reqsize; + hdr.length = shm->realsize; do { - rc = write(file,(const void *)&reqsize, nbytes); + rc = write(file,(const void *)&hdr, nbytes); } while (rc == (acr_size_t)-1 && errno == EINTR); if (rc == -1) { rc = ACR_GET_OS_ERROR(); @@ -317,6 +329,7 @@ ACR_DECLARE(int) ACR_ShmAttach(JNIEnv *_E, const acr_pchar_t *filename) { + memblock_t hdr; acr_shm_t *shm = NULL; int file; /* file where metadata is stored */ int rc; @@ -343,10 +356,10 @@ goto cleanup; } - nbytes = sizeof(shm->reqsize); + nbytes = sizeof(memblock_t); do { - rc = read(file, (void *)&(shm->reqsize), nbytes); + rc = read(file, (void *)&hdr, nbytes); } while (rc == -1 && errno == EINTR); if (rc != nbytes) { /* Wrong format */ @@ -358,8 +371,13 @@ if (rc) { goto cleanup; } - - shm->shmkey = ftok(filename, 1); + if (hdr.magic != ACR_SHM_MAGIC) { + /* Not created by us or corrupted */ + rc = ACR_EBADF; + goto cleanup; + } + shm->reqsize = hdr.size; + shm->shmkey = ftok(filename, 1); if (shm->shmkey == (key_t)-1) { rc = ACR_GET_OS_ERROR(); goto cleanup; Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c?rev=803710&r1=803709&r2=803710&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c Wed Aug 12 21:02:46 2009 @@ -27,8 +27,10 @@ #define ACR_SHM_CHILD 1 typedef struct memblock_t { - acr_size_t size; - acr_size_t length; + acr_uint32_t magic; /* Is this our memeory */ + DWORD creator; /* Creator's process ID */ + acr_size_t size; + acr_size_t length; } memblock_t; struct acr_shm_t { @@ -134,6 +136,11 @@ hfile = INVALID_HANDLE_VALUE; reskey = NULL; } + else if (_wcsnicmp(filename, L"PAGEFILE:", 9) == 0) { + /* Use pagefile instead real file */ + hfile = INVALID_HANDLE_VALUE; + reskey = res_name_from_filenamew(ACR_DT_SHM, keybuf, filename); + } /* Name-based shared memory */ else { /* Do file backed, which is not an inherited handle @@ -193,8 +200,10 @@ shm->usrmem = (char*)base + sizeof(memblock_t); shm->length = reqsize - sizeof(memblock_t);; - shm->memblk->length = shm->length; - shm->memblk->size = shm->size; + shm->memblk->magic = ACR_SHM_MAGIC; + shm->memblk->creator = GetCurrentProcessId(); + shm->memblk->length = shm->length; + shm->memblk->size = shm->size; if (filename) { shm->filename = ACR_StrdupW(_E, THROW_FMARK, filename); if (!shm->filename) {