From 1ad8e5229f618fc04af371ba52b81f2e7e1f88f5 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Fri, 18 Feb 2011 13:59:05 +1100 Subject: [PATCH] lib/util/charset Add back setlocale(), but only when called from binaries When called from a library, we don't want to call this, as we may overwrite some of our calling program's context. Andrew Bartlett Autobuild-User: Andrew Bartlett Autobuild-Date: Fri Feb 18 09:29:35 CET 2011 on sn-devel-104 --- lib/util/charset/charset.h | 1 + lib/util/charset/codepoints.c | 26 +++++++++++++++++++++++--- nsswitch/wins.c | 2 +- source3/lib/charcnv.c | 2 +- source3/lib/netapi/netapi.c | 2 +- source3/libsmb/libsmb_context.c | 2 +- source3/pam_smbpass/pam_smb_acct.c | 2 +- source3/pam_smbpass/pam_smb_auth.c | 2 +- source3/pam_smbpass/pam_smb_passwd.c | 2 +- 9 files changed, 31 insertions(+), 10 deletions(-) diff --git a/lib/util/charset/charset.h b/lib/util/charset/charset.h index b4a5a554610..474d77e54e7 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 01183e4ad44..5ee95a8af56 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 eba27bc2877..5136c94c76e 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 27235995993..6f1ced69d03 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 9d76017a01a..c04ca702493 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 ab2db9d3e9b..9c8429aab47 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 650d322b356..63323d8d8fc 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 feb469792d3..24702131b4b 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 8fc2cf3e14d..54d9db7f312 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); -- 2.34.1