[PATCH] localedata: Avoid concurrently written locales in gen-locale.sh
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Wed Jul 8 12:25:21 GMT 2026
On 08/07/26 09:18, Sam James wrote:
> Florian Weimer <fweimer@redhat.com> writes:
>
>> There is no cross-directory exclusion of concurrent $(gen-locales)
>> usage. Parallel localedef calls can clobber locale data as it is
>> being loaded by tests.
>>
>> With --no-hard-links, the separate touch invocation is no longer
>> required.
>>
>> ---
>> localedata/gen-locale.sh | 22 +++++++++++++++-------
>> 1 file changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/localedata/gen-locale.sh b/localedata/gen-locale.sh
>> index 4762c04284..b0ce27fbae 100644
>> --- a/localedata/gen-locale.sh
>> +++ b/localedata/gen-locale.sh
>> @@ -32,15 +32,23 @@ generate_locale ()
>> out=$3
>> flags=$4
>> ret=0
>> +
>> + # Use a staging area to avoid writing to locales concurrently.
>> + # While this process is running, $$ is sufficiently unique.
>
> Yes, this should be OK.
>
>> + # Use --no-hard-links to prevent localedef from accessing
>> + # other staging areas.
>> + stage="${common_objpfx}localedata/gen-locale.$$.tmp"
>> +
>> ${localedef_before_env} ${run_program_env} I18NPATH=../localedata \
>> - ${localedef_after_env} $flags -f $charmap -i $input \
>> - ${common_objpfx}localedata/$out || ret=$?
>> - if [ $ret -eq 0 ]; then
>> - # The makefile checks the timestamp of the LC_CTYPE file,
>> - # but localedef won't have touched it if it was able to
>> - # hard-link it to an existing file.
>> - touch ${common_objpfx}localedata/$out/LC_CTYPE
>> + ${localedef_after_env} $flags --no-hard-links -f $charmap -i $input \
>> + $stage || ret=$?
>
> This could be improved to directly test the command but it can be done
> later, no need to do it now.
Agree, I think we should fix for the release and this approach seems ok.
>
>> + if [ $ret -eq 0 ] ; then
>> + # Ignore errors in case some other process has created the same
>> locale.
>
> OK.
>
>> + # (Some versions of mv do not report an error here.)
>> + mv -Tn $stage ${common_objpfx}localedata/$out 2>/dev/null || true
>
> I'm sorry to ask this, but is mv -T sufficiently portable? It's not
> POSIX but I don't recall if we require any extensions for coreutils
> elsewhere in glibc.
Hum I was not aware of that, maybe we can adjust it after the release if
required.
>
>> + rm -rf $stage
>> else
>> + rm -rf $stage
>> echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
>> "Outputdir: \"${out}\" failed"
>> exit 1
>
> The patch otherwise looks good, but please wait a brief period for
> Adhemerval to comment before committing.
Looks good to me. Just curious Florian, how did you notice this issue?
More information about the Libc-alpha
mailing list