Skip to content

Commit 14953d4

Browse files
authored
fix locale, C --> C.UTF8
Signed-off-by: Hasan ÇALIŞIR <hasan.calisir@psauxit.com>
1 parent 99dfd5b commit 14953d4

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

safexec/safexec.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
#include <grp.h>
104104
#include <sys/types.h>
105105
#include <sys/stat.h>
106+
#include <locale.h>
106107

107108
#ifdef __linux__
108109
#include <sys/prctl.h>
@@ -932,11 +933,34 @@ static int is_all_digits(const char *s) {
932933
return 1;
933934
}
934935

936+
/* Try C.UTF-8 → en_US.UTF-8 → C, and keep env consistent. */
937+
static void set_locale_utf8_best_effort(void) {
938+
/* Try C.UTF-8 first (works on modern glibc & musl/Alpine) */
939+
if (setlocale(LC_CTYPE, "C.UTF-8")) {
940+
setenv("LANG", "C.UTF-8", 1);
941+
setenv("LC_CTYPE", "C.UTF-8", 1);
942+
setenv("CHARSET", "UTF-8", 1); /* helps BusyBox wget */
943+
return;
944+
}
945+
/* Fallback for older glibc (e.g., CentOS 7) */
946+
if (setlocale(LC_CTYPE, "en_US.UTF-8")) {
947+
setenv("LANG", "en_US.UTF-8", 1);
948+
setenv("LC_CTYPE", "en_US.UTF-8", 1);
949+
setenv("CHARSET", "UTF-8", 1);
950+
return;
951+
}
952+
/* Last resort: plain C (ASCII). Still deterministic. */
953+
setlocale(LC_CTYPE, "C");
954+
setenv("LANG", "C", 1);
955+
setenv("LC_CTYPE", "C", 1);
956+
setenv("CHARSET", "ASCII", 1);
957+
}
958+
935959
// Sanitize environment & process state early
936960
static void sanitize_process_early(void) {
937961
clearenv_portable();
938962
setenv("PATH", "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/run/current-system/sw/bin", 1);
939-
setenv("LANG", "C", 1);
963+
set_locale_utf8_best_effort();
940964
umask(077);
941965
#ifdef __linux__
942966
(void)prctl(PR_SET_DUMPABLE, 0, 0, 0, 0);

0 commit comments

Comments
 (0)