On Fri, Jan 27, 2006 at 11:08:48AM +0100, Daniel Schepler wrote: > I see the build is somehow succeeding on the buildd's, though... but I don't > know what's different.
Would you please compile and run the attached program on your system and let me know what the result is? -- Matt
#include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #include <setjmp.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> char spaces[0x2000]; static sigjmp_buf segvJumpEnv; static void segvSignal( int sig ) { siglongjmp( segvJumpEnv, sig ); } int main( int argc, char** argv ) { static const char file_z[] = __FILE__; unsigned long fsize; int signo; void* ext_res; #ifdef _SC_PAGESIZE size_t pgsz = sysconf(_SC_PAGESIZE); #else size_t pgsz = getpagesize(); #endif { struct sigaction sa; sa.sa_handler = segvSignal; sa.sa_flags = 0; sigemptyset( &sa.sa_mask ); sigaction( SIGSEGV, &sa, NULL ); sigaction( SIGBUS, &sa, NULL ); } signo = sigsetjmp( segvJumpEnv, 0 ); if (signo != 0) { fprintf( stderr, "Segfaulted (%s) early\n", strsignal(signo) ); return EXIT_FAILURE; } { FILE* fp = fopen(file_z, "r+"); if (fp == NULL) return EXIT_FAILURE; if (fseek(fp, 0, SEEK_END) < 0) return EXIT_FAILURE; fsize = (ftell(fp) & (pgsz - 1)); if (fsize > 0) { unsigned long len = pgsz - fsize; for (fsize = len; fsize > 0;) spaces[--fsize] = '\n'; if (fwrite(spaces, len, 1, fp) != 1) { fprintf( stderr, "fs err %d (%s) writing %d bytes\n", errno, strerror(errno), len ); return EXIT_FAILURE; } } fsize = ftell(fp); fclose(fp); } { int fd; void* base_ptr; void* ext_ptr; fd = open( file_z, O_RDONLY ); if (fd < 0) { perror("reopening " __FILE__ " read-only"); return EXIT_FAILURE; } base_ptr = mmap( NULL, fsize, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0 ); if (base_ptr == (void*)(-1L)) { perror("mmap-ing " __FILE__ " PROT_READ/WRITE"); return EXIT_FAILURE; } ext_ptr = (void*)(((char*)base_ptr) + fsize); signo = sigsetjmp( segvJumpEnv, 0 ); if (signo == 0) { printf( "char at %p is %d\n", ext_ptr, *(unsigned char*)ext_ptr); fprintf( stderr, "did not fault dereferencing 0x%lX\n", ext_ptr); return EXIT_FAILURE; } signo = sigsetjmp( segvJumpEnv, 0 ); #ifdef MAP_ANONYMOUS if (signo == 0) { ext_res = mmap(ext_ptr, pgsz, PROT_READ, MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, 0, 0); } else { fprintf( stderr, "sig %d (%s) mmap-ping /dev/zero:\n", signo, strsignal(signo) ); emit_error: fprintf( stderr, " mmap(%p, 0x%lX, PROT_READ, " "MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, 0, 0)\n", ext_ptr, pgsz); return EXIT_FAILURE; } #else { int fdz; if (signo == 0) { fdz = open("/dev/zero", O_RDONLY); if (fdz < 0) { perror("open-ing /dev/zero"); return EXIT_FAILURE; } ext_res = mmap(ext_ptr, pgsz, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_PRIVATE, fdz, 0); } else { fprintf( stderr, "sig %d (%s) mmap-ping /dev/zero:\n", signo, strsignal(signo) ); emit_error: fprintf( stderr, " mmap(%p, 0x%lX, PROT_READ, " "MAP_PRIVATE|MAP_FIXED|MAP_PRIVATE, %d, 0)\n", ext_ptr, pgsz, fdz); return EXIT_FAILURE; } } #endif if (ext_ptr != ext_res) { if (ext_res == (void*)(-1L)) { fprintf( stderr, "fs err %d (%s) mmap-ping NUL page\n", errno, strerror( errno )); goto emit_error; } fprintf( stderr, "map fixed to 0x%p resulted in 0x%p -- FAILURE\n", ext_ptr, ext_res ); return EXIT_FAILURE; } } signo = sigsetjmp( segvJumpEnv, 0 ); if (signo != 0) { fprintf( stderr, "faulted dereferencing 0x%lX\n", ext_res); return EXIT_FAILURE; } printf( "Successfully mapped NUL page at %p (is %d)\n", ext_res, *(unsigned char*)ext_res); return EXIT_SUCCESS; } /* * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * * * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678abcdefghijklmnopqrstuvwxyz * A */ /* * Local Variables: * mode: C * c-file-style: "stroustrup" * tab-width: 4 * indent-tabs-mode: nil * End: * end of mmap-test.c */
signature.asc
Description: Digital signature