enter_chroot: sanity check locale settings

If people have a misconfigured environment, detect & abort early
rather than fail randomly/mysteriously later on.  We require a
valid UTF-8 compatible locale in order to work.

BUG=chromium:1052082
TEST=CQ passes
TEST=`LANG=C cros_sdk` aborts

Change-Id: I1f331bfbc4031d4178cadaa6d70a8017e1271cde
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosutils/+/2137986
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
diff --git a/sdk_lib/enter_chroot.sh b/sdk_lib/enter_chroot.sh
index de0cecf..0b93ad8 100755
--- a/sdk_lib/enter_chroot.sh
+++ b/sdk_lib/enter_chroot.sh
@@ -249,6 +249,34 @@
   fi
 }
 
+# Sanity check the user's environment locale settings.
+check_locale() {
+  if [[ "$(locale -k charmap)" != 'charmap="UTF-8"' ]]; then
+    error "Your locale appears to not support UTF-8 which is required."
+    error "The output from 'locale':"
+    locale
+    error "The output from 'locale -k LC_CTYPE':"
+    locale -k LC_CTYPE
+    error "The language env vars:"
+    env | grep -E '^(LC_|LANG)'
+    if [[ -n "${LC_ALL}" ]]; then
+      error "Never set LC_ALL (=${LC_ALL}) in your environment; only set LANG."
+    fi
+    die_notrace "Please fix your locale settings by setting LANG to UTF-8" \
+      "compatible locale and removing any LC_ variable settings."
+  fi
+
+  # C.UTF8 is not standard currently unfortunately.
+  local var
+  for var in LANG LC_ALL LC_CTYPE; do
+    if [[ "${!var}" == "C.UTF-8" ]]; then
+      error "Sorry, but C.UTF-8 is not currently supported."
+      locale
+      die_notrace "Please use a different locale when building CrOS."
+    fi
+  done
+}
+
 generate_locales() {
   # Make sure user's requested locales are available
   # http://crosbug.com/19139
@@ -673,6 +701,7 @@
   ) 200>>"$LOCKFILE" || die "setup_env failed"
 }
 
+check_locale
 setup_env
 
 CHROOT_PASSTHRU=(