python-utils-r1.eclass: python_export_utf8_locale(), ensure sane locale
authorMichał Górny <mgorny@gentoo.org>
Sun, 15 Nov 2015 09:20:22 +0000 (10:20 +0100)
committerMichał Górny <mgorny@gentoo.org>
Sat, 28 Nov 2015 19:09:06 +0000 (20:09 +0100)
Ensure that the locale selected by python_export_utf8_locale() conforms
to POSIX-ish case conversions. Otherwise, we may accidentally force
a locale that will break random ebuilds and programs.

eclass/python-utils-r1.eclass

index 6ff1dd17bab2fc4cd5f22d23c05b2dce1473eb60..5e3338f35b539b3db3a48d28afba25ad866bd8ea 100644 (file)
@@ -1141,6 +1141,24 @@ python_fix_shebang() {
        done
 }
 
+# @FUNCTION: _python_check_locale_sanity
+# @USAGE: <locale>
+# @RETURN: 0 if sane, 1 otherwise
+# @DESCRIPTION:
+# Check whether the specified locale sanely maps between lowercase
+# and uppercase ASCII characters.
+_python_check_locale_sanity() {
+       local -x LC_CTYPE=${1}
+       local IFS=
+
+       local lc=( {a..z} )
+       local uc=( {A..Z} )
+       local input=${lc[*]}${uc[*]}
+
+       local output=$(tr '[:lower:][:upper:]' '[:upper:][:lower:]' <<<"${input}")
+       [[ ${output} == "${uc[*]}${lc[*]}" ]]
+}
+
 # @FUNCTION: python_export_utf8_locale
 # @RETURN: 0 on success, 1 on failure.
 # @DESCRIPTION:
@@ -1165,8 +1183,10 @@ python_export_utf8_locale() {
 
                for lang in ${locales}; do
                        if [[ $(LC_CTYPE=${lang} locale charmap 2>/dev/null) == UTF-8 ]]; then
-                               export LC_CTYPE=${lang}
-                               return 0
+                               if _python_check_locale_sanity "${lang}"; then
+                                       export LC_CTYPE=${lang}
+                                       return 0
+                               fi
                        fi  
                done