From owner-freebsd-hackers Sun Aug 11 20:11:35 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.5/8.7.3) id UAA27053 for hackers-outgoing; Sun, 11 Aug 1996 20:11:35 -0700 (PDT) Received: from who.cdrom.com (who.cdrom.com [204.216.27.3]) by freefall.freebsd.org (8.7.5/8.7.3) with ESMTP id UAA27045 for ; Sun, 11 Aug 1996 20:11:32 -0700 (PDT) Received: from pdx1.world.net (pdx1.world.net [192.243.32.18]) by who.cdrom.com (8.7.5/8.6.11) with ESMTP id UAA02338 for ; Sun, 11 Aug 1996 20:11:29 -0700 (PDT) Received: from suburbia.net (suburbia.net [203.4.184.1]) by pdx1.world.net (8.7.5/8.7.3) with ESMTP id UAA29942; Sun, 11 Aug 1996 20:10:19 -0700 (PDT) Received: (proff@localhost) by suburbia.net (8.7.4/Proff-950810) id NAA31457; Mon, 12 Aug 1996 13:07:36 +1000 From: Julian Assange Message-Id: <199608120307.NAA31457@suburbia.net> Subject: mmap #2 To: freebsd-hackers@freebsd.org Date: Mon, 12 Aug 1996 13:07:36 +1000 (EST) Cc: meditation@gnu.ai.mit.edu X-Mailer: ELM [version 2.4 PL23] Content-Type: text Sender: owner-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk Here are some other results, which hackers may be interested in. Note that the test code hangs on Sunos 4.1.1 (some signal problem) and apparently also a version OSF/1. If anyone has any ideas as to why, I'd be interested in hearing it. /* $Id: mmap_tests.c,v 1.6 1996/08/11 21:01:45 proff Exp $ * * various mmap() implimentations suck; we attempt to find out just how * hard. * * - Julian Assange (proff@suburbia.net) * * Test results: (please send additions to proff@suburbia.net) * * linux 2.0.0 allows shared mmaps only for files, while 1.2.13 * doesn't permit shared mmaps at all. * * Linux suburbia 2.0.0 #29- Thu Jul 11 18:03:20 EST 1996 i586 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_ANON_PRIVATE * HAVE_MMAP_ANON_PRIVATE_CHILD_INHERIT * * Linux server 1.2.13 #6 Wed Feb 28 15:45:11 CST 1996 i486 (forget it) * * program output: * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_ANON_PRIVATE * HAVE_MMAP_ANON_PRIVATE_CHILD_INHERIT * * Freebsd is purrrrfect. * * FreeBSD profane 2.2-CURRENT #0 Sat Jul 27 19:16:00 EST 1996 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_ANON_PRIVATE * HAVE_MMAP_ANON_PRIVATE_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED * HAVE_MMAP_ANON_SHARED_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_ANON_SHARED_PARENT_READ_CHILD_WRITE * * Suprisingly, AIX is faultless too. * * AIX whisky 2 3 000027477600 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_ANON_PRIVATE * HAVE_MMAP_ANON_PRIVATE_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED * HAVE_MMAP_ANON_SHARED_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_ANON_SHARED_PARENT_READ_CHILD_WRITE * * Shared mmap file writes are screwed under BSDI! * * BSD/OS telepath.com 2.1 BSDI BSD/OS 2.1 Kernel #3: Thu Mar 7 10:47:49 CST 1996 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_ANON_PRIVATE * HAVE_MMAP_ANON_PRIVATE_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED * HAVE_MMAP_ANON_SHARED_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_ANON_SHARED_PARENT_READ_CHILD_WRITE * * SunOS omega.iqm.unicamp.br 5.4 generic i86pc i386 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * * SunOS chaos 4.1C 4.1.3 sun4 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * * SunOS unix1 5.3 Generic_101318-59 sun4m sparc (no shared file write?) * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * * SunOS sydney6 5.5 Generic_103093-03 sun4m sparc SUNW,SPARCstation-20 * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * * Novell Unixware 2.03 (System V Release 4.2MP) UNIX_SV aapo 4.2MP 2.03 i386 x86at * * HAVE_MMAP_FILE_PRIVATE_READ * HAVE_MMAP_FILE_PRIVATE_CHILD_INHERIT * HAVE_MMAP_FILE_PRIVATE_WRITE * HAVE_MMAP_FILE_SHARED_READ * HAVE_MMAP_FILE_SHARED_CHILD_INHERIT * HAVE_MMAP_FILE_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_FILE_SHARED_PARENT_READ_CHILD_WRITE * HAVE_MMAP_FILE_SHARED_WRITE * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_DEV_ZERO_SHARED_PARENT_READ_CHILD_WRITE * * ULTRIX wolf.cs.washington.edu 4.2 0 RISC (way to go ultrix) * * nothing. zilch. zippo * * OSF1 porky-pig V3.2 214 alpha (unexpected. osf/1 sucks) * * HAVE_MMAP_DEV_ZERO_PRIVATE * HAVE_MMAP_DEV_ZERO_PRIVATE_CHILD_INHERIT * HAVE_MMAP_DEV_ZERO_SHARED * HAVE_MMAP_DEV_ZERO_SHARED_CHILD_INHERIT * HAVE_MMAP_ANON_PRIVATE * HAVE_MMAP_ANON_PRIVATE_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED * HAVE_MMAP_ANON_SHARED_CHILD_INHERIT * HAVE_MMAP_ANON_SHARED_CHILD_READ_PARENT_WRITE * HAVE_MMAP_ANON_SHARED_PARENT_READ_CHILD_WRITE */ #ifdef HAVE_MMAP #include #include #include #include #include #include #include #include #define MM_SIZE (100*1024) #define TEST_FILE "mmap_test.tmp" int caught_sigquit; void sigquit (int sig) { caught_sigquit++; signal (SIGQUIT, sigquit); } jmp_buf jmp; void sigsegv (int sig) { signal (SIGSEGV, sigsegv); longjmp (jmp, 1); } /* * TODO: test MAP_INHERIT, MAP_FIXED (can't see that latter being much of an issue) */ void test_child(char *p, char *msg) { char *im = "inherit_magic"; char *pm = "parent_magic"; char *cm = "child_magic"; pid_t pid; int ws; fflush (stdout); if (!setjmp(jmp)) strcpy (p, im); caught_sigquit = 0; signal (SIGQUIT, sigquit); signal (SIGCHLD, SIG_IGN); pid = fork(); if (pid<0) return; if (pid==0) { if (!setjmp(jmp)) if (strcmp(p, im)==0) printf("%s_CHILD_INHERIT\n", msg); kill (getppid(), SIGQUIT); while (!caught_sigquit) pause (); caught_sigquit = 0; if (!setjmp(jmp)) if (strcmp(p, pm)==0) printf("%s_CHILD_READ_PARENT_WRITE\n", msg); if (!setjmp(jmp)) strcpy (p, cm); fflush (stdout); kill (getppid(), SIGQUIT); exit(0); } /* parent */ while (!caught_sigquit) pause (); caught_sigquit = 0; if (!setjmp(jmp)) strcpy (p, pm); kill (pid, SIGQUIT); while (!caught_sigquit) pause (); if (!setjmp(jmp)) if (strcmp(p, cm)==0) printf("%s_PARENT_READ_CHILD_WRITE\n", msg); signal (SIGQUIT, SIG_DFL); wait(&ws); } int main() { volatile int fd; char *m = malloc(MM_SIZE); char buf[1024]; signal (SIGSEGV, sigsegv); #if defined(MAP_PRIVATE) fd = open(TEST_FILE, O_RDWR|O_CREAT|O_TRUNC, 0666); strcpy (m, "mmap magic"); write (fd, m, 11); lseek (fd, 0, SEEK_SET); if (fd>=0) { char *p=(char *)mmap(0, MM_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if (p!=(char *)-1) { if (!setjmp(jmp)) if (strcmp(p, m)==0) puts("HAVE_MMAP_FILE_PRIVATE_READ"); test_child(p, "HAVE_MMAP_FILE_PRIVATE"); if (!setjmp(jmp)) { strcpy (p, "mmap magic2"); read (fd, buf, 12); if (strcmp(buf, "mmap magic2")!=0) puts("HAVE_MMAP_FILE_PRIVATE_WRITE"); } munmap (p, MM_SIZE); } close (fd); } #endif #if defined(MAP_SHARED) fd = open(TEST_FILE, O_RDWR|O_CREAT|O_TRUNC, 0666); strcpy (m, "mmap magic"); write (fd, m, 11); lseek (fd, 0, SEEK_SET); if (fd>=0) { char *p=(char *)mmap(0, MM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (p!=(char *)-1) { if (!setjmp(jmp)) if (strcmp(p, m)==0) puts("HAVE_MMAP_FILE_SHARED_READ"); test_child(p, "HAVE_MMAP_FILE_SHARED"); if (!setjmp(jmp)) { strcpy (p, "mmap magic2"); read (fd, buf, 12); if (strcmp(buf, "mmap magic2")==0) puts("HAVE_MMAP_FILE_SHARED_WRITE"); } munmap (p, MM_SIZE); } close (fd); } #endif #if defined(MAP_PRIVATE) fd = open("/dev/zero", O_RDWR, 0666); if (fd>=0) { char *p=(char *)mmap(0, MM_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); if (p!=(char *)-1) { if (!setjmp(jmp)) { strcpy (p, "mmap magic_dev_zero"); if (strcmp (p, "mmap magic_dev_zero")==0) puts("HAVE_MMAP_DEV_ZERO_PRIVATE"); } test_child(p, "HAVE_MMAP_DEV_ZERO_PRIVATE"); munmap (p, MM_SIZE); } close (fd); } #endif #if defined(MAP_PRIVATE) fd = open("/dev/zero", O_RDWR, 0666); if (fd>=0) { char *p=(char *)mmap(0, MM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (p!=(char *)-1) { if (!setjmp(jmp)) { strcpy (p, "mmap magic_dev_zero_shared"); if (strcmp (p, "mmap magic_dev_zero_shared")==0) puts("HAVE_MMAP_DEV_ZERO_SHARED"); } test_child(p, "HAVE_MMAP_DEV_ZERO_SHARED"); munmap (p, MM_SIZE); } close (fd); } #endif #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) #define MAP_ANON MAP_ANONYMOUS #endif #ifdef MAP_ANON { char *p=(char *)mmap(0, MM_SIZE, PROT_READ | PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); if (p!=(char *)-1) { if (!setjmp(jmp)) { strcpy (p, "mmap magic_anon"); if (strcmp(p, "mmap magic_anon")==0) puts("HAVE_MMAP_ANON_PRIVATE"); } test_child(p, "HAVE_MMAP_ANON_PRIVATE"); munmap (p, MM_SIZE); } } #endif #if defined(MAP_ANON) && defined(MAP_SHARED) { char *p=(char *)mmap(0, MM_SIZE, PROT_READ | PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); if (p!=(char *)-1) { if (!setjmp(jmp)) { strcpy (p, "mmap magic_shared_anon"); if (strcmp(p, "mmap magic_shared_anon")==0) puts("HAVE_MMAP_ANON_SHARED"); } test_child(p, "HAVE_MMAP_ANON_SHARED"); munmap (p, MM_SIZE); } } #endif unlink(TEST_FILE); exit (0); } #endif /* HAVE_MMAP */