Skip to content

Commit e42cff2

Browse files
committed
Fix Windows home path: use os.homedir() instead of HOMEPATH/HOMEDRIVE env vars #6106
1 parent d69cb7b commit e42cff2

4 files changed

Lines changed: 67 additions & 13 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
- CVE-2025-5891 Fix ReDoS in Config.js string-to-array split regex #6075
2424
- Fix [object Object] env vars leaked to fork mode subprocesses #6073
2525
- Rewrite TreeKill: single ps call + in-memory tree build, eliminates race conditions #6084
26+
- Fix Windows home path: use os.homedir() instead of HOMEPATH/HOMEDRIVE env vars #6106
2627

2728
## 6.0.14
2829

paths.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,19 @@ var p = require('path');
99
var fs = require('fs')
1010

1111
function getDefaultPM2Home() {
12-
var PM2_ROOT_PATH;
13-
1412
if (process.env.PM2_HOME)
15-
PM2_ROOT_PATH = process.env.PM2_HOME;
16-
else if (process.env.HOME && !process.env.HOMEPATH)
17-
PM2_ROOT_PATH = p.resolve(process.env.HOME, '.pm2');
18-
else if (process.env.HOME || process.env.HOMEPATH)
19-
PM2_ROOT_PATH = p.resolve(process.env.HOMEDRIVE, process.env.HOME || process.env.HOMEPATH, '.pm2');
20-
else {
21-
console.error('[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!');
22-
console.error('[PM2][Initialization] Defaulting to /etc/.pm2');
23-
PM2_ROOT_PATH = p.resolve('/etc', '.pm2');
13+
return process.env.PM2_HOME;
14+
15+
var home = require('os').homedir();
16+
if (home) {
17+
var resolved = p.resolve(home, '.pm2');
18+
debug('pm2 home resolved to %s', resolved);
19+
return resolved;
2420
}
2521

26-
debug('pm2 home resolved to %s', PM2_ROOT_PATH, process.env.HOME);
27-
return PM2_ROOT_PATH;
22+
console.error('[PM2][Initialization] Could not determine home directory!');
23+
console.error('[PM2][Initialization] Defaulting to /etc/.pm2');
24+
return p.resolve('/etc', '.pm2');
2825
}
2926

3027
module.exports = function(PM2_HOME) {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
process.chdir(__dirname);
3+
4+
var path = require('path');
5+
var os = require('os');
6+
var should = require('should');
7+
var pathsFn = require('../../paths.js');
8+
9+
describe('PM2 Home Path Resolution (#6106)', function () {
10+
11+
var savedEnv;
12+
13+
beforeEach(function () {
14+
savedEnv = {};
15+
['PM2_HOME', 'HOME', 'HOMEPATH', 'HOMEDRIVE', 'USERPROFILE'].forEach(function (k) {
16+
savedEnv[k] = process.env[k];
17+
});
18+
});
19+
20+
afterEach(function () {
21+
Object.keys(savedEnv).forEach(function (k) {
22+
if (savedEnv[k] === undefined) delete process.env[k];
23+
else process.env[k] = savedEnv[k];
24+
});
25+
});
26+
27+
it('should honor PM2_HOME env var override', function () {
28+
process.env.PM2_HOME = '/custom/pm2/home';
29+
var paths = pathsFn();
30+
paths.PM2_HOME.should.eql('/custom/pm2/home');
31+
});
32+
33+
it('should resolve from os.homedir() by default', function () {
34+
delete process.env.PM2_HOME;
35+
var paths = pathsFn();
36+
paths.PM2_HOME.should.eql(path.resolve(os.homedir(), '.pm2'));
37+
});
38+
39+
it('should resolve correctly when HOME env var is not set (#6106)', function () {
40+
delete process.env.PM2_HOME;
41+
delete process.env.HOME;
42+
delete process.env.HOMEPATH;
43+
delete process.env.HOMEDRIVE;
44+
45+
var paths = pathsFn();
46+
paths.PM2_HOME.should.not.eql(path.resolve('/etc', '.pm2'));
47+
paths.PM2_HOME.should.eql(path.resolve(os.homedir(), '.pm2'));
48+
});
49+
});

test/unit.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ runUnitTest $D/fclone.mocha.js
9595

9696
runUnitTest $D/issues/json_env_passing_4080.mocha.js
9797

98+
runUnitTest $D/issue_6106_windows_home.mocha.js
99+
runUnitTest $D/issue_6089_prototype_pollution.mocha.js
100+
runUnitTest $D/issue_6075_redos.mocha.js
101+
runUnitTest $D/issue_6073_object_env.mocha.js
102+
runUnitTest $D/treekill.mocha.js
103+
runUnitTest $D/http_interface.mocha.js
104+
98105
D=test/interface
99106

100107
runUnitTest $D/bus.spec.mocha.js

0 commit comments

Comments
 (0)