[nginx] Win32: non-ASCII names in ngx_fs_bsize(), ngx_fs_available().

Sergey Kandaurov pluknet at nginx.com
Fri Feb 24 10:33:19 UTC 2023


details:   https://hg.nginx.org/nginx/rev/2acb00b9b5ff
branches:  
changeset: 8141:2acb00b9b5ff
user:      Maxim Dounin <mdounin at mdounin.ru>
date:      Thu Feb 23 20:50:03 2023 +0300
description:
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.

diffstat:

 src/os/win32/ngx_files.c |  46 ++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 42 insertions(+), 4 deletions(-)

diffs (71 lines):

diff -r c33eb93f9c7a -r 2acb00b9b5ff src/os/win32/ngx_files.c
--- a/src/os/win32/ngx_files.c	Thu Feb 23 20:50:00 2023 +0300
+++ b/src/os/win32/ngx_files.c	Thu Feb 23 20:50:03 2023 +0300
@@ -967,12 +967,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;
 }
 
@@ -980,12 +999,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;
 }
 


More information about the nginx-devel mailing list