summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2011-05-23 10:57:56 -0700
committerJeremy Allison <jra@samba.org>2011-05-24 03:52:50 +0200
commit9c3e5380ecabe44796f5d53f8aa9f81642434dd8 (patch)
tree0602aa80a767414f72092e7cc84b5988533d3a1d
parent18ec1dab59b16db7cf353c0144c43969cfdc3be7 (diff)
downloadsamba-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
-rw-r--r--source3/param/loadparm.c40
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)