| Index: src/trusted/platform_qualify/linux/sysv_shm_and_mmap.c
|
| diff --git a/src/trusted/platform_qualify/linux/sysv_shm_and_mmap.c b/src/trusted/platform_qualify/linux/sysv_shm_and_mmap.c
|
| deleted file mode 100644
|
| index 9a2e7ec9678bf033ce23b12f333a7191bf661b14..0000000000000000000000000000000000000000
|
| --- a/src/trusted/platform_qualify/linux/sysv_shm_and_mmap.c
|
| +++ /dev/null
|
| @@ -1,245 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2011 The Native Client Authors. All rights reserved.
|
| - * Use of this source code is governed by a BSD-style license that can be
|
| - * found in the LICENSE file.
|
| - */
|
| -
|
| -/*
|
| - * This test verifies that SysV shared memory, created via shmget and
|
| - * mapped via shmat, can be mmap'd over in parts.
|
| - */
|
| -
|
| -#include <stdio.h>
|
| -#include <stdint.h>
|
| -#include <stdlib.h>
|
| -#include <unistd.h>
|
| -#include <sys/types.h>
|
| -#include <sys/stat.h>
|
| -#include <fcntl.h>
|
| -#include <sys/ipc.h>
|
| -#include <sys/shm.h>
|
| -#include <sys/mman.h>
|
| -
|
| -#include "native_client/src/trusted/platform_qualify/linux/sysv_shm_and_mmap.h"
|
| -
|
| -#define SYSVSHM_SIZE 65536
|
| -#define MMAP_OFFSET 4096
|
| -#define MMAP_SIZE 4096
|
| -
|
| -#ifdef DEBUG_SHM_AND_MMAP
|
| -# define DPRINTF(arglist) do { printf arglist; } while (0)
|
| -#else
|
| -# define DPRINTF(arglist) do { ; } while (0)
|
| -#endif
|
| -
|
| -static void FillWithPattern(void *memory,
|
| - size_t size,
|
| - int counter) {
|
| - unsigned char *mem_ptr = (unsigned char *) memory;
|
| - size_t ix;
|
| -
|
| - for (ix = 0; ix < size; ++ix) {
|
| - mem_ptr[ix] = counter;
|
| - ++counter;
|
| - counter &= 0xff;
|
| - }
|
| -}
|
| -
|
| -static int VerifyPattern(void *memory,
|
| - size_t size,
|
| - int counter) {
|
| - unsigned char *mem_ptr = (unsigned char *) memory;
|
| - size_t ix;
|
| -
|
| - for (ix = 0; ix < size; ++ix) {
|
| - if (mem_ptr[ix] != counter) {
|
| - fprintf(stderr,
|
| - "Memory at %p is wrong: expected %d, got %d\n",
|
| - mem_ptr + ix,
|
| - counter,
|
| - mem_ptr[ix]);
|
| - return 0;
|
| - }
|
| - ++counter;
|
| - counter &= 0xff;
|
| - }
|
| - return 1;
|
| -}
|
| -
|
| -
|
| -/*
|
| - * Verify the allocated shared memory ID.
|
| - */
|
| -int NaClPlatformQualifySysVShmId(int shm_id) {
|
| - void *shm_addr;
|
| - void *shm_addr2;
|
| - void *mmap_addr;
|
| - struct shmid_ds shm_ds;
|
| -
|
| - shm_addr = shmat(shm_id, (const void *) NULL, 0);
|
| - DPRINTF(("shmat -> %p\n", shm_addr));
|
| - if (NULL == shm_addr) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: shmat");
|
| - return 2;
|
| - }
|
| -
|
| - FillWithPattern(shm_addr, SYSVSHM_SIZE, 0);
|
| -
|
| - if (-1 == shmctl(shm_id, IPC_STAT, &shm_ds)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: no shmctl IPC_STAT\n");
|
| - return 3;
|
| - }
|
| - if (1 != shm_ds.shm_nattch) {
|
| - fprintf(stderr,
|
| - "platform_qualify: sysv_shm_and_mmap: shm_nattch (%lu) != 1\n",
|
| - (unsigned long) shm_ds.shm_nattch);
|
| - return 4;
|
| - }
|
| -
|
| - mmap_addr = (void *) ((uintptr_t) shm_addr + MMAP_OFFSET);
|
| - DPRINTF(("mmap addr %p\n", mmap_addr));
|
| - if (MAP_FAILED == mmap(mmap_addr,
|
| - MMAP_SIZE,
|
| - PROT_READ | PROT_WRITE,
|
| - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
|
| - -1,
|
| - 0)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: mmap");
|
| - return 5;
|
| - }
|
| - DPRINTF(("mmap succeeded\n"));
|
| - /*
|
| - * Splitting an shmat mapping will increase the shm_nattch count by 1.
|
| - */
|
| -
|
| - if (-1 == shmctl(shm_id, IPC_STAT, &shm_ds)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: no shmctl IPC_STAT\n");
|
| - return 6;
|
| - }
|
| - if (2 != shm_ds.shm_nattch) {
|
| - fprintf(stderr,
|
| - "platform_qualify: sysv_shm_and_mmap: shm_nattch (%lu) != 2\n",
|
| - (unsigned long) shm_ds.shm_nattch);
|
| - return 7;
|
| - }
|
| -
|
| - FillWithPattern(mmap_addr, MMAP_SIZE, 1);
|
| -
|
| - shm_addr2 = shmat(shm_id, (const void *) NULL, 0);
|
| - DPRINTF(("shmat -> %p\n", shm_addr2));
|
| - if (NULL == shm_addr2) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: shmat 2nd time\n");
|
| - return 8;
|
| - }
|
| -
|
| - if (-1 == shmctl(shm_id, IPC_STAT, &shm_ds)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: no shmctl IPC_STAT\n");
|
| - return 9;
|
| - }
|
| - if (3 != shm_ds.shm_nattch) {
|
| - fprintf(stderr,
|
| - "platform_qualify: sysv_shm_and_mmap: shm_nattch (%lu) != 3\n",
|
| - (unsigned long) shm_ds.shm_nattch);
|
| - return 10;
|
| - }
|
| -
|
| - if (!VerifyPattern(shm_addr2, SYSVSHM_SIZE, 0)) {
|
| - fprintf(stderr,
|
| - "platform_qualify: writing to mmap memory overwrote"
|
| - " sysv shm memory?!?\n");
|
| - return 11;
|
| - }
|
| - FillWithPattern(shm_addr2, SYSVSHM_SIZE, 0);
|
| - if (!VerifyPattern(mmap_addr, MMAP_SIZE, 1)) {
|
| - fprintf(stderr,
|
| - "platform_qualify: writng to shm memory"
|
| - " overwrite mmap memory?!?\n");
|
| - return 12;
|
| - }
|
| - if (MAP_FAILED == mmap(shm_addr,
|
| - SYSVSHM_SIZE,
|
| - PROT_READ | PROT_WRITE,
|
| - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
|
| - -1,
|
| - 0)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: mmap over all"
|
| - " shm_addr failed\n");
|
| - return 13;
|
| - }
|
| -
|
| - if (-1 == shmctl(shm_id, IPC_STAT, &shm_ds)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: no shmctl IPC_STAT\n");
|
| - return 14;
|
| - }
|
| - if (1 != shm_ds.shm_nattch) {
|
| - fprintf(stderr,
|
| - "platform_qualify: sysv_shm_and_mmap: shm_nattch (%lu) != 1\n",
|
| - (unsigned long) shm_ds.shm_nattch);
|
| - return 15;
|
| - }
|
| -
|
| - if (MAP_FAILED == mmap(shm_addr2,
|
| - SYSVSHM_SIZE,
|
| - PROT_READ | PROT_WRITE,
|
| - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED,
|
| - -1,
|
| - 0)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: mmap over all"
|
| - " shm_addr2 failed\n");
|
| - return 16;
|
| - }
|
| - if (-1 == shmctl(shm_id, IPC_STAT, &shm_ds)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: no shmctl IPC_STAT\n");
|
| - return 17;
|
| - }
|
| - if (0 != shm_ds.shm_nattch) {
|
| - fprintf(stderr,
|
| - "platform_qualify: sysv_shm_and_mmap: over-mmap'd shm does not"
|
| - " reduce shm_nattch (%lu)\n",
|
| - (unsigned long) shm_ds.shm_nattch);
|
| - return 18;
|
| - }
|
| -
|
| - return 0;
|
| - }
|
| -
|
| -/*
|
| - * If this code is interrupted or for some reason segvs, then the
|
| - * shared memory is leaked. In that case, use "ipcs -m" to look for
|
| - * segments with key of 0 and bytes of 65536, and then use "ipcrm -m
|
| - * shmid" for the corresponding shmid number to garbage collect the
|
| - * shared memory segment.
|
| - */
|
| -
|
| -
|
| -/*
|
| - * To build as a standalone, build with -DSysVShmAndMmapHasProblems=main.
|
| - */
|
| -int NaClPlatformQualifySysVShmAndMmapHasProblems(void) {
|
| - int err_code = 0;
|
| - int shm_id = -1;
|
| -
|
| - shm_id = shmget(IPC_PRIVATE,
|
| - SYSVSHM_SIZE,
|
| - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
|
| - DPRINTF(("shmget -> %d\n", shm_id));
|
| -
|
| - if (-1 == shm_id) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: shmget");
|
| - return 1;
|
| - }
|
| -
|
| - err_code = NaClPlatformQualifySysVShmId(shm_id);
|
| -
|
| - if (-1 == shmctl(shm_id, IPC_RMID, NULL)) {
|
| - perror("platform_qualify: sysv_shm_and_mmap: shmctl IPC_RMID failed\n");
|
| -
|
| - /*
|
| - * Set the err code to a release failure only if we do not already have
|
| - * a more interesting failure to report.
|
| - */
|
| - if (!err_code) err_code = 19;
|
| - }
|
| -
|
| - return err_code;
|
| -}
|
|
|