summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/charset/charset.h1
-rw-r--r--lib/util/charset/codepoints.c26
-rw-r--r--nsswitch/wins.c2
-rw-r--r--source3/lib/charcnv.c2
-rw-r--r--source3/lib/netapi/netapi.c2
-rw-r--r--source3/libsmb/libsmb_context.c2
-rw-r--r--source3/pam_smbpass/pam_smb_acct.c2
-rw-r--r--source3/pam_smbpass/pam_smb_auth.c2
-rw-r--r--source3/pam_smbpass/pam_smb_passwd.c2
9 files changed, 31 insertions, 10 deletions
diff --git a/lib/util/charset/charset.h b/lib/util/charset/charset.h
index b4a5a55461..474d77e54e 100644
--- a/lib/util/charset/charset.h
+++ b/lib/util/charset/charset.h
@@ -223,6 +223,7 @@ smb_iconv_t smb_iconv_open_ex(TALLOC_CTX *mem_ctx, const char *tocode,
const char *fromcode, bool native_iconv);
void load_case_tables(void);
+void load_case_tables_library(void);
bool smb_register_charset(const struct charset_functions *funcs_in);
/*
diff --git a/lib/util/charset/codepoints.c b/lib/util/charset/codepoints.c
index 01183e4ad4..5ee95a8af5 100644
--- a/lib/util/charset/codepoints.c
+++ b/lib/util/charset/codepoints.c
@@ -42,8 +42,10 @@ static void *lowcase_table;
/*******************************************************************
load the case handling tables
+
+This is the function that should be called from library code.
********************************************************************/
-void load_case_tables(void)
+void load_case_tables_library(void)
{
TALLOC_CTX *mem_ctx;
@@ -64,6 +66,24 @@ void load_case_tables(void)
}
}
+/*******************************************************************
+load the case handling tables
+
+This MUST only be called from main() in application code, never from a
+library. We don't know if the calling program has already done
+setlocale() to another value, and can't tell if they have.
+********************************************************************/
+void load_case_tables(void)
+{
+ /* This is a useful global hook where we can ensure that the
+ * locale is set from the environment. This is needed so that
+ * we can use LOCALE as a codepage */
+#ifdef HAVE_SETLOCALE
+ setlocale(LC_ALL, "");
+#endif
+ load_case_tables_library();
+}
+
/**
Convert a codepoint_t to upper case.
**/
@@ -73,7 +93,7 @@ _PUBLIC_ codepoint_t toupper_m(codepoint_t val)
return toupper(val);
}
if (upcase_table == NULL) {
- load_case_tables();
+ load_case_tables_library();
}
if (upcase_table == (void *)-1) {
return val;
@@ -93,7 +113,7 @@ _PUBLIC_ codepoint_t tolower_m(codepoint_t val)
return tolower(val);
}
if (lowcase_table == NULL) {
- load_case_tables();
+ load_case_tables_library();
}
if (lowcase_table == (void *)-1) {
return val;
diff --git a/nsswitch/wins.c b/nsswitch/wins.c
index eba27bc287..5136c94c76 100644
--- a/nsswitch/wins.c
+++ b/nsswitch/wins.c
@@ -48,7 +48,7 @@ NSS_STATUS _nss_wins_gethostbyname2_r(const char *name, int af, struct hostent *
static void nss_wins_init(void)
{
initialised = 1;
- load_case_tables();
+ load_case_tables_library();
lp_set_cmdline("log level", "0");
TimeInit();
diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c
index 2723599599..6f1ced69d0 100644
--- a/source3/lib/charcnv.c
+++ b/source3/lib/charcnv.c
@@ -51,7 +51,7 @@ static bool initialized;
void lazy_initialize_conv(void)
{
if (!initialized) {
- load_case_tables();
+ load_case_tables_library();
init_iconv();
initialized = true;
}
diff --git a/source3/lib/netapi/netapi.c b/source3/lib/netapi/netapi.c
index 9d76017a01..c04ca70249 100644
--- a/source3/lib/netapi/netapi.c
+++ b/source3/lib/netapi/netapi.c
@@ -68,7 +68,7 @@ NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
frame = talloc_stackframe();
/* Case tables must be loaded before any string comparisons occour */
- load_case_tables();
+ load_case_tables_library();
/* When libnetapi is invoked from an application, it does not
* want to be swamped with level 10 debug messages, even if
diff --git a/source3/libsmb/libsmb_context.c b/source3/libsmb/libsmb_context.c
index ab2db9d3e9..9c8429aab4 100644
--- a/source3/libsmb/libsmb_context.c
+++ b/source3/libsmb/libsmb_context.c
@@ -45,7 +45,7 @@ SMBC_module_init(void * punused)
char *home = NULL;
TALLOC_CTX *frame = talloc_stackframe();
- load_case_tables();
+ load_case_tables_library();
setup_logging("libsmbclient", DEBUG_STDOUT);
diff --git a/source3/pam_smbpass/pam_smb_acct.c b/source3/pam_smbpass/pam_smb_acct.c
index 650d322b35..63323d8d8f 100644
--- a/source3/pam_smbpass/pam_smb_acct.c
+++ b/source3/pam_smbpass/pam_smb_acct.c
@@ -57,7 +57,7 @@ int pam_sm_acct_mgmt( pam_handle_t *pamh, int flags,
void (*oldsig_handler)(int);
/* Samba initialization. */
- load_case_tables();
+ load_case_tables_library();
lp_set_in_client(True);
ctrl = set_ctrl(pamh, flags, argc, argv );
diff --git a/source3/pam_smbpass/pam_smb_auth.c b/source3/pam_smbpass/pam_smb_auth.c
index feb469792d..24702131b4 100644
--- a/source3/pam_smbpass/pam_smb_auth.c
+++ b/source3/pam_smbpass/pam_smb_auth.c
@@ -80,7 +80,7 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags,
char *p = NULL;
/* Samba initialization. */
- load_case_tables();
+ load_case_tables_library();
lp_set_in_client(True);
ctrl = set_ctrl(pamh, flags, argc, argv);
diff --git a/source3/pam_smbpass/pam_smb_passwd.c b/source3/pam_smbpass/pam_smb_passwd.c
index 8fc2cf3e14..54d9db7f31 100644
--- a/source3/pam_smbpass/pam_smb_passwd.c
+++ b/source3/pam_smbpass/pam_smb_passwd.c
@@ -105,7 +105,7 @@ int pam_sm_chauthtok(pam_handle_t *pamh, int flags,
char *pass_new;
/* Samba initialization. */
- load_case_tables();
+ load_case_tables_library();
lp_set_in_client(True);
ctrl = set_ctrl(pamh, flags, argc, argv);