# HG changeset patch # User Maxim Dounin <mdou...@mdounin.ru> # Date 1673549053 -10800 # Thu Jan 12 21:44:13 2023 +0300 # Node ID c63770d2ae19a5a84f3521e336ca2092879dd855 # Parent be7eb9ec28dcbfdfd2e850befc8d051c0e4d46fd Win32: non-ASCII names in ngx_fs_bsize(), ngx_fs_available().
This fixes potentially incorrect cache size calculations and non-working "min_free" when using cache in directories with non-ASCII names. diff -r be7eb9ec28dc -r c63770d2ae19 src/os/win32/ngx_files.c --- a/src/os/win32/ngx_files.c Thu Jan 12 21:43:30 2023 +0300 +++ b/src/os/win32/ngx_files.c Thu Jan 12 21:44:13 2023 +0300 @@ -955,12 +955,31 @@ ngx_directio_off(ngx_fd_t fd) size_t ngx_fs_bsize(u_char *name) { - u_long sc, bs, nfree, ncl; + u_long sc, bs, nfree, ncl; + size_t len; + u_short *u; + u_short utf16[NGX_UTF16_BUFLEN]; + + len = NGX_UTF16_BUFLEN; + u = ngx_utf8_to_utf16(utf16, name, &len, 0); + + if (u == NULL) { + return 512; + } - if (GetDiskFreeSpace((const char *) name, &sc, &bs, &nfree, &ncl) == 0) { + if (GetDiskFreeSpaceW(u, &sc, &bs, &nfree, &ncl) == 0) { + + if (u != utf16) { + ngx_free(u); + } + return 512; } + if (u != utf16) { + ngx_free(u); + } + return sc * bs; } @@ -968,12 +987,31 @@ ngx_fs_bsize(u_char *name) off_t ngx_fs_available(u_char *name) { - ULARGE_INTEGER navail; + size_t len; + u_short *u; + ULARGE_INTEGER navail; + u_short utf16[NGX_UTF16_BUFLEN]; + + len = NGX_UTF16_BUFLEN; + u = ngx_utf8_to_utf16(utf16, name, &len, 0); + + if (u == NULL) { + return NGX_MAX_OFF_T_VALUE; + } - if (GetDiskFreeSpaceEx((const char *) name, &navail, NULL, NULL) == 0) { + if (GetDiskFreeSpaceExW(u, &navail, NULL, NULL) == 0) { + + if (u != utf16) { + ngx_free(u); + } + return NGX_MAX_OFF_T_VALUE; } + if (u != utf16) { + ngx_free(u); + } + return (off_t) navail.QuadPart; } _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel