4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-22 00:38:06 +08:00

perror: fix POSIX compliance and work with recent newlib change

* cygtls.h (strerror_r_buf): New buffer.
* errno.cc (strerror): Move guts...
(_strerror_r): ...to new function demanded by newlib.
(strerror_r): Don't clobber strerror buffer.
(_user_strerror): Drop unused declaration.
* tlsoffsets.h: Regenerate.
This commit is contained in:
Eric Blake 2011-05-25 18:47:32 +00:00
parent 4805b60ccf
commit 154fa4d7ef
4 changed files with 82 additions and 55 deletions

View File

@ -1,3 +1,12 @@
2011-05-25 Eric Blake <eblake@redhat.com>
* cygtls.h (strerror_r_buf): New buffer.
* errno.cc (strerror): Move guts...
(_strerror_r): ...to new function demanded by newlib.
(strerror_r): Don't clobber strerror buffer.
(_user_strerror): Drop unused declaration.
* tlsoffsets.h: Regenerate.
2011-05-25 Corinna Vinschen <corinna@vinschen.de> 2011-05-25 Corinna Vinschen <corinna@vinschen.de>
* init.cc (dll_entry): Reinstantiate wow64_test_stack_marker and * init.cc (dll_entry): Reinstantiate wow64_test_stack_marker and

View File

@ -110,6 +110,7 @@ struct _local_storage
/* strerror errno.cc */ /* strerror errno.cc */
char strerror_buf[sizeof ("Unknown error -2147483648")]; char strerror_buf[sizeof ("Unknown error -2147483648")];
char strerror_r_buf[sizeof ("Unknown error -2147483648")];
/* times.cc */ /* times.cc */
char timezone_buf[20]; char timezone_buf[20];

View File

