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;