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 */

Attachment: signature.asc
Description: Digital signature

Reply via email to