diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-04-24 21:25:31 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-07-07 14:10:58 -0300 |
commit | f13d260190d47bd38c0ae939080001e7bb58bd04 (patch) | |
tree | b64784f84e80dd326419c079852b1988d84ae8e5 /string | |
parent | b1ccfc061feee9ce616444ded8e1cd5acf9fa97f (diff) | |
download | glibc-f13d260190d47bd38c0ae939080001e7bb58bd04.zip glibc-f13d260190d47bd38c0ae939080001e7bb58bd04.tar.gz glibc-f13d260190d47bd38c0ae939080001e7bb58bd04.tar.bz2 |
signal: Move sys_errlist to a compat symbol
The symbol is deprecated by strerror since its usage imposes some issues
such as copy relocations.
Its internal name is also changed to _sys_errlist_internal to avoid
static linking usage. The compat code is also refactored by removing
the over enginered errlist-compat.c generation from manual entried and
extra comment token in linker script file. It disantangle the code
generation from manual and simplify both Linux and Hurd compat code.
The definitions from errlist.c are moved to errlist.h and a new test
is added to avoid a new errno entry without an associated one in manual.
Checked on x86_64-linux-gnu and i686-linux-gnu. I also run a check-abi
on all affected platforms.
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'string')
-rw-r--r-- | string/_strerror.c | 6 | ||||
-rw-r--r-- | string/strerror_l.c | 8 | ||||
-rw-r--r-- | string/xpg-strerror.c | 9 |
3 files changed, 7 insertions, 16 deletions
diff --git a/string/_strerror.c b/string/_strerror.c index af6be56..01226e3 100644 --- a/string/_strerror.c +++ b/string/_strerror.c @@ -36,8 +36,8 @@ char * __strerror_r (int errnum, char *buf, size_t buflen) { - if (__builtin_expect (errnum < 0 || errnum >= _sys_nerr_internal - || _sys_errlist_internal[errnum] == NULL, 0)) + char *err = (char *) __get_errlist (errnum); + if (__glibc_unlikely (err == NULL)) { /* Buffer we use to print the number in. For a maximum size for `int' of 8 bytes we never need more than 20 digits. */ @@ -68,7 +68,7 @@ __strerror_r (int errnum, char *buf, size_t buflen) return buf; } - return (char *) _(_sys_errlist_internal[errnum]); + return _(err); } weak_alias (__strerror_r, strerror_r) libc_hidden_def (__strerror_r) diff --git a/string/strerror_l.c b/string/strerror_l.c index c8c3d4a..309f42e 100644 --- a/string/strerror_l.c +++ b/string/strerror_l.c @@ -40,10 +40,8 @@ translate (const char *str, locale_t loc) char * strerror_l (int errnum, locale_t loc) { - - - if (__builtin_expect (errnum < 0 || errnum >= _sys_nerr_internal - || _sys_errlist_internal[errnum] == NULL, 0)) + char *err = (char *) __get_errlist (errnum); + if (__glibc_unlikely (err == NULL)) { free (last_value); if (__asprintf (&last_value, "%s%d", @@ -53,7 +51,7 @@ strerror_l (int errnum, locale_t loc) return last_value; } - return (char *) translate (_sys_errlist_internal[errnum], loc); + return (char *) translate (err, loc); } void diff --git a/string/xpg-strerror.c b/string/xpg-strerror.c index 5290b63..95311b7 100644 --- a/string/xpg-strerror.c +++ b/string/xpg-strerror.c @@ -32,16 +32,9 @@ __xpg_strerror_r (int errnum, char *buf, size_t buflen) string) if errnum is invalid, otherwise it returns a string whose storage has indefinite extent. */ if (estr == buf) - { - assert (errnum < 0 || errnum >= _sys_nerr_internal - || _sys_errlist_internal[errnum] == NULL); - return EINVAL; - } + return EINVAL; else { - assert (errnum >= 0 && errnum < _sys_nerr_internal - && _sys_errlist_internal[errnum] != NULL); - size_t estrlen = strlen (estr); /* Terminate the string in any case. */ |