On 01/23/2015 03:53 PM, Eric Blake wrote:
> On 01/23/2015 02:58 PM, Eric Blake wrote:
>> http://pubs.opengroup.org/onlinepubs/9699919799/functions/setjmp.html is
>> clear:
>>
>> "It is unspecified whether setjmp() is a macro or a function. If a macro
>> definition is suppressed in order to access an actual function, or a
>> program defines an external identifier with the name setjmp, the
>> behavior is undefined."
>>
>> But in readline's posixjmp.h wrapper file, you do:
>>
>> #if defined (HAVE_POSIX_SIGSETJMP)
>> #  define procenv_t     sigjmp_buf
>> #  if !defined (__OPENNT)
>> #    undef setjmp
>> #    define setjmp(x)   sigsetjmp((x), 1)
> 
> You also define a setjmp_nosigs, but nothing in the readline sources
> uses it.  For that matter, readline only has two instances of setjmp
> clients, both which will never be reached when HAVE_POSIX_SIGSETJMP is
> defined.
> 
> And why are you passing 0 to sigsetjmp in those two clients?  Don't you
> generally want to preserve signal masks by passing a nonzero value,
> rather than leave it unspecified whether they are preserved?

Okay, I see that while readline doesn't use setjmp_nosigs, the rest of
bash source does.

Remember, POSIX states that sigsetjmp(x, 0) is the same as setjmp(x),
which may or may not save the signal mask; on Cygwin, the signal mask is
ALWAYS saved (that is, the second argument of sigsetjmp() makes no
difference in behavior; there is never a way to explicitly opt out of
saving signals).

Thus, the following is the minimal patch for Cygwin to have correct
compilation (both setjmp and setjmp_nosigs usage points in bash will
have identical behavior).  Although I still think that you ought to fix
more than just Cygwin by auditing and eradicating all uses of setjmp in
favor of sigsetjmp to begin with, that's a bigger patch to bash, so I'm
not going to bother with doing it myself now that I have a correct
environment on cygwin.

diff --git i/lib/readline/posixjmp.h w/lib/readline/posixjmp.h
index 98cf718..1af5de7 100644
--- i/lib/readline/posixjmp.h
+++ w/lib/readline/posixjmp.h
@@ -1,6 +1,6 @@
 /* posixjmp.h -- wrapper for setjmp.h with changes for POSIX systems. */

-/* Copyright (C) 1987,1991 Free Software Foundation, Inc.
+/* Copyright (C) 1987,1991,2015 Free Software Foundation, Inc.

    This file is part of GNU Bash, the Bourne Again SHell.

@@ -27,7 +27,7 @@

 #if defined (HAVE_POSIX_SIGSETJMP)
 #  define procenv_t    sigjmp_buf
-#  if !defined (__OPENNT)
+#  if !defined (__OPENNT) && !defined (__CYGWIN__)
 #    undef setjmp
 #    define setjmp(x)  sigsetjmp((x), 1)
 #    define setjmp_nosigs(x)   sigsetjmp((x), 0)


-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to