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

