mmap and SIGBUS
Pavel Machek
pavel at ucw.cz
Fri Sep 21 19:30:18 UTC 2001
Hi!
> Here is a parts of my and Jamie Lokier <lk at tantalophile.demon.co.uk> letters about mmap.
> We discussed this at Linux Kernel mailing list, but it seems it is standart behaviour
> of Unices kernel's.
Yep, seen that discussion. I did not agree with jamie, IMNSHO SIGBUS
sometimes is better than not being able to view files > virtual mem.
Pavel
> > I have bad CD-R with a some number of unreadable files.
> >
> > User-space program use mmap system call and it returns ok but any
> > attempt to access a memory pointed by this system call finishes
> > with SIGBUS. So Midnight Commander internal file viewer faults.
>
> You can get the same problem even without read errors with some
> configurations of NFS. (root mmaps a file owned by someone else, but
> cannot read the file due to `root_squash' on server).
>
> It's not an error, it's standard behaviour.
>
> > Is there any way to detect such problem in user-space without signal
> > handlers ?
>
> I don't think there is any way without a signal handler.
>
> It is possible to do something useful with a signal handler sometimes.
> For example, you can mmap() a zero page into the offending page once
> you've got the fault address, or read() a zero page if you did
> MAP_PRIVATE (this produces fewer VMAs), set a flag, and let the program
> continue until it checks the flag and aborts the parsing or whatever
> operation it's doing.
>
> Unfortunately I don't think the signal handler's si_errno is set
> properly to indicate the error. So another thing to try is read() of
> the offending page, to get a useful error code. (And if the read
> succeeds, that's ok because you did it at the correct address so the
> program can proceed anyway).
>
> Fwiw, unfortunately not all versions of the kernel, or all
> architectures, set si_addr properly for SIGBUS.
>
> It is possible to do something useful with a signal handler sometimes.
> For example, you can mmap() a zero page into the offending page once
> you've got the fault address, or read() a zero page if you did
> MAP_PRIVATE (this produces fewer VMAs), set a flag, and let the program
> continue until it checks the flag and aborts the parsing or whatever
> operation it's doing.
>
> > So, I must read all of the mapped area and even this
> > does not saves me of faulting next time if somebody
> > change file permission. Does I understand this situation right?
>
> If you use MAP_PRIVATE, then after your process modifies the mappedpage, you have the data
> for sure. This includes calling read() over apage that raises a SIGBUS -- the page is "modified"
> by this operation,although the contents should hopefully be the correct file contents if
> read() succeeds. Any subsequent change to the file, including permission changes and
> data changes, won't affect the data you have in memory. If you do not modify the pages
> (and usually, for efficiency, you wouldn't), then yes a change in file permissions can mean
> you can read data one second and will get a SIGBUS later. You're not guaranteed to get a SIGBUS,
> but you might get one -- it depends on whether the OS decides to reclaim the page's memory
> temporarily in between.
>
> If you want to do something like an Editor's "Load File" operation, then
> you need to read the whole file. Either call read(), or call mmap() andthen modify every page
> by reading one byte from each page and writingthe same value back to the same place.
> read() is probably quicker, but I've never checked.
>
> -- Jamie
>
>
>
>
> ____________________________________________
>
> éÇÒÁÊ × ÛÁÈÍÁÔÙ × éÎÔÅÒÎÅÔ ÎÁ InstantChess.com!
>
> Play chess on InstantChess.com !
>
> www.instantchess.com
>
--
I'm pavel at ucw.cz. "In my country we have almost anarchy and I don't care."
Panos Katsaloulis describing me w.r.t. patents at discuss at linmodems.org
More information about the mc-devel
mailing list