This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Bug in dlopen() (or following) code in Cygwin1.dll v 1.5.19-4

Eric Blake wrote:
Top-posting reformatted -

The "efault.faulted()" two lines above your change is supposed to catch
NULL dereferences.

 Take a /look/ at the source for myfault::faulted in cygtls.h, it calls out
to _cygtls::setup_fault, which calls _sjfault, which appears to be a q'n'd
hacked-up version of setjmp in a context where it's going to get called back
by an SEH handler.  So IIUIC, calling 'efault.faulted' will catch any
exception that happens from the point of the call until the point where the
efault object goes out of scope and gets destructed and will cause execution
to jump back to the if... clause.

Ah, got it--it behaves like exception handling, but it
doesn't *look* like exception handling. Seems like a
good place to add some comments! ;-) (Offer to submit
a patch, but seeing as I had to ask, I doubt I'm the
right person to do so.) Thanks for clearing this up
for me!

The only logical place for such a comment would be at the source
for myfault::faulted, as the idiom of efault.faulted() appears
throughout cygwin.


One more thing to be aware of - the reason cygwin uses
this (IMHO very slick) feature of C++ is that it is more efficient
to assume that code will not fault, and blindly deference
pointers with the minimal overhead of setting up the
setjmp buffer with a pre-installed exception handler already
prepared for this usage, than it is to use a syscall to Window's
routines to validate every pointer before dereferencing it.  On
the exceptional case that the code actually did get passed a
bad pointer, the overhead of the exception handling and longjmp
are slower, but that is okay since it is the exception.

So maybe it looks weird. C++ is like that!

I would argue that this isn't a feature of C++ in that it cannot be implemented within the language but must use assembler for a
specific architecture, but I agree that the paradigm of not needing
to check every case is very cool.


Unsubscribe info:
Problem reports:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]