Christopher, a few points about your comments:

1. I wasn't asking for help. This bug report wasn't for 
   our benefit. We're content to use version 1.3.19.

2. Next time, read the man page:

   "The actual place where the object is mapped is 
    returned by mmap, and is never 0." - mmap man page

Despite your warm welcome to the group, I have attached a 
full test case. After further inspection it appears 
that the seg fault only occurs if the file offset is greater 
than 16 system pages. The seg fault only occurs in version
1.3.20. The TEST_FILE macro needs to be set to the name of a
file that is larger than 16 system pages + 32 bytes.

Brett

-----Original Message-----
From: Christopher Faylor [mailto:[EMAIL PROTECTED]
Sent: Tuesday, February 25, 2003 1:28 PM
To: [EMAIL PROTECTED]
Subject: Re: 1.3.20: mmap with nonzero file offset results in seg fault
(Win2k )"


On Tue, Feb 25, 2003 at 12:49:45PM +1100, [EMAIL PROTECTED] wrote:
>
>Accessing the mapped region of memory after an mmap call 
>with a non-zero offset results in a seg fault. A zero 
>offset will not result in a seg fault.
>
>Cygwin1.dll version 1.3.19 doesn't experience this problem.  
>Cygcheck output is attached.
>
>Example:
>
>if (rslt = mmap(0, size, prot, MAP_SHARED,  fd, offset)) 
>    == MAP_FAILED) {
>} else {
>    printf("%d", rslt[0]); // seg fault
>}
>AND
>if (rslt = mmap(0, size, prot, MAP_SHARED,  fd, 0)) 
>    == MAP_FAILED) {
>} else {
>    printf("%d", rslt[0]); // no seg fault (zero offset)
>}

The above is bogus code since rslt will be equal to either 1 or 0
depending on whether mmap failed or not.

Please provide a real working test case which can be cut, pasted,
compiled, linked, and run, if you want help.  The theory is that,
if you want help, you reduce the barrier of providing the help as
much as possible.  Providing buggy examples isn't going to do that.

cgf
--
Please use the resources at cygwin.com rather than sending personal email.
Special for spam email harvesters: send email to [EMAIL PROTECTED]
and be permanently blocked from mailing lists at sources.redhat.com

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

#define MAP_SIZE 32
#define TEST_FILE "textfile.txt" 

// TEST_FILE must be larger than a (16 * pagesize) + 32 bytes

int main(int argc, char **argv) {

        int fd, offset;
        void * startAddr;

        fd = open(TEST_FILE, O_RDONLY);

        /* map with non-zero offset */
        offset = 0;
        startAddr = mmap(0, MAP_SIZE, PROT_READ, MAP_SHARED, fd, offset);
        printf("Mapped file with zero offset at %d\n", (int)startAddr);
        printf("%c\n", *((char *)startAddr));   
        munmap(startAddr, MAP_SIZE); 

        /* map with non-zero offset */
        offset = 16 * getpagesize();
        startAddr = mmap(0, MAP_SIZE, PROT_READ, MAP_SHARED, fd, offset);
        printf("Mapped file with nonzero offset at %d\n", (int)startAddr);
        printf("%c\n", *((char *)startAddr));
        munmap(startAddr, MAP_SIZE); 

        close(fd);
        
        return 0;
}

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Reply via email to