]> git.kaiwu.me - nginx.git/commitdiff
Win32: reworked ngx_win32_rename_file() to check errors.
authorMaxim Dounin <mdounin@mdounin.ru>
Thu, 23 Feb 2023 17:49:50 +0000 (20:49 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Thu, 23 Feb 2023 17:49:50 +0000 (20:49 +0300)
Previously, ngx_win32_rename_file() retried on all errors returned by
MoveFile() to a temporary name.  It only make sense, however, to retry
when the destination file already exists, similarly to the condition
when ngx_win32_rename_file() is called.  Retrying on other errors is
meaningless and might result in an infinite loop.

src/os/win32/ngx_files.c

index 2e0e5faa9013a190c49ee0cd8a763ef2939cf9fd..48075b4c961e1f3e61390969d0d4e0ca2402e95d 100644 (file)
@@ -236,10 +236,16 @@ ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
             break;
         }
 
-        collision = 1;
+        err = ngx_errno;
 
-        ngx_log_error(NGX_LOG_CRIT, log, ngx_errno,
+        if (err == NGX_EEXIST || err == NGX_EEXIST_FILE) {
+            collision = 1;
+            continue;
+        }
+
+        ngx_log_error(NGX_LOG_CRIT, log, err,
                       "MoveFile() \"%s\" to \"%s\" failed", to->data, name);
+        goto failed;
     }
 
     if (MoveFile((const char *) from->data, (const char *) to->data) == 0) {
@@ -254,6 +260,8 @@ ngx_win32_rename_file(ngx_str_t *from, ngx_str_t *to, ngx_log_t *log)
                       "DeleteFile() \"%s\" failed", name);
     }
 
+failed:
+
     /* mutex_unlock() */
 
     ngx_free(name);