node-pty 0.11.0-beta30 → 0.11.0-beta31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +0 -15
- package/lib/unixTerminal.js +1 -9
- package/lib/unixTerminal.js.map +1 -1
- package/lib/unixTerminal.test.js +91 -57
- package/lib/unixTerminal.test.js.map +1 -1
- package/package.json +1 -1
- package/scripts/post-install.js +0 -1
- package/src/interfaces.ts +0 -1
- package/src/native.d.ts +1 -1
- package/src/unix/pty.cc +352 -163
- package/src/unixTerminal.test.ts +45 -62
- package/src/unixTerminal.ts +1 -9
- package/typings/node-pty.d.ts +1 -7
- package/src/unix/comms.h +0 -5
- package/src/unix/spawn-helper.cc +0 -70
package/binding.gyp
CHANGED
|
@@ -69,21 +69,6 @@
|
|
|
69
69
|
]
|
|
70
70
|
}, { # OS!="win"
|
|
71
71
|
'targets': [
|
|
72
|
-
{
|
|
73
|
-
'target_name': 'spawn-helper',
|
|
74
|
-
'type': 'executable',
|
|
75
|
-
'cflags': ['-Wall'],
|
|
76
|
-
'sources': [
|
|
77
|
-
'src/unix/spawn-helper.cc',
|
|
78
|
-
],
|
|
79
|
-
'conditions': [
|
|
80
|
-
['OS=="mac"', {
|
|
81
|
-
"xcode_settings": {
|
|
82
|
-
"MACOSX_DEPLOYMENT_TARGET":"10.7"
|
|
83
|
-
}
|
|
84
|
-
}]
|
|
85
|
-
]
|
|
86
|
-
},
|
|
87
72
|
{
|
|
88
73
|
'target_name': 'pty',
|
|
89
74
|
'include_dirs' : [
|
package/lib/unixTerminal.js
CHANGED
|
@@ -20,19 +20,15 @@ exports.UnixTerminal = void 0;
|
|
|
20
20
|
* Copyright (c) 2018, Microsoft Corporation (MIT License).
|
|
21
21
|
*/
|
|
22
22
|
var net = require("net");
|
|
23
|
-
var path = require("path");
|
|
24
23
|
var terminal_1 = require("./terminal");
|
|
25
24
|
var utils_1 = require("./utils");
|
|
26
25
|
var pty;
|
|
27
|
-
var helperPath;
|
|
28
26
|
try {
|
|
29
27
|
pty = require('../build/Release/pty.node');
|
|
30
|
-
helperPath = '../build/Release/spawn-helper';
|
|
31
28
|
}
|
|
32
29
|
catch (outerError) {
|
|
33
30
|
try {
|
|
34
31
|
pty = require('../build/Debug/pty.node');
|
|
35
|
-
helperPath = '../build/Debug/spawn-helper';
|
|
36
32
|
}
|
|
37
33
|
catch (innerError) {
|
|
38
34
|
console.error('innerError', innerError);
|
|
@@ -40,9 +36,6 @@ catch (outerError) {
|
|
|
40
36
|
throw outerError;
|
|
41
37
|
}
|
|
42
38
|
}
|
|
43
|
-
helperPath = path.resolve(__dirname, helperPath);
|
|
44
|
-
helperPath = helperPath.replace('app.asar', 'app.asar.unpacked');
|
|
45
|
-
helperPath = helperPath.replace('node_modules.asar', 'node_modules.asar.unpacked');
|
|
46
39
|
var DEFAULT_FILE = 'sh';
|
|
47
40
|
var DEFAULT_NAME = 'xterm';
|
|
48
41
|
var DESTROY_SOCKET_TIMEOUT_MS = 200;
|
|
@@ -65,7 +58,6 @@ var UnixTerminal = /** @class */ (function (_super) {
|
|
|
65
58
|
_this._rows = opt.rows || terminal_1.DEFAULT_ROWS;
|
|
66
59
|
var uid = (_a = opt.uid) !== null && _a !== void 0 ? _a : -1;
|
|
67
60
|
var gid = (_b = opt.gid) !== null && _b !== void 0 ? _b : -1;
|
|
68
|
-
var closeFDs = opt.closeFDs || false;
|
|
69
61
|
var env = utils_1.assign({}, opt.env);
|
|
70
62
|
if (opt.env === process.env) {
|
|
71
63
|
_this._sanitizeEnv(env);
|
|
@@ -103,7 +95,7 @@ var UnixTerminal = /** @class */ (function (_super) {
|
|
|
103
95
|
_this.emit('exit', code, signal);
|
|
104
96
|
};
|
|
105
97
|
// fork
|
|
106
|
-
var term = pty.fork(file, args, parsedEnv, cwd, _this._cols, _this._rows, uid, gid, (encoding === 'utf8'),
|
|
98
|
+
var term = pty.fork(file, args, parsedEnv, cwd, _this._cols, _this._rows, uid, gid, (encoding === 'utf8'), onexit);
|
|
107
99
|
_this._socket = new PipeSocket(term.fd);
|
|
108
100
|
if (encoding !== null) {
|
|
109
101
|
_this._socket.setEncoding(encoding);
|
package/lib/unixTerminal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unixTerminal.js","sourceRoot":"","sources":["../src/unixTerminal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,yBAA2B;
|
|
1
|
+
{"version":3,"file":"unixTerminal.js","sourceRoot":"","sources":["../src/unixTerminal.ts"],"names":[],"mappings":"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"}
|
package/lib/unixTerminal.test.js
CHANGED
|
@@ -3,6 +3,42 @@
|
|
|
3
3
|
* Copyright (c) 2017, Daniel Imms (MIT License).
|
|
4
4
|
* Copyright (c) 2018, Microsoft Corporation (MIT License).
|
|
5
5
|
*/
|
|
6
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
7
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
8
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
9
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
10
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
11
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
12
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
16
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
17
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
18
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
19
|
+
function step(op) {
|
|
20
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
21
|
+
while (_) try {
|
|
22
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
23
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
24
|
+
switch (op[0]) {
|
|
25
|
+
case 0: case 1: t = op; break;
|
|
26
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
27
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
28
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
29
|
+
default:
|
|
30
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
31
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
32
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
33
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
34
|
+
if (t[2]) _.ops.pop();
|
|
35
|
+
_.trys.pop(); continue;
|
|
36
|
+
}
|
|
37
|
+
op = body.call(thisArg, _);
|
|
38
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
39
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
40
|
+
}
|
|
41
|
+
};
|
|
6
42
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
43
|
var unixTerminal_1 = require("./unixTerminal");
|
|
8
44
|
var assert = require("assert");
|
|
@@ -212,68 +248,43 @@ if (process.platform !== 'win32') {
|
|
|
212
248
|
});
|
|
213
249
|
});
|
|
214
250
|
describe('spawn', function () {
|
|
215
|
-
it('should handle exec() errors', function (done) {
|
|
216
|
-
try {
|
|
217
|
-
new unixTerminal_1.UnixTerminal('/bin/bogus.exe', []);
|
|
218
|
-
done(new Error('should have failed'));
|
|
219
|
-
}
|
|
220
|
-
catch (_a) {
|
|
221
|
-
done();
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
it('should handle chdir() errors', function (done) {
|
|
225
|
-
try {
|
|
226
|
-
new unixTerminal_1.UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
227
|
-
done(new Error('should have failed'));
|
|
228
|
-
}
|
|
229
|
-
catch (e) {
|
|
230
|
-
assert.strictEqual(e.toString(), 'Error: chdir() failed: No such file or directory');
|
|
231
|
-
done();
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
it('should handle setuid() errors', function (done) {
|
|
235
|
-
try {
|
|
236
|
-
new unixTerminal_1.UnixTerminal('/bin/echo', [], { uid: 999999 });
|
|
237
|
-
done(new Error('should have failed'));
|
|
238
|
-
}
|
|
239
|
-
catch (e) {
|
|
240
|
-
assert.strictEqual(e.toString(), 'Error: setuid() failed: Operation not permitted');
|
|
241
|
-
done();
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
251
|
if (process.platform === 'linux') {
|
|
245
|
-
it('should
|
|
246
|
-
var
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
stdio: ['ignore', 'pipe', 'pipe', readFd]
|
|
251
|
-
});
|
|
252
|
-
var sub = '';
|
|
253
|
-
p.stdout.on('data', function (data) {
|
|
254
|
-
if (!data.toString().indexOf('ready')) {
|
|
255
|
-
sub = data.toString().split(' ')[1].slice(0, -1);
|
|
256
|
-
try {
|
|
257
|
-
fs.statSync("/proc/" + sub + "/fd/" + readFd);
|
|
258
|
-
}
|
|
259
|
-
catch (_) {
|
|
260
|
-
done('not reachable');
|
|
261
|
-
}
|
|
262
|
-
setTimeout(function () {
|
|
263
|
-
process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
|
|
264
|
-
p.kill('SIGINT'); // SIGINT to parent
|
|
265
|
-
}, 200);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
|
|
269
|
-
}
|
|
252
|
+
it('should handle exec() errors', function (done) {
|
|
253
|
+
var term = new unixTerminal_1.UnixTerminal('/bin/bogus.exe', []);
|
|
254
|
+
term.on('exit', function (code, signal) {
|
|
255
|
+
assert.strictEqual(code, 1);
|
|
256
|
+
done();
|
|
270
257
|
});
|
|
271
|
-
|
|
258
|
+
});
|
|
259
|
+
it('should handle chdir() errors', function (done) {
|
|
260
|
+
var term = new unixTerminal_1.UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
261
|
+
term.on('exit', function (code, signal) {
|
|
262
|
+
assert.strictEqual(code, 1);
|
|
272
263
|
done();
|
|
273
264
|
});
|
|
274
265
|
});
|
|
275
|
-
|
|
276
|
-
|
|
266
|
+
}
|
|
267
|
+
else if (process.platform === 'darwin') {
|
|
268
|
+
it('should handle exec() errors', function (done) {
|
|
269
|
+
try {
|
|
270
|
+
new unixTerminal_1.UnixTerminal('/bin/bogus.exe', []);
|
|
271
|
+
done(new Error('should have failed'));
|
|
272
|
+
}
|
|
273
|
+
catch (_a) {
|
|
274
|
+
done();
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
it('should handle chdir() errors', function (done) {
|
|
278
|
+
try {
|
|
279
|
+
new unixTerminal_1.UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
280
|
+
done(new Error('should have failed'));
|
|
281
|
+
}
|
|
282
|
+
catch (e) {
|
|
283
|
+
done();
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
it('should close on exec', function (done) {
|
|
287
|
+
var data = "\n var pty = require('./lib/index');\n var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log(\"hello from terminal\"), 300);']);\n ptyProcess.on('data', function (data) {\n console.log(data);\n });\n setTimeout(() => null, 500);\n console.log('ready', ptyProcess.pid);\n ";
|
|
277
288
|
var buffer = [];
|
|
278
289
|
var readFd = fs.openSync(FIXTURES_PATH, 'r');
|
|
279
290
|
var p = cp.spawn('node', ['-e', data], {
|
|
@@ -304,6 +315,29 @@ if (process.platform !== 'win32') {
|
|
|
304
315
|
});
|
|
305
316
|
});
|
|
306
317
|
}
|
|
318
|
+
it('should not leak child process', function (done) {
|
|
319
|
+
var count = cp.execSync('ps -ax | grep node | wc -l');
|
|
320
|
+
var term = new unixTerminal_1.UnixTerminal('node', ['-e', "\n console.log('ready');\n setTimeout(()=>console.log('timeout'), 200);"
|
|
321
|
+
]);
|
|
322
|
+
term.on('data', function (data) { return __awaiter(void 0, void 0, void 0, function () {
|
|
323
|
+
var newCount;
|
|
324
|
+
return __generator(this, function (_a) {
|
|
325
|
+
switch (_a.label) {
|
|
326
|
+
case 0:
|
|
327
|
+
if (!(data === 'ready\r\n')) return [3 /*break*/, 2];
|
|
328
|
+
process.kill(term.pid, 'SIGINT');
|
|
329
|
+
return [4 /*yield*/, setTimeout(function () { return null; }, 1000)];
|
|
330
|
+
case 1:
|
|
331
|
+
_a.sent();
|
|
332
|
+
newCount = cp.execSync('ps -ax | grep node | wc -l');
|
|
333
|
+
assert.strictEqual(count.toString(), newCount.toString());
|
|
334
|
+
done();
|
|
335
|
+
_a.label = 2;
|
|
336
|
+
case 2: return [2 /*return*/];
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}); });
|
|
340
|
+
});
|
|
307
341
|
});
|
|
308
342
|
});
|
|
309
343
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unixTerminal.test.js","sourceRoot":"","sources":["../src/unixTerminal.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"unixTerminal.test.js","sourceRoot":"","sources":["../src/unixTerminal.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/scripts/post-install.js
CHANGED
|
@@ -9,7 +9,6 @@ var BUILD_FILES = [
|
|
|
9
9
|
path.join(RELEASE_DIR, 'conpty_console_list.pdb'),
|
|
10
10
|
path.join(RELEASE_DIR, 'pty.node'),
|
|
11
11
|
path.join(RELEASE_DIR, 'pty.pdb'),
|
|
12
|
-
path.join(RELEASE_DIR, 'spawn-helper'),
|
|
13
12
|
path.join(RELEASE_DIR, 'winpty-agent.exe'),
|
|
14
13
|
path.join(RELEASE_DIR, 'winpty-agent.pdb'),
|
|
15
14
|
path.join(RELEASE_DIR, 'winpty.dll'),
|
package/src/interfaces.ts
CHANGED
package/src/native.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ interface IWinptyNative {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
interface IUnixNative {
|
|
21
|
-
fork(file: string, args: string[], parsedEnv: string[], cwd: string, cols: number, rows: number, uid: number, gid: number,
|
|
21
|
+
fork(file: string, args: string[], parsedEnv: string[], cwd: string, cols: number, rows: number, uid: number, gid: number, useUtf8: boolean, onExitCallback: (code: number, signal: number) => void): IUnixProcess;
|
|
22
22
|
open(cols: number, rows: number): IUnixOpenProcess;
|
|
23
23
|
process(fd: number, pty: string): string;
|
|
24
24
|
resize(fd: number, cols: number, rows: number): void;
|
package/src/unix/pty.cc
CHANGED
|
@@ -29,26 +29,15 @@
|
|
|
29
29
|
#include <sys/wait.h>
|
|
30
30
|
#include <fcntl.h>
|
|
31
31
|
#include <signal.h>
|
|
32
|
-
#include <spawn.h>
|
|
33
|
-
|
|
34
|
-
#include "comms.h"
|
|
35
32
|
|
|
36
33
|
/* forkpty */
|
|
37
34
|
/* http://www.gnu.org/software/gnulib/manual/html_node/forkpty.html */
|
|
38
|
-
#if defined(
|
|
35
|
+
#if defined(__linux__)
|
|
39
36
|
#include <pty.h>
|
|
40
|
-
#elif defined(__APPLE__)
|
|
37
|
+
#elif defined(__APPLE__)
|
|
41
38
|
#include <util.h>
|
|
42
|
-
#elif defined(__FreeBSD__)
|
|
43
|
-
#include <libutil.h>
|
|
44
|
-
#elif defined(__sun)
|
|
45
|
-
#include <stropts.h> /* for I_PUSH */
|
|
46
|
-
#else
|
|
47
|
-
#include <pty.h>
|
|
48
39
|
#endif
|
|
49
40
|
|
|
50
|
-
#include <termios.h> /* tcgetattr, tty_ioctl */
|
|
51
|
-
|
|
52
41
|
/* Some platforms name VWERASE and VDISCARD differently */
|
|
53
42
|
#if !defined(VWERASE) && defined(VWERSE)
|
|
54
43
|
#define VWERASE VWERSE
|
|
@@ -62,8 +51,13 @@
|
|
|
62
51
|
#include <stdio.h>
|
|
63
52
|
#include <stdint.h>
|
|
64
53
|
#elif defined(__APPLE__)
|
|
65
|
-
#include <sys/sysctl.h>
|
|
66
54
|
#include <libproc.h>
|
|
55
|
+
#include <os/availability.h>
|
|
56
|
+
#include <paths.h>
|
|
57
|
+
#include <spawn.h>
|
|
58
|
+
#include <sys/event.h>
|
|
59
|
+
#include <sys/sysctl.h>
|
|
60
|
+
#include <termios.h>
|
|
67
61
|
#endif
|
|
68
62
|
|
|
69
63
|
/* NSIG - macro for highest signal + 1, should be defined */
|
|
@@ -71,15 +65,36 @@
|
|
|
71
65
|
#define NSIG 32
|
|
72
66
|
#endif
|
|
73
67
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
#
|
|
77
|
-
|
|
78
|
-
|
|
68
|
+
/* macOS 10.14 back does not define this constant */
|
|
69
|
+
#ifndef POSIX_SPAWN_SETSID
|
|
70
|
+
#define POSIX_SPAWN_SETSID 1024
|
|
71
|
+
#endif
|
|
72
|
+
|
|
73
|
+
/* environ for execvpe */
|
|
74
|
+
/* node/src/node_child_process.cc */
|
|
75
|
+
#if !defined(__APPLE__)
|
|
76
|
+
extern char **environ;
|
|
79
77
|
#endif
|
|
80
78
|
|
|
81
|
-
#
|
|
82
|
-
|
|
79
|
+
#if defined(__APPLE__)
|
|
80
|
+
extern "C" {
|
|
81
|
+
// Changes the current thread's directory to a path or directory file
|
|
82
|
+
// descriptor. libpthread only exposes a syscall wrapper starting in
|
|
83
|
+
// macOS 10.12, but the system call dates back to macOS 10.5. On older OSes,
|
|
84
|
+
// the syscall is issued directly.
|
|
85
|
+
int pthread_chdir_np(const char* dir) API_AVAILABLE(macosx(10.12));
|
|
86
|
+
int pthread_fchdir_np(int fd) API_AVAILABLE(macosx(10.12));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
#define HANDLE_EINTR(x) ({ \
|
|
90
|
+
int eintr_wrapper_counter = 0; \
|
|
91
|
+
decltype(x) eintr_wrapper_result; \
|
|
92
|
+
do { \
|
|
93
|
+
eintr_wrapper_result = (x); \
|
|
94
|
+
} while (eintr_wrapper_result == -1 && errno == EINTR && \
|
|
95
|
+
eintr_wrapper_counter++ < 100); \
|
|
96
|
+
eintr_wrapper_result; \
|
|
97
|
+
})
|
|
83
98
|
#endif
|
|
84
99
|
|
|
85
100
|
/**
|
|
@@ -114,11 +129,6 @@ pty_nonblock(int);
|
|
|
114
129
|
static char *
|
|
115
130
|
pty_getproc(int, char *);
|
|
116
131
|
|
|
117
|
-
static int
|
|
118
|
-
pty_openpty(int *, int *, char *,
|
|
119
|
-
const struct termios *,
|
|
120
|
-
const struct winsize *);
|
|
121
|
-
|
|
122
132
|
static void
|
|
123
133
|
pty_waitpid(void *);
|
|
124
134
|
|
|
@@ -128,16 +138,21 @@ pty_after_waitpid(uv_async_t *);
|
|
|
128
138
|
static void
|
|
129
139
|
pty_after_close(uv_handle_t *);
|
|
130
140
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
141
|
+
#if defined(__APPLE__) || defined(__OpenBSD__)
|
|
142
|
+
static void
|
|
143
|
+
pty_posix_spawn(char** argv, char** env,
|
|
144
|
+
char* cwd,
|
|
145
|
+
const struct termios *termp,
|
|
146
|
+
const struct winsize *winp,
|
|
147
|
+
int* master,
|
|
148
|
+
pid_t* pid,
|
|
149
|
+
int* err);
|
|
150
|
+
#endif
|
|
136
151
|
|
|
137
152
|
NAN_METHOD(PtyFork) {
|
|
138
153
|
Nan::HandleScope scope;
|
|
139
154
|
|
|
140
|
-
if (info.Length() !=
|
|
155
|
+
if (info.Length() != 10 ||
|
|
141
156
|
!info[0]->IsString() ||
|
|
142
157
|
!info[1]->IsArray() ||
|
|
143
158
|
!info[2]->IsArray() ||
|
|
@@ -147,11 +162,9 @@ NAN_METHOD(PtyFork) {
|
|
|
147
162
|
!info[6]->IsNumber() ||
|
|
148
163
|
!info[7]->IsNumber() ||
|
|
149
164
|
!info[8]->IsBoolean() ||
|
|
150
|
-
!info[9]->
|
|
151
|
-
!info[10]->IsFunction() ||
|
|
152
|
-
!info[11]->IsString()) {
|
|
165
|
+
!info[9]->IsFunction()) {
|
|
153
166
|
return Nan::ThrowError(
|
|
154
|
-
"Usage: pty.fork(file, args, env, cwd, cols, rows, uid, gid, utf8,
|
|
167
|
+
"Usage: pty.fork(file, args, env, cwd, cols, rows, uid, gid, utf8, onexit)");
|
|
155
168
|
}
|
|
156
169
|
|
|
157
170
|
// file
|
|
@@ -172,6 +185,7 @@ NAN_METHOD(PtyFork) {
|
|
|
172
185
|
|
|
173
186
|
// cwd
|
|
174
187
|
Nan::Utf8String cwd_(info[3]);
|
|
188
|
+
char* cwd = strdup(*cwd_);
|
|
175
189
|
|
|
176
190
|
// size
|
|
177
191
|
struct winsize winp;
|
|
@@ -180,9 +194,11 @@ NAN_METHOD(PtyFork) {
|
|
|
180
194
|
winp.ws_xpixel = 0;
|
|
181
195
|
winp.ws_ypixel = 0;
|
|
182
196
|
|
|
197
|
+
#if !defined(__APPLE__)
|
|
183
198
|
// uid / gid
|
|
184
199
|
int uid = info[6]->IntegerValue(Nan::GetCurrentContext()).FromJust();
|
|
185
200
|
int gid = info[7]->IntegerValue(Nan::GetCurrentContext()).FromJust();
|
|
201
|
+
#endif
|
|
186
202
|
|
|
187
203
|
// termios
|
|
188
204
|
struct termios t = termios();
|
|
@@ -219,36 +235,35 @@ NAN_METHOD(PtyFork) {
|
|
|
219
235
|
term->c_cc[VSTATUS] = 20;
|
|
220
236
|
#endif
|
|
221
237
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
bool explicitlyCloseFDs = closeFDs && !HAVE_POSIX_SPAWN_CLOEXEC_DEFAULT;
|
|
225
|
-
|
|
226
|
-
// helperPath
|
|
227
|
-
Nan::Utf8String helper_path_(info[11]);
|
|
228
|
-
char *helper_path = strdup(*helper_path_);
|
|
238
|
+
cfsetispeed(term, B38400);
|
|
239
|
+
cfsetospeed(term, B38400);
|
|
229
240
|
|
|
230
|
-
const int EXTRA_ARGS = 6;
|
|
231
241
|
int argc = argv_->Length();
|
|
232
|
-
int argl = argc +
|
|
242
|
+
int argl = argc + 2;
|
|
233
243
|
char **argv = new char*[argl];
|
|
234
|
-
argv[0] = strdup(
|
|
235
|
-
argv[1] = strdup(*cwd_);
|
|
236
|
-
argv[2] = strdup(std::to_string(uid).c_str());
|
|
237
|
-
argv[3] = strdup(std::to_string(gid).c_str());
|
|
238
|
-
argv[4] = strdup(explicitlyCloseFDs ? "1": "0");
|
|
239
|
-
argv[5] = strdup(*file);
|
|
244
|
+
argv[0] = strdup(*file);
|
|
240
245
|
argv[argl - 1] = NULL;
|
|
241
246
|
for (int i = 0; i < argc; i++) {
|
|
242
247
|
Nan::Utf8String arg(Nan::Get(argv_, i).ToLocalChecked());
|
|
243
|
-
argv[i +
|
|
248
|
+
argv[i + 1] = strdup(*arg);
|
|
244
249
|
}
|
|
245
250
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
251
|
+
pid_t pid;
|
|
252
|
+
int master;
|
|
253
|
+
#if defined(__APPLE__)
|
|
254
|
+
int err = 0;
|
|
255
|
+
pty_posix_spawn(argv, env, cwd, term, &winp, &master, &pid, &err);
|
|
256
|
+
if (err != 0) {
|
|
257
|
+
Nan::ThrowError("posix_spawnp failed.");
|
|
258
|
+
goto done;
|
|
259
|
+
}
|
|
260
|
+
if (pty_nonblock(master) == -1) {
|
|
261
|
+
Nan::ThrowError("Could not set master fd to nonblocking.");
|
|
262
|
+
goto done;
|
|
263
|
+
}
|
|
264
|
+
#else
|
|
249
265
|
sigset_t newmask, oldmask;
|
|
250
|
-
|
|
251
|
-
|
|
266
|
+
struct sigaction sig_action;
|
|
252
267
|
// temporarily block all signals
|
|
253
268
|
// this is needed due to a race condition in openpty
|
|
254
269
|
// and to avoid running signal handlers in the child
|
|
@@ -256,72 +271,69 @@ NAN_METHOD(PtyFork) {
|
|
|
256
271
|
sigfillset(&newmask);
|
|
257
272
|
pthread_sigmask(SIG_SETMASK, &newmask, &oldmask);
|
|
258
273
|
|
|
259
|
-
|
|
260
|
-
int ret = pty_openpty(&master, &slave, nullptr, term, &winp);
|
|
261
|
-
if (ret == -1) {
|
|
262
|
-
perror("openpty failed");
|
|
263
|
-
Nan::ThrowError("openpty failed.");
|
|
264
|
-
goto done;
|
|
265
|
-
}
|
|
274
|
+
pid = forkpty(&master, nullptr, static_cast<termios*>(term), static_cast<winsize*>(&winp));
|
|
266
275
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
276
|
+
if (!pid) {
|
|
277
|
+
// remove all signal handler from child
|
|
278
|
+
sig_action.sa_handler = SIG_DFL;
|
|
279
|
+
sig_action.sa_flags = 0;
|
|
280
|
+
sigemptyset(&sig_action.sa_mask);
|
|
281
|
+
for (int i = 0 ; i < NSIG ; i++) { // NSIG is a macro for all signals + 1
|
|
282
|
+
sigaction(i, &sig_action, NULL);
|
|
283
|
+
}
|
|
284
|
+
} else {
|
|
285
|
+
for (int i = 0; i < argl; i++) free(argv[i]);
|
|
286
|
+
delete[] argv;
|
|
273
287
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
posix_spawn_file_actions_adddup2(&acts, slave, STDIN_FILENO);
|
|
277
|
-
posix_spawn_file_actions_adddup2(&acts, slave, STDOUT_FILENO);
|
|
278
|
-
posix_spawn_file_actions_adddup2(&acts, slave, STDERR_FILENO);
|
|
279
|
-
posix_spawn_file_actions_adddup2(&acts, comms_pipe[1], COMM_PIPE_FD);
|
|
280
|
-
posix_spawn_file_actions_addclose(&acts, comms_pipe[1]);
|
|
288
|
+
for (int i = 0; i < envc; i++) free(env[i]);
|
|
289
|
+
delete[] env;
|
|
281
290
|
|
|
282
|
-
|
|
283
|
-
posix_spawnattr_init(&attrs);
|
|
284
|
-
if (closeFDs) {
|
|
285
|
-
flags |= POSIX_SPAWN_CLOEXEC_DEFAULT;
|
|
291
|
+
free(cwd);
|
|
286
292
|
}
|
|
287
|
-
posix_spawnattr_setflags(&attrs, flags);
|
|
288
|
-
|
|
289
|
-
{ // suppresses "jump bypasses variable initialization" errors
|
|
290
|
-
pid_t pid;
|
|
291
|
-
auto error = posix_spawn(&pid, argv[0], &acts, &attrs, argv, env);
|
|
292
293
|
|
|
293
|
-
|
|
294
|
+
// reenable signals
|
|
295
|
+
pthread_sigmask(SIG_SETMASK, &oldmask, NULL);
|
|
294
296
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (error) {
|
|
299
|
-
throw_for_errno("posix_spawn failed: ", error);
|
|
297
|
+
switch (pid) {
|
|
298
|
+
case -1:
|
|
299
|
+
Nan::ThrowError("forkpty(3) failed.");
|
|
300
300
|
goto done;
|
|
301
|
-
|
|
301
|
+
case 0:
|
|
302
|
+
if (strlen(cwd)) {
|
|
303
|
+
if (chdir(cwd) == -1) {
|
|
304
|
+
perror("chdir(2) failed.");
|
|
305
|
+
_exit(1);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
302
308
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
} else if (helper_error[0] == COMM_ERR_SETUID) {
|
|
313
|
-
throw_for_errno("setuid() failed: ", helper_error[1]);
|
|
314
|
-
} else if (helper_error[0] == COMM_ERR_SETGID) {
|
|
315
|
-
throw_for_errno("setgid() failed: ", helper_error[1]);
|
|
309
|
+
if (uid != -1 && gid != -1) {
|
|
310
|
+
if (setgid(gid) == -1) {
|
|
311
|
+
perror("setgid(2) failed.");
|
|
312
|
+
_exit(1);
|
|
313
|
+
}
|
|
314
|
+
if (setuid(uid) == -1) {
|
|
315
|
+
perror("setuid(2) failed.");
|
|
316
|
+
_exit(1);
|
|
317
|
+
}
|
|
316
318
|
}
|
|
317
|
-
goto done;
|
|
318
|
-
}
|
|
319
319
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
320
|
+
{
|
|
321
|
+
char **old = environ;
|
|
322
|
+
environ = env;
|
|
323
|
+
execvp(argv[0], argv);
|
|
324
|
+
environ = old;
|
|
325
|
+
perror("execvp(3) failed.");
|
|
326
|
+
_exit(1);
|
|
327
|
+
}
|
|
328
|
+
default:
|
|
329
|
+
if (pty_nonblock(master) == -1) {
|
|
330
|
+
Nan::ThrowError("Could not set master fd to nonblocking.");
|
|
331
|
+
goto done;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
#endif
|
|
324
335
|
|
|
336
|
+
{
|
|
325
337
|
v8::Local<v8::Object> obj = Nan::New<v8::Object>();
|
|
326
338
|
Nan::Set(obj,
|
|
327
339
|
Nan::New<v8::String>("fd").ToLocalChecked(),
|
|
@@ -336,7 +348,7 @@ NAN_METHOD(PtyFork) {
|
|
|
336
348
|
pty_baton *baton = new pty_baton();
|
|
337
349
|
baton->exit_code = 0;
|
|
338
350
|
baton->signal_code = 0;
|
|
339
|
-
baton->cb.Reset(v8::Local<v8::Function>::Cast(info[
|
|
351
|
+
baton->cb.Reset(v8::Local<v8::Function>::Cast(info[9]));
|
|
340
352
|
baton->pid = pid;
|
|
341
353
|
baton->async.data = baton;
|
|
342
354
|
|
|
@@ -344,21 +356,20 @@ NAN_METHOD(PtyFork) {
|
|
|
344
356
|
|
|
345
357
|
uv_thread_create(&baton->tid, pty_waitpid, static_cast<void*>(baton));
|
|
346
358
|
|
|
347
|
-
info.GetReturnValue().Set(obj);
|
|
359
|
+
return info.GetReturnValue().Set(obj);
|
|
348
360
|
}
|
|
361
|
+
|
|
349
362
|
done:
|
|
350
|
-
|
|
351
|
-
|
|
363
|
+
#if defined(__APPLE__)
|
|
364
|
+
for (int i = 0; i < argl; i++) free(argv[i]);
|
|
365
|
+
delete[] argv;
|
|
352
366
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
delete[] env;
|
|
360
|
-
}
|
|
361
|
-
free(helper_path);
|
|
367
|
+
for (int i = 0; i < envc; i++) free(env[i]);
|
|
368
|
+
delete[] env;
|
|
369
|
+
|
|
370
|
+
free(cwd);
|
|
371
|
+
#endif
|
|
372
|
+
return info.GetReturnValue().SetUndefined();
|
|
362
373
|
}
|
|
363
374
|
|
|
364
375
|
NAN_METHOD(PtyOpen) {
|
|
@@ -379,7 +390,7 @@ NAN_METHOD(PtyOpen) {
|
|
|
379
390
|
|
|
380
391
|
// pty
|
|
381
392
|
int master, slave;
|
|
382
|
-
int ret =
|
|
393
|
+
int ret = openpty(&master, &slave, nullptr, NULL, static_cast<winsize*>(&winp));
|
|
383
394
|
|
|
384
395
|
if (ret == -1) {
|
|
385
396
|
return Nan::ThrowError("openpty(3) failed.");
|
|
@@ -486,11 +497,44 @@ static void
|
|
|
486
497
|
pty_waitpid(void *data) {
|
|
487
498
|
int ret;
|
|
488
499
|
int stat_loc;
|
|
489
|
-
|
|
490
500
|
pty_baton *baton = static_cast<pty_baton*>(data);
|
|
491
|
-
|
|
492
501
|
errno = 0;
|
|
493
|
-
|
|
502
|
+
#if defined(__APPLE__)
|
|
503
|
+
// Based on
|
|
504
|
+
// https://source.chromium.org/chromium/chromium/src/+/main:base/process/kill_mac.cc;l=35-69?
|
|
505
|
+
int kq = HANDLE_EINTR(kqueue());
|
|
506
|
+
struct kevent change = {0};
|
|
507
|
+
EV_SET(&change, baton->pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
|
|
508
|
+
ret = HANDLE_EINTR(kevent(kq, &change, 1, NULL, 0, NULL));
|
|
509
|
+
if (ret == -1) {
|
|
510
|
+
if (errno == ESRCH) {
|
|
511
|
+
// At this point, one of the following has occurred:
|
|
512
|
+
// 1. The process has died but has not yet been reaped.
|
|
513
|
+
// 2. The process has died and has already been reaped.
|
|
514
|
+
// 3. The process is in the process of dying. It's no longer
|
|
515
|
+
// kqueueable, but it may not be waitable yet either. Mark calls
|
|
516
|
+
// this case the "zombie death race".
|
|
517
|
+
ret = HANDLE_EINTR(waitpid(baton->pid, &stat_loc, WNOHANG));
|
|
518
|
+
if (ret == 0) {
|
|
519
|
+
ret = kill(baton->pid, SIGKILL);
|
|
520
|
+
if (ret != -1) {
|
|
521
|
+
HANDLE_EINTR(waitpid(baton->pid, &stat_loc, 0));
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
} else {
|
|
526
|
+
struct kevent event = {0};
|
|
527
|
+
ret = HANDLE_EINTR(kevent(kq, NULL, 0, &event, 1, NULL));
|
|
528
|
+
if (ret == 1) {
|
|
529
|
+
if ((event.fflags & NOTE_EXIT) &&
|
|
530
|
+
(event.ident == static_cast<uintptr_t>(baton->pid))) {
|
|
531
|
+
// The process is dead or dying. This won't block for long, if at
|
|
532
|
+
// all.
|
|
533
|
+
HANDLE_EINTR(waitpid(baton->pid, &stat_loc, 0));
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
#else
|
|
494
538
|
if ((ret = waitpid(baton->pid, &stat_loc, 0)) != baton->pid) {
|
|
495
539
|
if (ret == -1 && errno == EINTR) {
|
|
496
540
|
return pty_waitpid(baton);
|
|
@@ -503,6 +547,7 @@ pty_waitpid(void *data) {
|
|
|
503
547
|
assert(false);
|
|
504
548
|
}
|
|
505
549
|
}
|
|
550
|
+
#endif
|
|
506
551
|
|
|
507
552
|
if (WIFEXITED(stat_loc)) {
|
|
508
553
|
baton->exit_code = WEXITSTATUS(stat_loc); // errno?
|
|
@@ -648,50 +693,194 @@ pty_getproc(int fd, char *tty) {
|
|
|
648
693
|
|
|
649
694
|
#endif
|
|
650
695
|
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
696
|
+
#if defined(__APPLE__)
|
|
697
|
+
static void
|
|
698
|
+
pty_posix_spawn(char** argv, char** env,
|
|
699
|
+
char* cwd,
|
|
700
|
+
const struct termios *termp,
|
|
701
|
+
const struct winsize *winp,
|
|
702
|
+
int* master,
|
|
703
|
+
pid_t* pid,
|
|
704
|
+
int* err) {
|
|
705
|
+
int low_fds[3];
|
|
706
|
+
size_t count = 0;
|
|
707
|
+
const char *p;
|
|
708
|
+
const char *z;
|
|
709
|
+
size_t l;
|
|
710
|
+
size_t k;
|
|
711
|
+
int seen_eacces;
|
|
712
|
+
const char *path;
|
|
713
|
+
char** env_iterator;
|
|
714
|
+
const char path_var[] = "PATH=";
|
|
715
|
+
|
|
716
|
+
for (; count < 3; count++) {
|
|
717
|
+
low_fds[count] = posix_openpt(O_RDWR);
|
|
718
|
+
if (low_fds[count] >= STDERR_FILENO)
|
|
719
|
+
break;
|
|
720
|
+
}
|
|
654
721
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
722
|
+
int flags = POSIX_SPAWN_CLOEXEC_DEFAULT |
|
|
723
|
+
POSIX_SPAWN_SETSIGDEF |
|
|
724
|
+
POSIX_SPAWN_SETSIGMASK |
|
|
725
|
+
POSIX_SPAWN_SETSID;
|
|
726
|
+
*master = posix_openpt(O_RDWR);
|
|
727
|
+
if (*master == -1) {
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
int res = grantpt(*master) || unlockpt(*master);
|
|
732
|
+
if (res == -1) {
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
// Use TIOCPTYGNAME instead of ptsname() to avoid threading problems.
|
|
663
737
|
int slave;
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
if (
|
|
738
|
+
char slave_pty_name[128];
|
|
739
|
+
res = ioctl(*master, TIOCPTYGNAME, slave_pty_name);
|
|
740
|
+
if (res == -1) {
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
667
743
|
|
|
668
|
-
|
|
669
|
-
if (
|
|
744
|
+
slave = open(slave_pty_name, O_RDWR | O_NOCTTY);
|
|
745
|
+
if (slave == -1) {
|
|
746
|
+
return;
|
|
747
|
+
}
|
|
670
748
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
749
|
+
if (termp) {
|
|
750
|
+
res = tcsetattr(slave, TCSANOW, termp);
|
|
751
|
+
if (res == -1) {
|
|
752
|
+
return;
|
|
753
|
+
};
|
|
754
|
+
}
|
|
674
755
|
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
756
|
+
if (winp) {
|
|
757
|
+
res = ioctl(slave, TIOCSWINSZ, winp);
|
|
758
|
+
if (res == -1) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
}
|
|
678
762
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
763
|
+
posix_spawn_file_actions_t acts;
|
|
764
|
+
posix_spawn_file_actions_init(&acts);
|
|
765
|
+
posix_spawn_file_actions_adddup2(&acts, slave, STDIN_FILENO);
|
|
766
|
+
posix_spawn_file_actions_adddup2(&acts, slave, STDOUT_FILENO);
|
|
767
|
+
posix_spawn_file_actions_adddup2(&acts, slave, STDERR_FILENO);
|
|
768
|
+
posix_spawn_file_actions_addclose(&acts, slave);
|
|
769
|
+
posix_spawn_file_actions_addclose(&acts, *master);
|
|
770
|
+
if (strlen(cwd)) {
|
|
771
|
+
if (__builtin_available(macOS 10.15, *)) {
|
|
772
|
+
posix_spawn_file_actions_addchdir_np(&acts, cwd);
|
|
773
|
+
} else {
|
|
774
|
+
*err = pthread_chdir_np(cwd);
|
|
775
|
+
if (*err != 0) {
|
|
776
|
+
goto done;
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
682
780
|
|
|
683
|
-
|
|
684
|
-
|
|
781
|
+
posix_spawnattr_t attrs;
|
|
782
|
+
posix_spawnattr_init(&attrs);
|
|
783
|
+
*err = posix_spawnattr_setflags(&attrs, flags);
|
|
784
|
+
if (*err != 0) {
|
|
785
|
+
goto done;
|
|
786
|
+
}
|
|
685
787
|
|
|
686
|
-
|
|
788
|
+
sigset_t signal_set;
|
|
789
|
+
/* Reset all signal the child to their default behavior */
|
|
790
|
+
sigfillset(&signal_set);
|
|
791
|
+
*err = posix_spawnattr_setsigdefault(&attrs, &signal_set);
|
|
792
|
+
if (*err != 0) {
|
|
793
|
+
goto done;
|
|
794
|
+
}
|
|
687
795
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
796
|
+
/* Reset the signal mask for all signals */
|
|
797
|
+
sigemptyset(&signal_set);
|
|
798
|
+
*err = posix_spawnattr_setsigmask(&attrs, &signal_set);
|
|
799
|
+
if (*err != 0) {
|
|
800
|
+
goto done;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
// path resolution is copied from
|
|
804
|
+
// https://github.com/libuv/libuv/blob/7b84d5b0ecb737b4cc30ce63eade690d994e00a6/src/unix/process.c#L695-L764
|
|
805
|
+
if (strchr(argv[0], '/') != NULL) {
|
|
806
|
+
do
|
|
807
|
+
*err = posix_spawn(pid, argv[0], &acts, &attrs, argv, env);
|
|
808
|
+
while (*err == EINTR);
|
|
809
|
+
} else {
|
|
810
|
+
|
|
811
|
+
for (env_iterator = env; *env_iterator != NULL; env_iterator++) {
|
|
812
|
+
if (strncmp(*env_iterator, path_var, sizeof(path_var) - 1) == 0) {
|
|
813
|
+
/* Found "PATH=" at the beginning of the string */
|
|
814
|
+
path = *env_iterator + sizeof(path_var) - 1;
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
if (path == NULL)
|
|
819
|
+
path = _PATH_DEFPATH;
|
|
820
|
+
|
|
821
|
+
k = strnlen(argv[0], NAME_MAX + 1);
|
|
822
|
+
if (k > NAME_MAX)
|
|
823
|
+
goto done;
|
|
824
|
+
|
|
825
|
+
l = strnlen(path, PATH_MAX - 1) + 1;
|
|
826
|
+
|
|
827
|
+
for (p = path;; p = z) {
|
|
828
|
+
/* Compose the new process file from the entry in the PATH
|
|
829
|
+
* environment variable and the actual file name */
|
|
830
|
+
char b[PATH_MAX + NAME_MAX];
|
|
831
|
+
z = strchr(p, ':');
|
|
832
|
+
if (!z)
|
|
833
|
+
z = p + strlen(p);
|
|
834
|
+
if ((size_t)(z - p) >= l) {
|
|
835
|
+
if (!*z++)
|
|
836
|
+
break;
|
|
837
|
+
|
|
838
|
+
continue;
|
|
839
|
+
}
|
|
840
|
+
memcpy(b, p, z - p);
|
|
841
|
+
b[z - p] = '/';
|
|
842
|
+
memcpy(b + (z - p) + (z > p), argv[0], k + 1);
|
|
843
|
+
|
|
844
|
+
do
|
|
845
|
+
*err = posix_spawn(pid, b, &acts, &attrs, argv, env);
|
|
846
|
+
while (*err == EINTR);
|
|
847
|
+
|
|
848
|
+
switch (*err) {
|
|
849
|
+
case EACCES:
|
|
850
|
+
seen_eacces = 1;
|
|
851
|
+
break; /* continue search */
|
|
852
|
+
case ENOENT:
|
|
853
|
+
case ENOTDIR:
|
|
854
|
+
break; /* continue search */
|
|
855
|
+
default:
|
|
856
|
+
goto done;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
if (!*z++)
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
if (seen_eacces)
|
|
864
|
+
goto done;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Restore the thread's working directory if it was changed.
|
|
868
|
+
if (strlen(cwd)) {
|
|
869
|
+
if (__builtin_available(macOS 10.15, *)) {
|
|
870
|
+
// __builtin_available is special and cannot be negated.
|
|
871
|
+
} else {
|
|
872
|
+
pthread_fchdir_np(-1);
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
done:
|
|
876
|
+
posix_spawn_file_actions_destroy(&acts);
|
|
877
|
+
posix_spawnattr_destroy(&attrs);
|
|
878
|
+
|
|
879
|
+
for (; count > 0; count--) {
|
|
880
|
+
close(low_fds[count]);
|
|
881
|
+
}
|
|
694
882
|
}
|
|
883
|
+
#endif
|
|
695
884
|
|
|
696
885
|
/**
|
|
697
886
|
* Init
|
package/src/unixTerminal.test.ts
CHANGED
|
@@ -255,75 +255,42 @@ if (process.platform !== 'win32') {
|
|
|
255
255
|
});
|
|
256
256
|
});
|
|
257
257
|
describe('spawn', () => {
|
|
258
|
-
it('should handle exec() errors', (done) => {
|
|
259
|
-
try {
|
|
260
|
-
new UnixTerminal('/bin/bogus.exe', []);
|
|
261
|
-
done(new Error('should have failed'));
|
|
262
|
-
} catch {
|
|
263
|
-
done();
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
it('should handle chdir() errors', (done) => {
|
|
267
|
-
try {
|
|
268
|
-
new UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
269
|
-
done(new Error('should have failed'));
|
|
270
|
-
} catch (e) {
|
|
271
|
-
assert.strictEqual((e as any).toString(), 'Error: chdir() failed: No such file or directory');
|
|
272
|
-
done();
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
it('should handle setuid() errors', (done) => {
|
|
276
|
-
try {
|
|
277
|
-
new UnixTerminal('/bin/echo', [], { uid: 999999 });
|
|
278
|
-
done(new Error('should have failed'));
|
|
279
|
-
} catch (e) {
|
|
280
|
-
assert.strictEqual((e as any).toString(), 'Error: setuid() failed: Operation not permitted');
|
|
281
|
-
done();
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
258
|
if (process.platform === 'linux') {
|
|
285
|
-
it('should
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
console.log(data);
|
|
291
|
-
});
|
|
292
|
-
setTimeout(() => null, 500);
|
|
293
|
-
console.log('ready', ptyProcess.pid);
|
|
294
|
-
`;
|
|
295
|
-
const buffer: string[] = [];
|
|
296
|
-
const readFd = fs.openSync(FIXTURES_PATH, 'r');
|
|
297
|
-
const p = cp.spawn('node', ['-e', data], {
|
|
298
|
-
stdio: ['ignore', 'pipe', 'pipe', readFd]
|
|
299
|
-
});
|
|
300
|
-
let sub = '';
|
|
301
|
-
p.stdout!.on('data', (data) => {
|
|
302
|
-
if (!data.toString().indexOf('ready')) {
|
|
303
|
-
sub = data.toString().split(' ')[1].slice(0, -1);
|
|
304
|
-
try {
|
|
305
|
-
fs.statSync(`/proc/${sub}/fd/${readFd}`);
|
|
306
|
-
} catch (_) {
|
|
307
|
-
done('not reachable');
|
|
308
|
-
}
|
|
309
|
-
setTimeout(() => {
|
|
310
|
-
process.kill(parseInt(sub), 'SIGINT'); // SIGINT to child
|
|
311
|
-
p.kill('SIGINT'); // SIGINT to parent
|
|
312
|
-
}, 200);
|
|
313
|
-
} else {
|
|
314
|
-
buffer.push(data.toString().replace(/^\s+|\s+$/g, ''));
|
|
315
|
-
}
|
|
259
|
+
it('should handle exec() errors', (done) => {
|
|
260
|
+
const term = new UnixTerminal('/bin/bogus.exe', []);
|
|
261
|
+
term.on('exit', (code, signal) => {
|
|
262
|
+
assert.strictEqual(code, 1);
|
|
263
|
+
done();
|
|
316
264
|
});
|
|
317
|
-
|
|
265
|
+
});
|
|
266
|
+
it('should handle chdir() errors', (done) => {
|
|
267
|
+
const term = new UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
268
|
+
term.on('exit', (code, signal) => {
|
|
269
|
+
assert.strictEqual(code, 1);
|
|
318
270
|
done();
|
|
319
271
|
});
|
|
320
272
|
});
|
|
321
|
-
|
|
273
|
+
} else if (process.platform === 'darwin') {
|
|
274
|
+
it('should handle exec() errors', (done) => {
|
|
275
|
+
try {
|
|
276
|
+
new UnixTerminal('/bin/bogus.exe', []);
|
|
277
|
+
done(new Error('should have failed'));
|
|
278
|
+
} catch {
|
|
279
|
+
done();
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
it('should handle chdir() errors', (done) => {
|
|
283
|
+
try {
|
|
284
|
+
new UnixTerminal('/bin/echo', [], { cwd: '/nowhere' });
|
|
285
|
+
done(new Error('should have failed'));
|
|
286
|
+
} catch (e) {
|
|
287
|
+
done();
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
it('should close on exec', (done) => {
|
|
322
291
|
const data = `
|
|
323
292
|
var pty = require('./lib/index');
|
|
324
|
-
var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("hello from terminal"), 300);']
|
|
325
|
-
closeFDs: true
|
|
326
|
-
});
|
|
293
|
+
var ptyProcess = pty.spawn('node', ['-e', 'setTimeout(() => console.log("hello from terminal"), 300);']);
|
|
327
294
|
ptyProcess.on('data', function (data) {
|
|
328
295
|
console.log(data);
|
|
329
296
|
});
|
|
@@ -358,6 +325,22 @@ if (process.platform !== 'win32') {
|
|
|
358
325
|
});
|
|
359
326
|
});
|
|
360
327
|
}
|
|
328
|
+
it('should not leak child process', (done) => {
|
|
329
|
+
const count = cp.execSync('ps -ax | grep node | wc -l');
|
|
330
|
+
const term = new UnixTerminal('node', [ '-e', `
|
|
331
|
+
console.log('ready');
|
|
332
|
+
setTimeout(()=>console.log('timeout'), 200);`
|
|
333
|
+
]);
|
|
334
|
+
term.on('data', async (data) => {
|
|
335
|
+
if (data === 'ready\r\n') {
|
|
336
|
+
process.kill(term.pid, 'SIGINT');
|
|
337
|
+
await setTimeout(() => null, 1000);
|
|
338
|
+
const newCount = cp.execSync('ps -ax | grep node | wc -l');
|
|
339
|
+
assert.strictEqual(count.toString(), newCount.toString());
|
|
340
|
+
done();
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
});
|
|
361
344
|
});
|
|
362
345
|
});
|
|
363
346
|
}
|
package/src/unixTerminal.ts
CHANGED
|
@@ -11,14 +11,11 @@ import { ArgvOrCommandLine } from './types';
|
|
|
11
11
|
import { assign } from './utils';
|
|
12
12
|
|
|
13
13
|
let pty: IUnixNative;
|
|
14
|
-
let helperPath: string;
|
|
15
14
|
try {
|
|
16
15
|
pty = require('../build/Release/pty.node');
|
|
17
|
-
helperPath = '../build/Release/spawn-helper';
|
|
18
16
|
} catch (outerError) {
|
|
19
17
|
try {
|
|
20
18
|
pty = require('../build/Debug/pty.node');
|
|
21
|
-
helperPath = '../build/Debug/spawn-helper';
|
|
22
19
|
} catch (innerError) {
|
|
23
20
|
console.error('innerError', innerError);
|
|
24
21
|
// Re-throw the exception from the Release require if the Debug require fails as well
|
|
@@ -26,10 +23,6 @@ try {
|
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
25
|
|
|
29
|
-
helperPath = path.resolve(__dirname, helperPath);
|
|
30
|
-
helperPath = helperPath.replace('app.asar', 'app.asar.unpacked');
|
|
31
|
-
helperPath = helperPath.replace('node_modules.asar', 'node_modules.asar.unpacked');
|
|
32
|
-
|
|
33
26
|
const DEFAULT_FILE = 'sh';
|
|
34
27
|
const DEFAULT_NAME = 'xterm';
|
|
35
28
|
const DESTROY_SOCKET_TIMEOUT_MS = 200;
|
|
@@ -69,7 +62,6 @@ export class UnixTerminal extends Terminal {
|
|
|
69
62
|
this._rows = opt.rows || DEFAULT_ROWS;
|
|
70
63
|
const uid = opt.uid ?? -1;
|
|
71
64
|
const gid = opt.gid ?? -1;
|
|
72
|
-
const closeFDs = opt.closeFDs || false;
|
|
73
65
|
const env: IProcessEnv = assign({}, opt.env);
|
|
74
66
|
|
|
75
67
|
if (opt.env === process.env) {
|
|
@@ -112,7 +104,7 @@ export class UnixTerminal extends Terminal {
|
|
|
112
104
|
};
|
|
113
105
|
|
|
114
106
|
// fork
|
|
115
|
-
const term = pty.fork(file, args, parsedEnv, cwd, this._cols, this._rows, uid, gid, (encoding === 'utf8'),
|
|
107
|
+
const term = pty.fork(file, args, parsedEnv, cwd, this._cols, this._rows, uid, gid, (encoding === 'utf8'), onexit);
|
|
116
108
|
|
|
117
109
|
this._socket = new PipeSocket(term.fd);
|
|
118
110
|
if (encoding !== null) {
|
package/typings/node-pty.d.ts
CHANGED
|
@@ -78,17 +78,11 @@ declare module 'node-pty' {
|
|
|
78
78
|
|
|
79
79
|
export interface IPtyForkOptions extends IBasePtyForkOptions {
|
|
80
80
|
/**
|
|
81
|
-
* Security warning: use this option with great caution
|
|
81
|
+
* Security warning: use this option with great caution,
|
|
82
82
|
* as opened file descriptors with higher privileges might leak to the child program.
|
|
83
83
|
*/
|
|
84
84
|
uid?: number;
|
|
85
85
|
gid?: number;
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Close all open file after spawning the child process (UNIX only).
|
|
89
|
-
* Carries a performance penalty on Linux.
|
|
90
|
-
*/
|
|
91
|
-
closeFDs?: boolean;
|
|
92
86
|
}
|
|
93
87
|
|
|
94
88
|
export interface IWindowsPtyForkOptions extends IBasePtyForkOptions {
|
package/src/unix/comms.h
DELETED
package/src/unix/spawn-helper.cc
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
#include <errno.h>
|
|
2
|
-
#include <fcntl.h>
|
|
3
|
-
#include <signal.h>
|
|
4
|
-
#include <string>
|
|
5
|
-
#include <sys/ioctl.h>
|
|
6
|
-
#include <sys/resource.h>
|
|
7
|
-
#include <termios.h>
|
|
8
|
-
#include <unistd.h>
|
|
9
|
-
#include <string.h>
|
|
10
|
-
|
|
11
|
-
#include "comms.h"
|
|
12
|
-
|
|
13
|
-
void bail (int type, int code) {
|
|
14
|
-
int buf[2] = { type, code };
|
|
15
|
-
(void)! write(COMM_PIPE_FD, &buf, sizeof(buf));
|
|
16
|
-
_exit(1);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
int main (int argc, char** argv) {
|
|
20
|
-
sigset_t empty_set;
|
|
21
|
-
sigemptyset(&empty_set);
|
|
22
|
-
pthread_sigmask(SIG_SETMASK, &empty_set, nullptr);
|
|
23
|
-
|
|
24
|
-
setsid();
|
|
25
|
-
|
|
26
|
-
#if defined(TIOCSCTTY)
|
|
27
|
-
// glibc does this
|
|
28
|
-
if (ioctl(STDIN_FILENO, TIOCSCTTY, NULL) == -1) {
|
|
29
|
-
_exit(1);
|
|
30
|
-
}
|
|
31
|
-
#else
|
|
32
|
-
char *slave_path = ttyname(STDIN_FILENO);
|
|
33
|
-
// open implicit attaches a process to a terminal device if:
|
|
34
|
-
// - process has no controlling terminal yet
|
|
35
|
-
// - O_NOCTTY is not set
|
|
36
|
-
close(open(slave_path, O_RDWR));
|
|
37
|
-
#endif
|
|
38
|
-
|
|
39
|
-
char *cwd = argv[1];
|
|
40
|
-
int uid = std::stoi(argv[2]);
|
|
41
|
-
int gid = std::stoi(argv[3]);
|
|
42
|
-
bool closeFDs = std::stoi(argv[4]);
|
|
43
|
-
char *file = argv[5];
|
|
44
|
-
argv = &argv[5];
|
|
45
|
-
|
|
46
|
-
fcntl(COMM_PIPE_FD, F_SETFD, FD_CLOEXEC);
|
|
47
|
-
|
|
48
|
-
if (strlen(cwd) && chdir(cwd) == -1) {
|
|
49
|
-
bail(COMM_ERR_CHDIR, errno);
|
|
50
|
-
}
|
|
51
|
-
if (uid != -1 && setuid(uid) == -1) {
|
|
52
|
-
bail(COMM_ERR_SETUID, errno);
|
|
53
|
-
}
|
|
54
|
-
if (gid != -1 && setgid(gid) == -1) {
|
|
55
|
-
bail(COMM_ERR_SETGID, errno);
|
|
56
|
-
}
|
|
57
|
-
if (closeFDs) {
|
|
58
|
-
struct rlimit rlim_ofile;
|
|
59
|
-
getrlimit(RLIMIT_NOFILE, &rlim_ofile);
|
|
60
|
-
for (rlim_t fd = STDERR_FILENO + 1; fd < rlim_ofile.rlim_cur; fd++) {
|
|
61
|
-
if (fd != COMM_PIPE_FD) {
|
|
62
|
-
close(fd);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
execvp(file, argv);
|
|
68
|
-
bail(COMM_ERR_EXEC, errno);
|
|
69
|
-
return 1;
|
|
70
|
-
}
|