diff options
author | Jeremy Allison <jra@samba.org> | 2011-05-23 10:57:56 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2011-05-24 03:52:50 +0200 |
commit | 9c3e5380ecabe44796f5d53f8aa9f81642434dd8 (patch) | |
tree | 0602aa80a767414f72092e7cc84b5988533d3a1d /source3/param/loadparm.c | |
parent | 18ec1dab59b16db7cf353c0144c43969cfdc3be7 (diff) | |
download | samba-9c3e5380ecabe44796f5d53f8aa9f81642434dd8.tar.gz samba-9c3e5380ecabe44796f5d53f8aa9f81642434dd8.tar.bz2 samba-9c3e5380ecabe44796f5d53f8aa9f81642434dd8.zip |
Fix bug #8150 - Ban 'dos charset = utf8'
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Tue May 24 03:52:50 CEST 2011 on sn-devel-104
Diffstat (limited to 'source3/param/loadparm.c')
-rw-r--r-- | source3/param/loadparm.c | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 3ed2308c86..9bb0ce1abb 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -708,6 +708,7 @@ static bool handle_workgroup( int snum, const char *pszParmValue, char **ptr ); static bool handle_netbios_aliases( int snum, const char *pszParmValue, char **ptr ); static bool handle_netbios_scope( int snum, const char *pszParmValue, char **ptr ); static bool handle_charset( int snum, const char *pszParmValue, char **ptr ); +static bool handle_dos_charset( int snum, const char *pszParmValue, char **ptr ); static bool handle_printing( int snum, const char *pszParmValue, char **ptr); static bool handle_ldap_debug_level( int snum, const char *pszParmValue, char **ptr); @@ -955,7 +956,7 @@ static struct parm_struct parm_table[] = { .type = P_STRING, .p_class = P_GLOBAL, .ptr = &Globals.dos_charset, - .special = handle_charset, + .special = handle_dos_charset, .enum_list = NULL, .flags = FLAG_ADVANCED }, @@ -7531,6 +7532,43 @@ static bool handle_charset(int snum, const char *pszParmValue, char **ptr) return True; } +static bool handle_dos_charset(int snum, const char *pszParmValue, char **ptr) +{ + bool is_utf8 = false; + size_t len = strlen(pszParmValue); + + if (len == 4 || len == 5) { + /* Don't use StrCaseCmp here as we don't want to + initialize iconv. */ + if ((toupper_ascii(pszParmValue[0]) == 'U') && + (toupper_ascii(pszParmValue[1]) == 'T') && + (toupper_ascii(pszParmValue[2]) == 'F')) { + if (len == 4) { + if (pszParmValue[3] == '8') { + is_utf8 = true; + } + } else { + if (pszParmValue[3] == '-' && + pszParmValue[4] == '8') { + is_utf8 = true; + } + } + } + } + + if (strcmp(*ptr, pszParmValue) != 0) { + if (is_utf8) { + DEBUG(0,("ERROR: invalid DOS charset: 'dos charset' must not " + "be UTF8, using (default value) %s instead.\n", + DEFAULT_DOS_CHARSET)); + pszParmValue = DEFAULT_DOS_CHARSET; + } + string_set(ptr, pszParmValue); + init_iconv(); + } + return true; +} + static bool handle_workgroup(int snum, const char *pszParmValue, char **ptr) |