[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
signature.asc
Description: OpenPGP digital signature