Date: Sun, 28 May 2000 02:04:52 +0800 From: Trent Nelson <tpnelson@echidna.stu.cowan.edu.au> To: hackers@FreeBSD.org Cc: dillon@backplane.com Subject: Erroneous mmap() behaviour? Message-ID: <39300E44.558B632F@student.cowan.edu.au>
next in thread | raw e-mail | index | archive | help
Can someone explain to me why mmap() returns an address map you're prohibited from accessing if the fd argument represents a file that has just been created? I have a function that calls the following, where name represents a file that, if it exists, is intended to get written over, and if it doesn't exist, is intended to get created: open(name, (O_RDWR | O_CREAT | O_TRUNC), (S_IRUSR | S_IWUSR)); What I'm trying to do on return of this fd is, pass it through mmap() and allocate a certain amount of memory to encapsulate some data I need to put there - then calling msync() to have the memory buffer flushed back to disk. The mmap() call is: 248: mksd->msize_db = align(mksd->fsize_db); 249: mksd->mmap_db = mmap(NULL, mksd->msize_db, (PROT_READ | PROT_WRITE), MAP_PRIVATE, mksd->fd_db, NULL); If the file exists (size irrespective), then the following happens, which is what we want: bash-2.03$ ls -la database.dat -rw------- 1 tnelson tnelson 0 May 27 23:59 database.dat bash-2.03$ gcc -g -o mksigdata mksd-2.c file_sigs.o bash-2.03$ gdb mksigdata [...] (gdb) break 249 Breakpoint 1 at 0x8048df7: file mksd-2.c, line 249. (gdb) run files.dat database.dat Breakpoint 1, write_database (mksd=0xbfbffb50) at mksd-2.c:249 249 mksd->mmap_db = mmap(NULL, (gdb) n 255 if ((int)mksd->mmap_db == -1) (gdb) display *mksd 1: *mksd = {file_list = {files = 0x280f3000, history = 0x804d030, size = [...] mmap_db = 0x280f4000} ^^^^^^^^^^ This is what we're after. (Check the validity of the returned memory) (gdb) x/4 0x280f4000 0x280f4000: 0x00000000 0x00000000 0x00000000 0x00000000 So, it all works fine. As soon as the file is removed and it has to be created, though: bash-2.03$ rm database.dat bash-2.03$ gdb mksigdata [...] mmap_db = 0x280f4000} (gdb) x/4 0x2980f4000 0x280f4000: Error accessing memory address 0x280f4000: Bad address. Which is where my problem lies. Is it me, or mmap()? If it's me, is there any better way of doing what I want to do? (which is essentially allocating memory to be modified, then sync'd to a most probably newly-created file). From what I can see, the code works as it should in Linux. Thanks in advance. Regards, Trent. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?39300E44.558B632F>