@ -360,8 +360,6 @@ seterrno (const char *file, int line)
seterrno_from_win_error (file, line, GetLastError ()); seterrno_from_win_error (file, line, GetLastError ());
} }
extern char *_user_strerror _PARAMS ((int));
static char * static char *
strerror_worker (int errnum) strerror_worker (int errnum)
{ {
@ -373,20 +371,36 @@ strerror_worker (int errnum)
return res; return res;
} }
/* Newlib requires this override for perror and friends to avoid
clobbering strerror() buffer, without having to differentiate
between strerror_r signatures. This function is intentionally not
exported, so that only newlib can use it. */
extern "C" char *
_strerror_r (struct _reent *, int errnum, int internal, int *errptr)
{
char *errstr = strerror_worker (errnum);
if (!errstr)
{
errstr = internal ? _my_tls.locals.strerror_r_buf
: _my_tls.locals.strerror_buf;
__small_sprintf (errstr, "Unknown error %d", errnum);
if (errptr)
*errptr = EINVAL;
}
return errstr;
}
/* strerror: convert from errno values to error strings. Newlib's /* strerror: convert from errno values to error strings. Newlib's
strerror_r returns "" for unknown values, so we override it to strerror_r returns "" for unknown values, so we override it to
provide a nicer thread-safe result string and set errno. */ provide a nicer thread-safe result string and set errno. */
extern "C" char * extern "C" char *
strerror (int errnum) strerror (int errnum)
{ {
char *errstr = strerror_worker (errnum); int error = 0;
if (!errstr) char *result = _strerror_r (NULL, errnum, 0, &error);
{ if (error)
__small_sprintf (errstr = _my_tls.locals.strerror_buf, "Unknown error %d", set_errno (error);
errnum); return result;
errno = _impure_ptr->_errno = EINVAL;
}
return errstr;
} }
/* Newlib's <string.h> provides declarations for two strerror_r /* Newlib's <string.h> provides declarations for two strerror_r
@ -396,10 +410,13 @@ strerror (int errnum)
extern "C" char * extern "C" char *
strerror_r (int errnum, char *buf, size_t n) strerror_r (int errnum, char *buf, size_t n)
{ {
char *error = strerror (errnum); int error = 0;
if (strlen (error) >= n) char *errstr = _strerror_r (NULL, errnum, 1, &error);
return error; if (error)
return strcpy (buf, error); set_errno (error);
if (strlen (errstr) >= n)
return errstr;
return strcpy (buf, errstr);
} }
extern "C" int extern "C" int

View File

@ -1,6 +1,6 @@
//;# autogenerated: Do not edit. //;# autogenerated: Do not edit.
//; $tls::sizeof__cygtls = 3984; //; $tls::sizeof__cygtls = 4012;
//; $tls::func = -12700; //; $tls::func = -12700;
//; $tls::pfunc = 0; //; $tls::pfunc = 0;
//; $tls::saved_errno = -12696; //; $tls::saved_errno = -12696;
@ -37,26 +37,26 @@
//; $tls::p__dontuse = 412; //; $tls::p__dontuse = 412;
//; $tls::locals = -11200; //; $tls::locals = -11200;
//; $tls::plocals = 1500; //; $tls::plocals = 1500;
//; $tls::_ctinfo = -9800; //; $tls::_ctinfo = -9772;
//; $tls::p_ctinfo = 2900; //; $tls::p_ctinfo = 2928;
//; $tls::andreas = -9796; //; $tls::andreas = -9768;
//; $tls::pandreas = 2904; //; $tls::pandreas = 2932;
//; $tls::wq = -9792; //; $tls::wq = -9764;
//; $tls::pwq = 2908; //; $tls::pwq = 2936;
//; $tls::sig = -9764; //; $tls::sig = -9736;
//; $tls::psig = 2936; //; $tls::psig = 2964;
//; $tls::incyg = -9760; //; $tls::incyg = -9732;
//; $tls::pincyg = 2940; //; $tls::pincyg = 2968;
//; $tls::spinning = -9756; //; $tls::spinning = -9728;
//; $tls::pspinning = 2944; //; $tls::pspinning = 2972;
//; $tls::stacklock = -9752; //; $tls::stacklock = -9724;
//; $tls::pstacklock = 2948; //; $tls::pstacklock = 2976;
//; $tls::stackptr = -9748; //; $tls::stackptr = -9720;
//; $tls::pstackptr = 2952; //; $tls::pstackptr = 2980;
//; $tls::stack = -9744; //; $tls::stack = -9716;
//; $tls::pstack = 2956; //; $tls::pstack = 2984;
//; $tls::initialized = -8720; //; $tls::initialized = -8692;
//; $tls::pinitialized = 3980; //; $tls::pinitialized = 4008;
//; __DATA__ //; __DATA__
#define tls_func (-12700) #define tls_func (-12700)
@ -95,23 +95,23 @@
#define tls_p__dontuse (412) #define tls_p__dontuse (412)
#define tls_locals (-11200) #define tls_locals (-11200)
#define tls_plocals (1500) #define tls_plocals (1500)
#define tls__ctinfo (-9800) #define tls__ctinfo (-9772)
#define tls_p_ctinfo (2900) #define tls_p_ctinfo (2928)
#define tls_andreas (-9796) #define tls_andreas (-9768)
#define tls_pandreas (2904) #define tls_pandreas (2932)
#define tls_wq (-9792) #define tls_wq (-9764)
#define tls_pwq (2908) #define tls_pwq (2936)
#define tls_sig (-9764) #define tls_sig (-9736)
#define tls_psig (2936) #define tls_psig (2964)
#define tls_incyg (-9760) #define tls_incyg (-9732)
#define tls_pincyg (2940) #define tls_pincyg (2968)
#define tls_spinning (-9756) #define tls_spinning (-9728)
#define tls_pspinning (2944) #define tls_pspinning (2972)
#define tls_stacklock (-9752) #define tls_stacklock (-9724)
#define tls_pstacklock (2948) #define tls_pstacklock (2976)
#define tls_stackptr (-9748) #define tls_stackptr (-9720)
#define tls_pstackptr (2952) #define tls_pstackptr (2980)
#define tls_stack (-9744) #define tls_stack (-9716)
#define tls_pstack (2956) #define tls_pstack (2984)
#define tls_initialized (-8720) #define tls_initialized (-8692)
#define tls_pinitialized (3980) #define tls_pinitialized (4008)