summaryrefslogtreecommitdiff
path: root/test/parallel/test-process-dlopen-error-message-crash.js
blob: d678021764e8f424b6ace5a1e678927df816e88b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
'use strict';

// This is a regression test for some scenarios in which node would pass
// unsanitized user input to a printf-like formatting function when dlopen
// fails, potentially crashing the process.

const common = require('../common');
const tmpdir = require('../common/tmpdir');
tmpdir.refresh();

const assert = require('assert');
const fs = require('fs');

// This error message should not be passed to a printf-like function.
assert.throws(() => {
  process.dlopen({ exports: {} }, 'foo-%s.node');
}, ({ name, code, message }) => {
  assert.strictEqual(name, 'Error');
  assert.strictEqual(code, 'ERR_DLOPEN_FAILED');
  if (!common.isAIX) {
    assert.match(message, /foo-%s\.node/);
  }
  return true;
});

const notBindingDir = 'test/addons/not-a-binding';
const notBindingPath = `${notBindingDir}/build/Release/binding.node`;
const strangeBindingPath = `${tmpdir.path}/binding-%s.node`;
// Ensure that the addon directory exists, but skip the remainder of the test if
// the addon has not been compiled.
fs.accessSync(notBindingDir);
try {
  fs.copyFileSync(notBindingPath, strangeBindingPath);
} catch (err) {
  if (err.code !== 'ENOENT') throw err;
  common.skip(`addon not found: ${notBindingPath}`);
}

// This error message should also not be passed to a printf-like function.
assert.throws(() => {
  process.dlopen({ exports: {} }, strangeBindingPath);
}, {
  name: 'Error',
  code: 'ERR_DLOPEN_FAILED',
  message: /^Module did not self-register: '.*binding-%s\.node'\.$/
});