This is another "breaking" change. However, whatever enum values are
used, it should always be as a comparison operator, and this is an
internal value. It would prove unreliable if someone looked for
Windows 10+ and looked against apr-1.7.0.dll, but that just means a
feature available isn't recognized.

I think this one is safe for the 1.7.0 -> 1.7.1 based on semver, any concerns?

On Wed, May 26, 2021 at 2:57 PM <micha...@apache.org> wrote:
>
> Author: michaelo
> Date: Wed May 26 19:57:29 2021
> New Revision: 1890230
>
> URL: http://svn.apache.org/viewvc?rev=1890230&view=rev
> Log:
> Backport r1861050, r1805309, r1861045, r1861046, r1861049, r1861053, 
> r1861054, r1861061 from trunk:
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Fix condition to actually return APR_EGENERAL on
>    unsupported OS.
>
> ===
>
> apr_socket_listen(): Allow larger backlog queue lengths on Windows 8+.
>
> Starting with Windows 8, the socket listen() function accepts a special
> SOMAXCONN_HINT(N) argument that allows making the backlog queue
> length larger than the otherwise predefined limit of around 200:
>
>   https://msdn.microsoft.com/en-us/library/windows/desktop/ms739168
>   
> https://blogs.msdn.microsoft.com/winsdk/2015/06/01/winsocks-listen-backlog-offers-more-flexibility-in-windows-8/
>
> Having a larger listen backlog can be used for certain high performance
> applications that need to handle lots of incoming connections.  One
> example would be the httpd server with it's "ListenBacklog" directive
> where setting it to a larger value currently allows serving more concurrent
> connections on Windows with mpm_winnt.
>
> * include/arch/win32/apr_arch_misc.h
>   (enum apr_oslevel_e): Add APR_WIN_8.
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Determine whether we are running on Windows 7 or
>    on Windows 8+.
>
> * network_io/win32/sockets.c
>   (SOMAXCONN_HINT): Define this macro in case we are building against
>    an older version of Windows SDK.
>   (apr_socket_listen): Use SOMAXCONN_HINT() for the backlog queue length
>    if it's supported by the Windows version we are running on.
>
> Patch by: Evgeny Kotkov <evgeny.kotkov {at} visualsvn.com>
>
> ===
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Check return code from GetVersionEx().
>
> ===
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Do not use static variables to protect from potential
>    race condition.
>
> ===
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Use GetVersionExW() with OSVERSIONINFOEXW to version
>    information with service pack info.
>
> ===
>
> * include/arch/win32/apr_arch_misc.h
>   (enum apr_oslevel_e): Add APR_WIN_8_1.
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Determine whether we are running on Windows 8 or
>    on Windows 8.1+.
>
> ===
>
> Fix problem that apr_get_oslevel() was returning APR_WIN_XP on Windows 10.
>
> * include/arch/win32/apr_arch_misc.h
>   (enum apr_oslevel_e): Add APR_WIN_10.
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Return APR_WIN_10 when dwMajorVersion is greater than 6.
>
> ===
>
> * include/arch/win32/apr_arch_misc.h
>   (enum apr_oslevel_e): Add APR_WIN_7_SP1.
>
> * misc/win32/misc.c
>   (apr_get_oslevel): Determine whether we are running on Windows 7 or on
>    Windows 7 SP1.
>
> Modified:
>     apr/apr/branches/1.7.x/CHANGES
>     apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h
>     apr/apr/branches/1.7.x/misc/win32/misc.c
>     apr/apr/branches/1.7.x/network_io/win32/sockets.c
>
> Modified: apr/apr/branches/1.7.x/CHANGES
> URL: 
> http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/CHANGES?rev=1890230&r1=1890229&r2=1890230&view=diff
> ==============================================================================
> --- apr/apr/branches/1.7.x/CHANGES [utf-8] (original)
> +++ apr/apr/branches/1.7.x/CHANGES [utf-8] Wed May 26 19:57:29 2021
> @@ -47,6 +47,11 @@ Changes for APR 1.7.1
>       events are emitted on pool clear/destroy for proper accounting.
>       [Brane Čibej]
>
> +  *) apr_socket_listen: Allow larger listen backlog values on Windows 8+.
> +     [Evgeny Kotkov <evgeny.kotkov visualsvn.com>]
> +
> +  *) Fixed: apr_get_oslevel() was returning APR_WIN_XP on Windows 10
> +
>  Changes for APR 1.7.0
>
>    *) apr_dir_read: [Unix] Dropped the preference of the dirread_r() flavor
>
> Modified: apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h
> URL: 
> http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h?rev=1890230&r1=1890229&r2=1890230&view=diff
> ==============================================================================
> --- apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h (original)
> +++ apr/apr/branches/1.7.x/include/arch/win32/apr_arch_misc.h Wed May 26 
> 19:57:29 2021
> @@ -110,7 +110,11 @@ typedef enum {
>      APR_WIN_XP_SP2 =   62,
>      APR_WIN_2003 =     70,
>      APR_WIN_VISTA =    80,
> -    APR_WIN_7 =        90
> +    APR_WIN_7 =        90,
> +    APR_WIN_7_SP1 =    91,
> +    APR_WIN_8  =       100,
> +    APR_WIN_8_1 =      110,
> +    APR_WIN_10 =       120
>  } apr_oslevel_e;
>
>  extern APR_DECLARE_DATA apr_oslevel_e apr_os_level;
>
> Modified: apr/apr/branches/1.7.x/misc/win32/misc.c
> URL: 
> http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/misc/win32/misc.c?rev=1890230&r1=1890229&r2=1890230&view=diff
> ==============================================================================
> --- apr/apr/branches/1.7.x/misc/win32/misc.c (original)
> +++ apr/apr/branches/1.7.x/misc/win32/misc.c Wed May 26 19:57:29 2021
> @@ -27,25 +27,15 @@ apr_status_t apr_get_oslevel(apr_oslevel
>  {
>      if (apr_os_level == APR_WIN_UNK)
>      {
> -        static OSVERSIONINFO oslev;
> -        oslev.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
> -        GetVersionEx(&oslev);
> +        OSVERSIONINFOEXW oslev;
> +        oslev.dwOSVersionInfoSize = sizeof(oslev);
> +        if (!GetVersionExW((OSVERSIONINFOW*) &oslev)) {
> +            return apr_get_os_error();
> +        }
>
>          if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT)
>          {
> -            static unsigned int servpack = 0;
> -            TCHAR *pservpack;
> -            if ((pservpack = oslev.szCSDVersion)) {
> -                while (*pservpack && !apr_isdigit(*pservpack)) {
> -                    pservpack++;
> -                }
> -                if (*pservpack)
> -#ifdef _UNICODE
> -                    servpack = _wtoi(pservpack);
> -#else
> -                    servpack = atoi(pservpack);
> -#endif
> -            }
> +            unsigned int servpack = oslev.wServicePackMajor;
>
>              if (oslev.dwMajorVersion < 3) {
>                  apr_os_level = APR_WIN_UNSUP;
> @@ -99,11 +89,19 @@ apr_status_t apr_get_oslevel(apr_oslevel
>              else if (oslev.dwMajorVersion == 6) {
>                  if (oslev.dwMinorVersion == 0)
>                      apr_os_level = APR_WIN_VISTA;
> +                else if (oslev.dwMinorVersion == 1) {
> +                    if (servpack < 1)
> +                        apr_os_level = APR_WIN_7;
> +                    else
> +                        apr_os_level = APR_WIN_7_SP1;
> +                }
> +                else if (oslev.dwMinorVersion == 2)
> +                    apr_os_level = APR_WIN_8;
>                  else
> -                    apr_os_level = APR_WIN_7;
> +                    apr_os_level = APR_WIN_8_1;
>              }
>              else {
> -                apr_os_level = APR_WIN_XP;
> +                apr_os_level = APR_WIN_10;
>              }
>          }
>  #ifndef WINNT
> @@ -151,7 +149,7 @@ apr_status_t apr_get_oslevel(apr_oslevel
>
>      *level = apr_os_level;
>
> -    if (apr_os_level < APR_WIN_UNSUP) {
> +    if (apr_os_level <= APR_WIN_UNSUP) {
>          return APR_EGENERAL;
>      }
>
>
> Modified: apr/apr/branches/1.7.x/network_io/win32/sockets.c
> URL: 
> http://svn.apache.org/viewvc/apr/apr/branches/1.7.x/network_io/win32/sockets.c?rev=1890230&r1=1890229&r2=1890230&view=diff
> ==============================================================================
> --- apr/apr/branches/1.7.x/network_io/win32/sockets.c (original)
> +++ apr/apr/branches/1.7.x/network_io/win32/sockets.c Wed May 26 19:57:29 2021
> @@ -24,6 +24,13 @@
>  #include "apr_arch_inherit.h"
>  #include "apr_arch_misc.h"
>
> +/* Borrow the definition of SOMAXCONN_HINT() from Windows SDK 8,
> + * in case the SDK we are building against doesn't have it.
> + */
> +#ifndef SOMAXCONN_HINT
> +#define SOMAXCONN_HINT(b) (-(b))
> +#endif
> +
>  static char generic_inaddr_any[16] = {0}; /* big enough for IPv4 or IPv6 */
>
>  static apr_status_t socket_cleanup(void *sock)
> @@ -223,7 +230,21 @@ APR_DECLARE(apr_status_t) apr_socket_bin
>  APR_DECLARE(apr_status_t) apr_socket_listen(apr_socket_t *sock,
>                                              apr_int32_t backlog)
>  {
> -    if (listen(sock->socketdes, backlog) == SOCKET_ERROR)
> +    int backlog_val;
> +
> +    if (apr_os_level >= APR_WIN_8) {
> +        /* Starting from Windows 8, listen() accepts a special 
> SOMAXCONN_HINT()
> +         * arg that allows setting the listen backlog value to a larger
> +         * value than the predefined Winsock 2 limit (several hundred).
> +         * 
> https://blogs.msdn.microsoft.com/winsdk/2015/06/01/winsocks-listen-backlog-offers-more-flexibility-in-windows-8/
> +         */
> +        backlog_val = SOMAXCONN_HINT(backlog);
> +    }
> +    else {
> +        backlog_val = backlog;
> +    }
> +
> +    if (listen(sock->socketdes, backlog_val) == SOCKET_ERROR)
>          return apr_get_netos_error();
>      else
>          return APR_SUCCESS;
>
>

Reply via email to