diff src/os/win32/ngx_files.c @ 7433:061ec464813f

Win32: removed NGX_DIR_MASK concept. Previous interface of ngx_open_dir() assumed that passed directory name has a room for NGX_DIR_MASK at the end (NGX_DIR_MASK_LEN bytes). While all direct users of ngx_dir_open() followed this interface, this also implied similar requirements for indirect uses - in particular, via ngx_walk_tree(). Currently none of ngx_walk_tree() uses provides appropriate space, and fixing this does not look like a right way to go. Instead, ngx_dir_open() interface was changed to not require any additional space and use appropriate allocations instead.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 24 Dec 2018 21:07:05 +0300
parents 577628e6b6a6
children ccb5ff87ab3e
line wrap: on
line diff
--- a/src/os/win32/ngx_files.c
+++ b/src/os/win32/ngx_files.c
@@ -427,16 +427,31 @@ ngx_realpath(u_char *path, u_char *resol
 ngx_int_t
 ngx_open_dir(ngx_str_t *name, ngx_dir_t *dir)
 {
-    ngx_cpystrn(name->data + name->len, NGX_DIR_MASK, NGX_DIR_MASK_LEN + 1);
+    u_char     *pattern, *p;
+    ngx_err_t   err;
+
+    pattern = malloc(name->len + 3);
+    if (pattern == NULL) {
+        return NGX_ERROR;
+    }
 
-    dir->dir = FindFirstFile((const char *) name->data, &dir->finddata);
+    p = ngx_cpymem(pattern, name->data, name->len);
 
-    name->data[name->len] = '\0';
+    *p++ = '/';
+    *p++ = '*';
+    *p = '\0';
+
+    dir->dir = FindFirstFile((const char *) pattern, &dir->finddata);
 
     if (dir->dir == INVALID_HANDLE_VALUE) {
+        err = ngx_errno;
+        ngx_free(pattern);
+        ngx_set_errno(err);
         return NGX_ERROR;
     }
 
+    ngx_free(pattern);
+
     dir->valid_info = 1;
     dir->ready = 1;