From: Florian Weimer Date: Wed, 8 Jul 2026 15:38:42 +0000 (+0200) Subject: localedata: Avoid concurrently written locales in gen-locale.sh X-Git-Tag: glibc-2.44~49 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=20b13fa08b2831ee67fcc92edf2d89288bcc2c93;p=thirdparty%2Fglibc.git localedata: Avoid concurrently written locales in gen-locale.sh 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 the separate staging areas, there are no peer directories, so hard-linking no longer happens. The touch command is therefore unnecessary. Reviewed-by: Sam James --- diff --git a/localedata/gen-locale.sh b/localedata/gen-locale.sh index 4762c04284..c449efe125 100644 --- a/localedata/gen-locale.sh +++ b/localedata/gen-locale.sh @@ -32,17 +32,25 @@ 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. + stage="${common_objpfx}localedata/gen-locale.$$.tmp" + mkdir "$stage" 2>/dev/null || true + ${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 + $stage/$out || ret=$? + if [ $ret -eq 0 ] ; then + # Ignore errors in case some other process has created the same locale. + # This rename operation should be atomic, and it should fail if the + # $out locale already exists (rename fails with ENOTEMPTY). + mv $stage/$out ${common_objpfx}localedata/. 2>/dev/null || true + rm -rf $stage else + rm -rf $stage echo "Charmap: \"${charmap}\" Inputfile: \"${input}\"" \ - "Outputdir: \"${out}\" failed" + "Outputdir: \"${out}\" failed (exit status $ret)" exit 1 fi }