Fix bug #8150 - Ban 'dos charset = utf8'
authorJeremy Allison <jra@samba.org>
Mon, 23 May 2011 17:57:56 +0000 (10:57 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 24 May 2011 01:52:50 +0000 (03:52 +0200)
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Tue May 24 03:52:50 CEST 2011 on sn-devel-104

source3/param/loadparm.c

index 3ed2308c8623e73698e986e6761442c925ccaf19..9bb0ce1abbf02144400b37b8f844e27e952e7325 100644 (file)
@@ -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)