On Thu, 13 Jul 2006, Brian Ford wrote:
> On Thu, 13 Jul 2006, Corinna Vinschen wrote:
> > I added an (hopefully) appropriate patch, which commits a page within a
> > MAP_NORESERVE area when memory in this page is accessed by the
> > application.  If commiting the memory fails, SIGBUS is generated. Please
> > test CVS HEAD or the next developer snapshot from
> > http://cygwin.com/snapshots/
>
> Wow!  Thanks.  Given my limited Windows API knowledge, that sounded
> difficult to accomplish properly.  I'll test it for you shortly.

One problem found.  If the memory is not touched before using it as a
buffer to a read call, the read returns -1 with errno set to ISDIR.  STC
attached.

Thanks again for looking at this.

-- 
Brian Ford
Lead Realtime Software Engineer
VITAL - Visual Simulation Systems
FlightSafety International
the best safety device in any aircraft is a well-trained crew...
.

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>


int
main(int argc, char * argv[])
{
    int   virt_size, fd;
    void *addr;

    addr      = NULL;
    virt_size = 0x18000000;
    addr = mmap(addr, virt_size, (PROT_READ|PROT_WRITE),
                (MAP_NORESERVE|MAP_PRIVATE|MAP_ANON), -1, 0);
    if (addr == MAP_FAILED)
    {
        perror("mapping VM scratch space");
        return -1;
    }

    fd = open("/proc/self/exe", O_RDONLY);
    if (fd < 0)
    {
        perror("open self");
        return -1;
    }

#ifdef PRE_TOUCH
    memset(addr, -1, sysconf(_SC_PAGESIZE));
#endif

    if (read(fd, addr, sysconf(_SC_PAGESIZE)) < 0)
    {
        perror("read");
        close(fd);
        return -1;
    }

    close(fd);

    return 0;
}
--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Reply via email to