Win32: reworked ngx_win32_rename_file() to check errors.

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.
This commit is contained in:
Maxim Dounin 2023-02-23 20:49:50 +03:00
parent 82fba427a0
commit b45693f680
1 changed files with 10 additions and 2 deletions

View 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);