[PATCH] localedata: Avoid concurrently written locales in gen-locale.sh
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Wed Jul 8 12:14:14 GMT 2026
On 08/07/26 09:03, Florian Weimer wrote:
> 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.
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>
> ---
> 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.
> + # 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=$?
> + if [ $ret -eq 0 ] ; then
> + # Ignore errors in case some other process has created the same locale.
> + # (Some versions of mv do not report an error here.)
How common it these versions?
> + mv -Tn $stage ${common_objpfx}localedata/$out 2>/dev/null || true
> + rm -rf $stage
> else
> + rm -rf $stage
> echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \
> "Outputdir: \"${out}\" failed"
> exit 1
>
More information about the Libc-alpha
mailing list