ac3630ef55d95934c11c0aed992c9aeda1988ed4
jcasper
  Mon Aug 31 13:11:23 2026 -0700
Fixing an enum type mismatch for osType vs browserType when parsing user agent
strings, refs #37947

diff --git src/lib/cheapcgi.c src/lib/cheapcgi.c
index 9b061eeddb7..15b31173d28 100644
--- src/lib/cheapcgi.c
+++ src/lib/cheapcgi.c
@@ -453,110 +453,110 @@
 
 char *cgiUserAgent()
 /* Return remote user agent (HTTP_USER_AGENT) or NULL if remote user agent is not known */
 {
 return getenv("HTTP_USER_AGENT");
 }
 
 enum browserType cgiClientBrowser(char **browserQualifier, enum osType *clientOs,
                                   char **clientOsQualifier)
 /* Return client browser type determined from (HTTP_USER_AGENT)
    Optionally requuest the additional info about the client */
 {
 // WARNING: The specifics of the HTTP_USER_AGENT vary widely.
 //          This has only been tested on a few cases.
 static enum browserType clientBrowser = btUnknown;
-static enum browserType clientOsType  = (enum browserType)osUnknown;
+static enum osType clientOsType  = osUnknown;
 static char *clientBrowserExtra       = NULL;
 static char *clientOsExtra            = NULL;
 
 if (clientBrowser == btUnknown)
     {
     char *userAgent = cgiUserAgent();
     if (userAgent != NULL)
         {
         //warn(userAgent);  // Use this to investigate other cases
         char *ptr=NULL;
 
         // Determine the browser
         if ((ptr = stringIn("Opera",userAgent)) != NULL) // Must be before IE
             {
             clientBrowser = btOpera;
             }
         else if ((ptr = stringIn("MSIE ",userAgent)) != NULL)
             {
             clientBrowser = btIE;
             ptr += strlen("MSIE ");
             clientBrowserExtra = cloneFirstWordByDelimiter(ptr,';');
             }
-        else if ((ptr = stringIn("Firefox",userAgent)) != NULL)
+        else if ((ptr = stringIn("Firefox/",userAgent)) != NULL)
             {
             clientBrowser = btFF;
-            ptr += strlen("(Firefox/");
+            ptr += strlen("Firefox/");
             clientBrowserExtra = cloneFirstWordByDelimiter(ptr,' ');
             }
-        else if ((ptr = stringIn("Chrome",userAgent)) != NULL)  // Must be before Safari
+        else if ((ptr = stringIn("Chrome/",userAgent)) != NULL)  // Must be before Safari
             {
             clientBrowser = btChrome;
             ptr += strlen("Chrome/");
             clientBrowserExtra = cloneFirstWordByDelimiter(ptr,' ');
             }
-        else if ((ptr = stringIn("Safari",userAgent)) != NULL)
+        else if ((ptr = stringIn("Safari/",userAgent)) != NULL)
             {
             clientBrowser = btSafari;
             ptr += strlen("Safari/");
             clientBrowserExtra = cloneFirstWordByDelimiter(ptr,' ');
             }
         else
             {
             clientBrowser = btOther;
             }
 
         // Determine the OS
         if ((ptr = stringIn("Windows ",userAgent)) != NULL)
             {
-            clientOsType = (enum browserType)osWindows;
+            clientOsType = osWindows;
             ptr += strlen("Windows ");
             clientOsExtra = cloneFirstWordByDelimiter(ptr,';');
             }
         else if ((ptr = stringIn("Linux ",userAgent)) != NULL)
             {
-            clientOsType = (enum browserType)osLinux;
+            clientOsType = osLinux;
             ptr += strlen("Linux ");
             clientOsExtra = cloneFirstWordByDelimiter(ptr,';');
             }
         else if ((ptr = stringIn("Mac ",userAgent)) != NULL)
             {
-            clientOsType = (enum browserType)osMac;
+            clientOsType = osMac;
             ptr += strlen("Mac ");
             clientOsExtra = cloneFirstWordByDelimiter(ptr,';');
             }
         else
             {
-            clientOsType = (enum browserType)osOther;
+            clientOsType = osOther;
             }
         }
     }
 if (browserQualifier != NULL)
     {
     if (clientBrowserExtra != NULL)
         *browserQualifier = cloneString(clientBrowserExtra);
     else
         *browserQualifier = NULL;
     }
 if (clientOs != NULL)
-    *clientOs = (enum osType)clientOsType;
+    *clientOs = clientOsType;
 if (clientOsQualifier != NULL)
     {
     if (clientOsExtra != NULL)
         *clientOsQualifier = cloneString(clientOsExtra);
     else
         *clientOsQualifier = NULL;
     }
 
 return clientBrowser;
 }
 
 char *_cgiRawInput()
 /* For debugging get the unprocessed input. */
 {
 return inputString;