bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: readline 6.3 violates POSIX by doing #undef setjmp


From: Eric Blake
Subject: Re: readline 6.3 violates POSIX by doing #undef setjmp
Date: Fri, 23 Jan 2015 16:31:30 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0

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

[Prev in Thread] Current Thread [Next in Thread]