* A minor fix in nl-langinfo
@ 2014-08-09 14:19 Eli Zaretskii
2014-08-10 14:22 ` Eli Zaretskii
0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2014-08-09 14:19 UTC (permalink / raw)
To: guile-devel
This was in my sources for some time, but I somehow failed to send it.
The problem is that nl_langinfo can return pointers to static buffers
that are overwritten on subsequent calls. So we need to usher the
value away before the next call.
--- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
+++ libguile/i18n.c 2014-08-09 13:04:19.901125000 +0300
@@ -1522,6 +1522,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
else
{
c_result = nl_langinfo (c_item);
+ if (c_result != NULL)
+ c_result = strdup (c_result);
codeset = nl_langinfo (CODESET);
restore_locale_settings (&lsec_prev_locale);
@@ -1532,12 +1534,11 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
else
{
c_result = nl_langinfo (c_item);
+ if (c_result != NULL)
+ c_result = strdup (c_result);
codeset = nl_langinfo (CODESET);
}
- if (c_result != NULL)
- c_result = strdup (c_result);
-
unlock_locale_mutex ();
if (c_result == NULL)
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: A minor fix in nl-langinfo
2014-08-09 14:19 A minor fix in nl-langinfo Eli Zaretskii
@ 2014-08-10 14:22 ` Eli Zaretskii
2014-08-12 20:15 ` Ludovic Courtès
0 siblings, 1 reply; 6+ messages in thread
From: Eli Zaretskii @ 2014-08-10 14:22 UTC (permalink / raw)
To: guile-devel
> Date: Sat, 09 Aug 2014 17:19:03 +0300
> From: Eli Zaretskii <eliz@gnu.org>
>
> This was in my sources for some time, but I somehow failed to send it.
>
> The problem is that nl_langinfo can return pointers to static buffers
> that are overwritten on subsequent calls. So we need to usher the
> value away before the next call.
>
> --- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
> +++ libguile/i18n.c 2014-08-09 13:04:19.901125000 +0300
Sorry, that missed one more instance. Please use this patch instead.
--- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
+++ libguile/i18n.c 2014-08-10 17:20:52.073000000 +0300
@@ -1497,6 +1497,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
{
#ifdef USE_GNU_LOCALE_API
c_result = nl_langinfo_l (c_item, c_locale);
+ if (c_result != NULL)
+ c_result = strdup (c_result);
codeset = nl_langinfo_l (CODESET, c_locale);
#else /* !USE_GNU_LOCALE_API */
/* We can't use `RUN_IN_LOCALE_SECTION ()' here because the locale
@@ -1522,6 +1524,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
else
{
c_result = nl_langinfo (c_item);
+ if (c_result != NULL)
+ c_result = strdup (c_result);
codeset = nl_langinfo (CODESET);
restore_locale_settings (&lsec_prev_locale);
@@ -1532,12 +1536,11 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
else
{
c_result = nl_langinfo (c_item);
+ if (c_result != NULL)
+ c_result = strdup (c_result);
codeset = nl_langinfo (CODESET);
}
- if (c_result != NULL)
- c_result = strdup (c_result);
-
unlock_locale_mutex ();
if (c_result == NULL)
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: A minor fix in nl-langinfo
2014-08-10 14:22 ` Eli Zaretskii
@ 2014-08-12 20:15 ` Ludovic Courtès
2014-08-12 21:34 ` Mark H Weaver
0 siblings, 1 reply; 6+ messages in thread
From: Ludovic Courtès @ 2014-08-12 20:15 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: guile-devel
Eli Zaretskii <eliz@gnu.org> skribis:
> Sorry, that missed one more instance. Please use this patch instead.
>
> --- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
> +++ libguile/i18n.c 2014-08-10 17:20:52.073000000 +0300
> @@ -1497,6 +1497,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
> {
> #ifdef USE_GNU_LOCALE_API
> c_result = nl_langinfo_l (c_item, c_locale);
> + if (c_result != NULL)
> + c_result = strdup (c_result);
> codeset = nl_langinfo_l (CODESET, c_locale);
> #else /* !USE_GNU_LOCALE_API */
> /* We can't use `RUN_IN_LOCALE_SECTION ()' here because the locale
> @@ -1522,6 +1524,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
> else
> {
> c_result = nl_langinfo (c_item);
> + if (c_result != NULL)
> + c_result = strdup (c_result);
> codeset = nl_langinfo (CODESET);
>
> restore_locale_settings (&lsec_prev_locale);
> @@ -1532,12 +1536,11 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
> else
> {
> c_result = nl_langinfo (c_item);
> + if (c_result != NULL)
> + c_result = strdup (c_result);
> codeset = nl_langinfo (CODESET);
> }
>
> - if (c_result != NULL)
> - c_result = strdup (c_result);
> -
> unlock_locale_mutex ();
>
> if (c_result == NULL)
Makes sense, please push.
Thanks,
Ludo’.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: A minor fix in nl-langinfo
2014-08-12 20:15 ` Ludovic Courtès
@ 2014-08-12 21:34 ` Mark H Weaver
2014-08-13 17:22 ` Mark H Weaver
0 siblings, 1 reply; 6+ messages in thread
From: Mark H Weaver @ 2014-08-12 21:34 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: guile-devel
ludo@gnu.org (Ludovic Courtès) writes:
> Eli Zaretskii <eliz@gnu.org> skribis:
>
>> Sorry, that missed one more instance. Please use this patch instead.
>>
>> --- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
>> +++ libguile/i18n.c 2014-08-10 17:20:52.073000000 +0300
>> @@ -1497,6 +1497,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
>> {
>> #ifdef USE_GNU_LOCALE_API
>> c_result = nl_langinfo_l (c_item, c_locale);
>> + if (c_result != NULL)
>> + c_result = strdup (c_result);
>> codeset = nl_langinfo_l (CODESET, c_locale);
>> #else /* !USE_GNU_LOCALE_API */
>> /* We can't use `RUN_IN_LOCALE_SECTION ()' here because the locale
>> @@ -1522,6 +1524,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
>> else
>> {
>> c_result = nl_langinfo (c_item);
>> + if (c_result != NULL)
>> + c_result = strdup (c_result);
>> codeset = nl_langinfo (CODESET);
>>
>> restore_locale_settings (&lsec_prev_locale);
>> @@ -1532,12 +1536,11 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
>> else
>> {
>> c_result = nl_langinfo (c_item);
>> + if (c_result != NULL)
>> + c_result = strdup (c_result);
>> codeset = nl_langinfo (CODESET);
>> }
>>
>> - if (c_result != NULL)
>> - c_result = strdup (c_result);
>> -
>> unlock_locale_mutex ();
>>
>> if (c_result == NULL)
>
> Makes sense, please push.
Actually, please hold off on this. It doesn't entirely fix the
problems, and I'm working on a more complete fix.
Thanks,
Mark
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: A minor fix in nl-langinfo
2014-08-12 21:34 ` Mark H Weaver
@ 2014-08-13 17:22 ` Mark H Weaver
2014-08-13 19:35 ` Ludovic Courtès
0 siblings, 1 reply; 6+ messages in thread
From: Mark H Weaver @ 2014-08-13 17:22 UTC (permalink / raw)
To: Ludovic Courtès; +Cc: guile-devel
Mark H Weaver <mhw@netris.org> writes:
> ludo@gnu.org (Ludovic Courtès) writes:
>
>> Eli Zaretskii <eliz@gnu.org> skribis:
>>
>>> Sorry, that missed one more instance. Please use this patch instead.
>>>
>>> --- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
>>> +++ libguile/i18n.c 2014-08-10 17:20:52.073000000 +0300
>>> @@ -1497,6 +1497,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
>>> {
>>> #ifdef USE_GNU_LOCALE_API
>>> c_result = nl_langinfo_l (c_item, c_locale);
>>> + if (c_result != NULL)
>>> + c_result = strdup (c_result);
>>> codeset = nl_langinfo_l (CODESET, c_locale);
So, I think we have to copy 'codeset' also, because it is not used until
after the locale mutex is released, at which point another thread could
call 'nl_langinfo*' and overwrite the static buffer that 'codeset'
points to.
Here's the patch I had in mind. What do you think?
Mark
--8<---------------cut here---------------start------------->8---
diff --git a/libguile/i18n.c b/libguile/i18n.c
index e38e560..411f38a 100644
--- a/libguile/i18n.c
+++ b/libguile/i18n.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+/* Copyright (C) 2006-2014 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -1465,6 +1465,13 @@ SCM_DEFINE (scm_locale_string_to_inexact, "locale-string->inexact",
Note: We don't use Gnulib's `nl_langinfo' module because it's currently not
as complete as the compatibility hacks in `i18n.scm'. */
+static char *
+copy_string_or_null (char *s)
+{
+ if (s != NULL)
+ s = strdup (s);
+ return s;
+}
SCM_DEFINE (scm_nl_langinfo, "nl-langinfo", 1, 1, 0,
(SCM item, SCM locale),
@@ -1496,8 +1503,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinfo", 1, 1, 0,
if (c_locale != NULL)
{
#ifdef USE_GNU_LOCALE_API
- c_result = nl_langinfo_l (c_item, c_locale);
- codeset = nl_langinfo_l (CODESET, c_locale);
+ c_result = copy_string_or_null (nl_langinfo_l (c_item, c_locale));
+ codeset = copy_string_or_null (nl_langinfo_l (CODESET, c_locale));
#else /* !USE_GNU_LOCALE_API */
/* We can't use `RUN_IN_LOCALE_SECTION ()' here because the locale
mutex is already taken. */
@@ -1521,8 +1528,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinfo", 1, 1, 0,
scm_locale_error (FUNC_NAME, lsec_err);
else
{
- c_result = nl_langinfo (c_item);
- codeset = nl_langinfo (CODESET);
+ c_result = copy_string_or_null (nl_langinfo (c_item));
+ codeset = copy_string_or_null (nl_langinfo (CODESET));
restore_locale_settings (&lsec_prev_locale);
free_locale_settings (&lsec_prev_locale);
@@ -1531,13 +1538,10 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinfo", 1, 1, 0,
}
else
{
- c_result = nl_langinfo (c_item);
- codeset = nl_langinfo (CODESET);
+ c_result = copy_string_or_null (nl_langinfo (c_item));
+ codeset = copy_string_or_null (nl_langinfo (CODESET));
}
- if (c_result != NULL)
- c_result = strdup (c_result);
-
unlock_locale_mutex ();
if (c_result == NULL)
@@ -1669,6 +1673,9 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinfo", 1, 1, 0,
}
}
+ if (codeset != NULL)
+ free (codeset);
+
return result;
}
#undef FUNC_NAME
--8<---------------cut here---------------end--------------->8---
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: A minor fix in nl-langinfo
2014-08-13 17:22 ` Mark H Weaver
@ 2014-08-13 19:35 ` Ludovic Courtès
0 siblings, 0 replies; 6+ messages in thread
From: Ludovic Courtès @ 2014-08-13 19:35 UTC (permalink / raw)
To: Mark H Weaver; +Cc: guile-devel
Mark H Weaver <mhw@netris.org> skribis:
> Mark H Weaver <mhw@netris.org> writes:
>
>> ludo@gnu.org (Ludovic Courtès) writes:
>>
>>> Eli Zaretskii <eliz@gnu.org> skribis:
>>>
>>>> Sorry, that missed one more instance. Please use this patch instead.
>>>>
>>>> --- libguile/i18n.c~0 2014-08-08 17:05:57.262034100 +0300
>>>> +++ libguile/i18n.c 2014-08-10 17:20:52.073000000 +0300
>>>> @@ -1497,6 +1497,8 @@ SCM_DEFINE (scm_nl_langinfo, "nl-langinf
>>>> {
>>>> #ifdef USE_GNU_LOCALE_API
>>>> c_result = nl_langinfo_l (c_item, c_locale);
>>>> + if (c_result != NULL)
>>>> + c_result = strdup (c_result);
>>>> codeset = nl_langinfo_l (CODESET, c_locale);
>
> So, I think we have to copy 'codeset' also, because it is not used until
> after the locale mutex is released, at which point another thread could
> call 'nl_langinfo*' and overwrite the static buffer that 'codeset'
> points to.
Indeed.
> +static char *
> +copy_string_or_null (char *s)
const char *s
Fine with me!
Ludo’.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-08-13 19:35 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-09 14:19 A minor fix in nl-langinfo Eli Zaretskii
2014-08-10 14:22 ` Eli Zaretskii
2014-08-12 20:15 ` Ludovic Courtès
2014-08-12 21:34 ` Mark H Weaver
2014-08-13 17:22 ` Mark H Weaver
2014-08-13 19:35 ` Ludovic Courtès
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).