s3/lib: rework get_remote_arch_str() to use an array
authorRalph Boehme <slow@samba.org>
Wed, 13 Apr 2016 15:39:26 +0000 (17:39 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 3 May 2016 23:28:22 +0000 (01:28 +0200)
By using C99 designated array initializers we can simplify the code and
remove the dependency on initializers appearing in a particular order.

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/include/smb.h
source3/lib/util.c

index 7eeef880d73bba41fd7a019e256dbf6fd8d2d3da..dec3189563899b8e7401c7d7462375b65cb2616e 100644 (file)
@@ -529,7 +529,7 @@ http://msdn.microsoft.com/en-us/library/cc246334(PROT.13).aspx
 #define NO_SUBSTREAMS          0x2
 #define NO_REPARSETAG          0x4
 
-/* Remote architectures we know about. */
+/* Remote architectures we know about, keep in sync with remote_arch_strings */
 enum remote_arch_types {RA_UNKNOWN, RA_WFWG, RA_OS2, RA_WIN95, RA_WINNT,
                        RA_WIN2K, RA_WINXP, RA_WIN2K3, RA_VISTA,
                        RA_SAMBA, RA_CIFSFS, RA_WINXP64, RA_OSX};
index 2895c14241d1daaa90455cd6151b31660776da97..a02e0cf6586fff7b8d15aa659471242a9b10d8ef 100644 (file)
@@ -1230,14 +1230,34 @@ void ra_lanman_string( const char *native_lanman )
                set_remote_arch( RA_WIN2K3 );
 }
 
-static const char *remote_arch_str;
+static const char *remote_arch_strings[] = {
+       [RA_UNKNOWN] =  "UNKNOWN",
+       [RA_WFWG] =     "WfWg",
+       [RA_OS2] =      "OS2",
+       [RA_WIN95] =    "Win95",
+       [RA_WINNT] =    "WinNT",
+       [RA_WIN2K] =    "Win2K",
+       [RA_WINXP] =    "WinXP",
+       [RA_WIN2K3] =   "Win2K3",
+       [RA_VISTA] =    "Vista",
+       [RA_SAMBA] =    "Samba",
+       [RA_CIFSFS] =   "CIFSFS",
+       [RA_WINXP64] =  "WinXP64",
+       [RA_OSX] =      "OSX",
+};
 
 const char *get_remote_arch_str(void)
 {
-       if (!remote_arch_str) {
-               return "UNKNOWN";
+       if (ra_type >= ARRAY_SIZE(remote_arch_strings)) {
+               /*
+                * set_remote_arch() already checks this so ra_type
+                * should be in the allowed range, but anyway, let's
+                * do another bound check here.
+                */
+               DBG_ERR("Remote arch info out of sync [%d] missing\n", ra_type);
+               ra_type = RA_UNKNOWN;
        }
-       return remote_arch_str;
+       return remote_arch_strings[ra_type];
 }
 
 /*******************************************************************
@@ -1246,52 +1266,20 @@ const char *get_remote_arch_str(void)
 
 void set_remote_arch(enum remote_arch_types type)
 {
-       ra_type = type;
-       switch( type ) {
-       case RA_WFWG:
-               remote_arch_str = "WfWg";
-               break;
-       case RA_OS2:
-               remote_arch_str = "OS2";
-               break;
-       case RA_WIN95:
-               remote_arch_str = "Win95";
-               break;
-       case RA_WINNT:
-               remote_arch_str = "WinNT";
-               break;
-       case RA_WIN2K:
-               remote_arch_str = "Win2K";
-               break;
-       case RA_WINXP:
-               remote_arch_str = "WinXP";
-               break;
-       case RA_WINXP64:
-               remote_arch_str = "WinXP64";
-               break;
-       case RA_WIN2K3:
-               remote_arch_str = "Win2K3";
-               break;
-       case RA_VISTA:
-               remote_arch_str = "Vista";
-               break;
-       case RA_SAMBA:
-               remote_arch_str = "Samba";
-               break;
-       case RA_CIFSFS:
-               remote_arch_str = "CIFSFS";
-               break;
-       case RA_OSX:
-               remote_arch_str = "OSX";
-               break;
-       default:
+       if (ra_type >= ARRAY_SIZE(remote_arch_strings)) {
+               /*
+                * This protects against someone adding values to enum
+                * remote_arch_types without updating
+                * remote_arch_strings array.
+                */
+               DBG_ERR("Remote arch info out of sync [%d] missing\n", ra_type);
                ra_type = RA_UNKNOWN;
-               remote_arch_str = "UNKNOWN";
-               break;
+               return;
        }
 
+       ra_type = type;
        DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
-                               remote_arch_str));
+                 get_remote_arch_str()));
 }
 
 /*******************************************************************