[PATCH 06/13] string: Implement strerror in terms of strerror_l
Adhemerval Zanella
adhemerval.zanella@linaro.org
Mon Jun 1 18:28:36 GMT 2020
On 28/05/2020 08:41, Florian Weimer wrote:
>> diff --git a/string/strerror.c b/string/strerror.c
>> index 283ab70f91..35c749016e 100644
>> --- a/string/strerror.c
>> +++ b/string/strerror.c
>> @@ -15,29 +15,11 @@
>> License along with the GNU C Library; if not, see
>> <https://www.gnu.org/licenses/>. */
>>
>> -#include <libintl.h>
>> -#include <stdio.h>
>> #include <string.h>
>> -#include <errno.h>
>> -
>> -/* Return a string describing the errno code in ERRNUM.
>> - The storage is good only until the next call to strerror.
>> - Writing to the storage causes undefined behavior. */
>> -libc_freeres_ptr (static char *buf);
>> +#include <locale/localeinfo.h>
>>
>> char *
>> strerror (int errnum)
>> {
>> - char *ret = __strerror_r (errnum, NULL, 0);
>> - int saved_errno;
>> -
>> - if (__glibc_likely (ret != NULL))
>> - return ret;
>> - saved_errno = errno;
>> - if (buf == NULL)
>> - buf = malloc (1024);
>> - __set_errno (saved_errno);
>> - if (buf == NULL)
>> - return _("Unknown error");
>> - return __strerror_r (errnum, buf, 1024);
>> + return __strerror_l (errnum, __libc_tsd_get (locale_t, LOCALE));
>> }
>
> Why is it okay to share the buffer between strerror and strerror_l?
> POSIX is a bit unclear about this. Practically speaking, it should be
> okay. But perhaps there should be a NEWS entry.
POSIX states the strerror buffer *might* be overwritten by a subsequent
call to strerror *or* strerror_l (as an extension to the ISO C). So my
understanding is an implementation has the freedom to implement strerror
on top of strerror_l and share its internal buffer (bionic and musl seem
to share this understanding was well).
What about add this NEWS entry at deprecated and removed features:
* Both strerror and strerror_l now share the same internal buffer, meaning
that the returned string pointer might be invalidated or contents might
be overwritten in subsequent calls of any symbol.
>
> Thanks,
> Florian
>
More information about the Libc-alpha
mailing list