| '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 && !common.isIBMi) { |
| 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'\.$/ |
| }); |