crypto: do not abort when setting throws · nodejs/node@69140bc (original) (raw)

`@@ -226,9 +226,9 @@ static int NoPasswordCallback(char* buf, int size, int rwflag, void* u) {

`

226

226

``

227

227

`// namespace node::crypto::error

`

228

228

`namespace error {

`

229

``

`-

void Decorate(Environment* env, Local obj,

`

``

229

`+

Maybe Decorate(Environment* env, Local obj,

`

230

230

`unsigned long err) { // NOLINT(runtime/int)

`

231

``

`-

if (err == 0) return; // No decoration possible.

`

``

231

`+

if (err == 0) return Just(true); // No decoration necessary.

`

232

232

``

233

233

`const char* ls = ERR_lib_error_string(err);

`

234

234

`const char* fs = ERR_func_error_string(err);

`

`@@ -240,19 +240,19 @@ void Decorate(Environment* env, Local obj,

`

240

240

`if (ls != nullptr) {

`

241

241

`if (obj->Set(context, env->library_string(),

`

242

242

`OneByteString(isolate, ls)).IsNothing()) {

`

243

``

`-

return;

`

``

243

`+

return Nothing();

`

244

244

` }

`

245

245

` }

`

246

246

`if (fs != nullptr) {

`

247

247

`if (obj->Set(context, env->function_string(),

`

248

248

`OneByteString(isolate, fs)).IsNothing()) {

`

249

``

`-

return;

`

``

249

`+

return Nothing();

`

250

250

` }

`

251

251

` }

`

252

252

`if (rs != nullptr) {

`

253

253

`if (obj->Set(context, env->reason_string(),

`

254

254

`OneByteString(isolate, rs)).IsNothing()) {

`

255

``

`-

return;

`

``

255

`+

return Nothing();

`

256

256

` }

`

257

257

``

258

258

`// SSL has no API to recover the error name from the number, so we

`

`@@ -325,8 +325,10 @@ void Decorate(Environment* env, Local obj,

`

325

325

`if (obj->Set(env->isolate()->GetCurrentContext(),

`

326

326

` env->code_string(),

`

327

327

`OneByteString(env->isolate(), code)).IsNothing())

`

328

``

`-

return;

`

``

328

`+

return Nothing();

`

329

329

` }

`

``

330

+

``

331

`+

return Just(true);

`

330

332

`}

`

331

333

`} // namespace error

`

332

334

``

`@@ -342,7 +344,7 @@ struct CryptoErrorVector : public std::vectorstd::string {

`

342

344

`std::reverse(begin(), end());

`

343

345

` }

`

344

346

``

345

``

`-

inline Local ToException(

`

``

347

`+

inline MaybeLocal ToException(

`

346

348

` Environment* env,

`

347

349

` Local exception_string = Local()) const {

`

348

350

`if (exception_string.IsEmpty()) {

`

`@@ -364,10 +366,11 @@ struct CryptoErrorVector : public std::vectorstd::string {

`

364

366

`if (!empty()) {

`

365

367

`CHECK(exception_v->IsObject());

`

366

368

` Local exception = exception_v.As();

`

367

``

`-

exception->Set(env->context(),

`

``

369

`+

Maybe ok = exception->Set(env->context(),

`

368

370

` env->openssl_error_stack(),

`

369

``

`-

ToV8Value(env->context(), *this).ToLocalChecked())

`

370

``

`-

.Check();

`

``

371

`+

ToV8Value(env->context(), *this).ToLocalChecked());

`

``

372

`+

if (ok.IsNothing())

`

``

373

`+

return MaybeLocal();

`

371

374

` }

`

372

375

``

373

376

`return exception_v;

`

`@@ -386,16 +389,19 @@ void ThrowCryptoError(Environment* env,

`

386

389

` message = message_buffer;

`

387

390

` }

`

388

391

` HandleScope scope(env->isolate());

`

389

``

`-

auto exception_string =

`

``

392

`+

Local exception_string =

`

390

393

`String::NewFromUtf8(env->isolate(), message, NewStringType::kNormal)

`

391

394

` .ToLocalChecked();

`

392

395

` CryptoErrorVector errors;

`

393

396

` errors.Capture();

`

394

``

`-

Local exception = errors.ToException(env, exception_string);

`

``

397

`+

Local exception;

`

``

398

`+

if (!errors.ToException(env, exception_string).ToLocal(&exception))

`

``

399

`+

return;

`

395

400

` Local obj;

`

396

401

`if (!exception->ToObject(env->context()).ToLocal(&obj))

`

397

402

`return;

`

398

``

`-

error::Decorate(env, obj, err);

`

``

403

`+

if (error::Decorate(env, obj, err).IsNothing())

`

``

404

`+

return;

`

399

405

` env->isolate()->ThrowException(exception);

`

400

406

`}

`

401

407

``

`@@ -5872,7 +5878,7 @@ struct RandomBytesJob : public CryptoJob {

`

5872

5878

``

5873

5879

`inline Local ToResult() const {

`

5874

5880

`if (errors.empty()) return Undefined(env->isolate());

`

5875

``

`-

return errors.ToException(env);

`

``

5881

`+

return errors.ToException(env).ToLocalChecked();

`

5876

5882

` }

`

5877

5883

`};

`

5878

5884

``

`@@ -6009,7 +6015,7 @@ struct ScryptJob : public CryptoJob {

`

6009

6015

``

6010

6016

`inline Local ToResult() const {

`

6011

6017

`if (errors.empty()) return Undefined(env->isolate());

`

6012

``

`-

return errors.ToException(env);

`

``

6018

`+

return errors.ToException(env).ToLocalChecked();

`

6013

6019

` }

`

6014

6020

``

6015

6021

`inline void Cleanse() {

`

`@@ -6285,7 +6291,7 @@ class GenerateKeyPairJob : public CryptoJob {

`

6285

6291

`if (errors_.empty())

`

6286

6292

` errors_.Capture();

`

6287

6293

`CHECK(!errors_.empty());

`

6288

``

`-

*err = errors_.ToException(env);

`

``

6294

`+

*err = errors_.ToException(env).ToLocalChecked();

`

6289

6295

` *pubkey = Undefined(env->isolate());

`

6290

6296

` *privkey = Undefined(env->isolate());

`

6291

6297

` }

`