Skip to content

Commit

Permalink
fix: Windows malicious file analysis waiting problem (#398)
Browse files Browse the repository at this point in the history
Co-authored-by: Steven <steven@ceriously.com>
  • Loading branch information
ngnlTeto and styfle authored Feb 27, 2024
1 parent 967e266 commit 295a1cd
Showing 1 changed file with 30 additions and 1 deletion.
31 changes: 30 additions & 1 deletion sources/corepackUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type {Dir} from 'fs';
import Module from 'module';
import path from 'path';
import semver from 'semver';
import {setTimeout as setTimeoutPromise} from 'timers/promises';

import * as engine from './Engine';
import * as debugUtils from './debugUtils';
Expand Down Expand Up @@ -213,7 +214,11 @@ export async function installVersion(installTarget: string, locator: Locator, {s

await fs.promises.mkdir(path.dirname(installFolder), {recursive: true});
try {
await fs.promises.rename(tmpFolder, installFolder);
if (process.platform === `win32`) {
await renameUnderWindows(tmpFolder, installFolder);
} else {
await fs.promises.rename(tmpFolder, installFolder);
}
} catch (err) {
if (
(err as nodeUtils.NodeError).code === `ENOTEMPTY` ||
Expand Down Expand Up @@ -260,6 +265,30 @@ export async function installVersion(installTarget: string, locator: Locator, {s
};
}

async function renameUnderWindows(oldPath: fs.PathLike, newPath: fs.PathLike) {
// Windows malicious file analysis blocks files currently under analysis, so we need to wait for file release
const retries = 5;
for (let i = 0; i < retries; i++) {
try {
await fs.promises.rename(oldPath, newPath);
break;
} catch (err) {
if (
(
(err as nodeUtils.NodeError).code === `ENOENT` ||
(err as nodeUtils.NodeError).code === `EPERM`
) &&
i < (retries - 1)
) {
await setTimeoutPromise(100 * 2 ** i);
continue;
} else {
throw err;
}
}
}
}

/**
* Loads the binary, taking control of the current process.
*/
Expand Down

0 comments on commit 295a1cd

Please sign in to comment.