Skip to content

Commit 177fc9f

Browse files
committed
Check for NULL unwrapped pointers from Node / v8
1 parent 37d668f commit 177fc9f

File tree

8 files changed

+175
-36
lines changed

8 files changed

+175
-36
lines changed

src/njs/src/njsConnection.cpp

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ void Connection::connectionPropertyException(Connection* njsConn,
182182
Nan::HandleScope scope;
183183

184184
string msg;
185+
185186
if(!njsConn->isValid_)
186187
msg = NJSMessages::getErrorMsg(errInvalidConnection);
187188
else
@@ -197,6 +198,7 @@ void Connection::connectionPropertyException(Connection* njsConn,
197198
NAN_GETTER(Connection::GetStmtCacheSize)
198199
{
199200
Connection* njsConn = Nan::ObjectWrap::Unwrap<Connection>(info.Holder());
201+
NJS_CHECK_OBJECT_VALID2( njsConn, info ) ;
200202
if(!njsConn->isValid_)
201203
{
202204
string error = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -224,7 +226,11 @@ NAN_GETTER(Connection::GetStmtCacheSize)
224226
*/
225227
NAN_SETTER(Connection::SetStmtCacheSize)
226228
{
227-
connectionPropertyException(Nan::ObjectWrap::Unwrap<Connection>(info.Holder()), errReadOnly, "stmtCacheSize");
229+
Connection *connection = Nan::ObjectWrap::Unwrap<Connection>(info.Holder());
230+
231+
NJS_CHECK_OBJECT_VALID ( connection );
232+
233+
connectionPropertyException(connection, errReadOnly, "stmtCacheSize");
228234
}
229235

230236
/*****************************************************************************/
@@ -246,6 +252,8 @@ NAN_GETTER(Connection::GetClientId)
246252
NAN_SETTER(Connection::SetClientId)
247253
{
248254
Connection* njsConn = Nan::ObjectWrap::Unwrap<Connection>(info.Holder());
255+
NJS_CHECK_OBJECT_VALID(njsConn) ;
256+
249257
if(!njsConn->isValid_)
250258
{
251259
string msg = NJSMessages::getErrorMsg(errInvalidConnection);
@@ -279,6 +287,7 @@ NAN_GETTER(Connection::GetModule)
279287
NAN_SETTER(Connection::SetModule)
280288
{
281289
Connection *njsConn = Nan::ObjectWrap::Unwrap<Connection>(info.Holder());
290+
NJS_CHECK_OBJECT_VALID (njsConn ) ;
282291
if(!njsConn->isValid_)
283292
{
284293
string msg = NJSMessages::getErrorMsg(errInvalidConnection);
@@ -312,6 +321,7 @@ NAN_GETTER(Connection::GetAction)
312321
NAN_SETTER(Connection::SetAction)
313322
{
314323
Connection *njsConn = Nan::ObjectWrap::Unwrap<Connection>(info.Holder());
324+
NJS_CHECK_OBJECT_VALID ( njsConn ) ;
315325
if(!njsConn->isValid_)
316326
{
317327
string msg = NJSMessages::getErrorMsg(errInvalidConnection);
@@ -334,6 +344,7 @@ NAN_GETTER (Connection::GetOracleServerVersion)
334344
{
335345
Connection *njsConn = ObjectWrap::Unwrap<Connection>(info.Holder());
336346

347+
NJS_CHECK_OBJECT_VALID2 ( njsConn, info ) ;
337348
if ( !njsConn->isValid_ )
338349
{
339350
string error = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -379,8 +390,9 @@ NAN_GETTER (Connection::GetOracleServerVersion)
379390
*/
380391
NAN_SETTER(Connection::SetOracleServerVersion)
381392
{
382-
connectionPropertyException(ObjectWrap::Unwrap<Connection>(info.Holder()),
383-
errReadOnly, "oracleServerVersion" );
393+
Connection *connection = Nan::ObjectWrap::Unwrap<Connection>(info.Holder());
394+
NJS_CHECK_OBJECT_VALID(connection);
395+
connectionPropertyException(connection, errReadOnly, "oracleServerVersion" );
384396
}
385397

386398

@@ -408,6 +420,8 @@ NAN_METHOD(Connection::Execute)
408420
NJS_CHECK_NUMBER_OF_ARGS ( executeBaton->error, info, 2, 4, exitExecute );
409421
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
410422

423+
NJS_CHECK_OBJECT_VALID3( connection, executeBaton->error, exitExecute );
424+
411425
if(!connection->isValid_)
412426
{
413427
executeBaton->error = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -2530,6 +2544,7 @@ NAN_METHOD(Connection::Release)
25302544
NJS_CHECK_NUMBER_OF_ARGS ( releaseBaton->error, info, 1, 1, exitRelease );
25312545
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
25322546

2547+
NJS_CHECK_OBJECT_VALID3(connection, releaseBaton->error, exitRelease);
25332548
if(!connection->isValid_)
25342549
{
25352550
releaseBaton->error = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -2627,6 +2642,7 @@ NAN_METHOD(Connection::Commit)
26272642
NJS_CHECK_NUMBER_OF_ARGS ( commitBaton->error, info, 1, 1, exitCommit );
26282643
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
26292644

2645+
NJS_CHECK_OBJECT_VALID3 ( connection, commitBaton->error, exitCommit );
26302646
if(!connection->isValid_)
26312647
{
26322648
commitBaton->error = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -2721,6 +2737,7 @@ NAN_METHOD(Connection::Rollback)
27212737
rollbackBaton->cb.Reset( callback );
27222738
NJS_CHECK_NUMBER_OF_ARGS ( rollbackBaton->error, info, 1, 1, exitRollback );
27232739
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
2740+
NJS_CHECK_OBJECT_VALID3 ( connection, rollbackBaton->error, exitRollback );
27242741

27252742
if(!connection->isValid_)
27262743
{
@@ -2815,6 +2832,8 @@ NAN_METHOD(Connection::Break)
28152832
NJS_CHECK_NUMBER_OF_ARGS ( breakBaton->error, info, 1, 1, exitBreak );
28162833
connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
28172834

2835+
NJS_CHECK_OBJECT_VALID3 ( connection, breakBaton->error, exitBreak );
2836+
28182837
if(!connection->isValid_)
28192838
{
28202839
breakBaton->error = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -3348,15 +3367,14 @@ v8::Local<v8::Value> Connection::NewLob(eBaton* executeBaton,
33483367
{
33493368
Nan::EscapableHandleScope scope;
33503369
Connection *connection = executeBaton->njsconn;
3351-
// Handle<Object> jsOracledb = connection->oracledb_->jsOracledb;
33523370
Local<Object> jsOracledb = Nan::New<Object>(connection->oracledb_->jsOracledb);
33533371
Local<Value> argv[1];
3354-
3372+
33553373
Local<Object> iLob = Nan::New<FunctionTemplate>(ILob::iLobTemplate_s)->GetFunction()->NewInstance();
33563374

3357-
// the ownership of all handles in the ProtoILob are transferred to ILob
3358-
// here. Any error in initialization of ILob will cleanup the OCI
3359-
// handles in the ILob cleanup routine.
3375+
// the ownership of all handles in the ProtoILob are transferred to ILob
3376+
// here. Any error in initialization of ILob will cleanup the OCI
3377+
// handles in the ILob cleanup routine.
33603378

33613379
(Nan::ObjectWrap::Unwrap<ILob>(iLob))->setILob(executeBaton, protoILob);
33623380

@@ -3369,12 +3387,6 @@ v8::Local<v8::Value> Connection::NewLob(eBaton* executeBaton,
33693387
Local<Function>::Cast(jsOracledb->Get(Nan::New<v8::String>("newLob").ToLocalChecked()))->Call(
33703388
jsOracledb, 1, argv);
33713389

3372-
// Local<Value> result =
3373-
// Nan::MakeCallback(
3374-
// jsOracledb,
3375-
// Nan::New<v8::String>("newLob").ToLocalChecked(),
3376-
// 1, argv);
3377-
33783390
return scope.Escape(result);
33793391
}
33803392

@@ -3387,7 +3399,6 @@ v8::Local<v8::Value> Connection::NewLob(eBaton* executeBaton,
33873399
33883400
PARAMETERS
33893401
none
3390-
33913402
RETURNS
33923403
A Lob object
33933404
@@ -3403,20 +3414,19 @@ v8::Local<v8::Value> Connection::NewLob(eBaton* executeBaton,
34033414

34043415
NAN_METHOD(Connection::GetLob)
34053416
{
3406-
Connection *connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
3407-
//Handle<Object> jsOracledb = connection->oracledb_->jsOracledb;
3408-
Local<Object> jsOracledb = Nan::New<Object>(connection->oracledb_->jsOracledb);
3409-
Local<Value> argv[1];
3417+
Connection *connection = Nan::ObjectWrap::Unwrap<Connection>(info.This());
34103418

3411-
Local<Value> result =
3412-
Local<Function>::Cast(jsOracledb->Get(Nan::New<v8::String>("newLob").ToLocalChecked()))->Call(
3413-
jsOracledb, 1, argv);
3419+
NJS_CHECK_OBJECT_VALID2 ( connection, info );
34143420

3415-
// Local<Value> result =
3416-
// Nan::MakeCallback(
3417-
// jsOracledb,
3418-
// Nan::New<v8::String>("newLob").ToLocalChecked(),
3419-
// 1, argv);
3421+
Local<Object> jsOracledb = Nan::New<Object>(
3422+
connection->oracledb_->jsOracledb);
3423+
Local<Value> argv[1];
3424+
3425+
Local<Value> result = Local<Function>::Cast(
3426+
jsOracledb->Get(
3427+
Nan::New<v8::String>(
3428+
"newLob").ToLocalChecked()))->Call(
3429+
jsOracledb, 1, argv);
34203430

34213431
info.GetReturnValue().Set(result);
34223432
}

src/njs/src/njsIntLob.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ NAN_METHOD(ILob::Release)
359359
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.This());
360360
string msg;
361361

362+
NJS_CHECK_OBJECT_VALID2(iLob, info);
362363
if( !iLob->njsconn_->isValid() )
363364
{
364365
msg = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -429,6 +430,7 @@ NAN_GETTER(ILob::GetChunkSize)
429430
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
430431
string msg;
431432

433+
NJS_CHECK_OBJECT_VALID2(iLob, info);
432434
if( !iLob->njsconn_->isValid() )
433435
{
434436
msg = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -470,8 +472,9 @@ NAN_GETTER(ILob::GetChunkSize)
470472

471473
NAN_SETTER(ILob::SetChunkSize)
472474
{
473-
lobPropertyException(Nan::ObjectWrap::Unwrap<ILob>(info.Holder()), errReadOnly,
474-
"chunkSize");
475+
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
476+
NJS_CHECK_OBJECT_VALID (iLob);
477+
lobPropertyException(iLob, errReadOnly, "chunkSize");
475478
}
476479

477480

@@ -497,6 +500,7 @@ NAN_GETTER(ILob::GetLength)
497500
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
498501
string msg;
499502

503+
NJS_CHECK_OBJECT_VALID2(iLob, info);
500504
if( !iLob->njsconn_->isValid() )
501505
{
502506
msg = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -538,8 +542,9 @@ NAN_GETTER(ILob::GetLength)
538542

539543
NAN_SETTER(ILob::SetLength)
540544
{
541-
lobPropertyException(Nan::ObjectWrap::Unwrap<ILob>(info.Holder()), errReadOnly,
542-
"length");
545+
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
546+
NJS_CHECK_OBJECT_VALID(iLob);
547+
lobPropertyException(iLob, errReadOnly, "length");
543548
}
544549

545550

@@ -564,6 +569,7 @@ NAN_GETTER(ILob::GetPieceSize)
564569
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
565570
string msg;
566571

572+
NJS_CHECK_OBJECT_VALID2(iLob, info);
567573
if( !iLob->njsconn_->isValid() )
568574
{
569575
msg = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -607,6 +613,7 @@ NAN_SETTER(ILob::SetPieceSize)
607613
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
608614
string msg;
609615

616+
NJS_CHECK_OBJECT_VALID(iLob);
610617
NJS_SET_PROP_UINT(iLob->bufSize_, value, "pieceSize");
611618

612619
if (iLob->state_ == ACTIVE)
@@ -659,6 +666,7 @@ NAN_GETTER(ILob::GetOffset)
659666
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
660667
string msg;
661668

669+
NJS_CHECK_OBJECT_VALID2(iLob, info);
662670
if( !iLob->njsconn_->isValid() )
663671
{
664672
msg = NJSMessages::getErrorMsg ( errInvalidConnection );
@@ -703,6 +711,7 @@ NAN_SETTER(ILob::SetOffset)
703711
double offset = 0.0;
704712
string msg;
705713

714+
NJS_CHECK_OBJECT_VALID(iLob);
706715
NJS_SET_PROP_UINT(offset, value, "offset");
707716

708717
if (offset < 1)
@@ -750,6 +759,7 @@ NAN_GETTER(ILob::GetType)
750759
{
751760
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
752761

762+
NJS_CHECK_OBJECT_VALID2(iLob, info);
753763
try
754764
{
755765
Local<Number> value = Nan::New<v8::Number>((unsigned long)iLob->type_);
@@ -784,8 +794,9 @@ NAN_GETTER(ILob::GetType)
784794

785795
NAN_SETTER(ILob::SetType)
786796
{
787-
lobPropertyException(Nan::ObjectWrap::Unwrap<ILob>(info.Holder()), errReadOnly,
788-
"type");
797+
ILob *iLob = Nan::ObjectWrap::Unwrap<ILob>(info.Holder());
798+
NJS_CHECK_OBJECT_VALID(iLob);
799+
lobPropertyException(iLob, errReadOnly, "type");
789800
}
790801

791802

@@ -819,6 +830,8 @@ NAN_METHOD(ILob::Read)
819830
NJS_CHECK_NUMBER_OF_ARGS (lobBaton->error, info, 1, 1, exitRead);
820831
iLob = Nan::ObjectWrap::Unwrap<ILob>(info.This());
821832

833+
NJS_CHECK_OBJECT_VALID3(iLob, lobBaton->error, exitRead);
834+
822835
if(!iLob->isValid_)
823836
{
824837
lobBaton->error = NJSMessages::getErrorMsg(errInvalidLob);
@@ -1005,7 +1018,7 @@ NAN_METHOD(ILob::Write)
10051018

10061019
NJS_CHECK_NUMBER_OF_ARGS (lobBaton->error, info, 2, 2, exitWrite);
10071020
iLob = Nan::ObjectWrap::Unwrap<ILob>(info.This());
1008-
1021+
NJS_CHECK_OBJECT_VALID3 ( iLob, lobBaton->error, exitWrite);
10091022
if(!iLob->isValid_)
10101023
{
10111024
lobBaton->error = NJSMessages::getErrorMsg(errInvalidLob);

src/njs/src/njsMessages.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ static const char *errMsg[] =
6262
"NJS-026: maxRows must be greater than zero",
6363
"NJS-027: unexpected SQL parsing error",
6464
"NJS-028: raw database type is not supported with DML Returning statements",
65+
"NJS-029: Invalid object from javascript",
6566
};
6667

6768
string NJSMessages::getErrorMsg ( NJSErrorType err, ... )

src/njs/src/njsMessages.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ typedef enum
6161
errInvalidmaxRows,
6262
errSQLSyntaxError,
6363
errBufferReturningInvalid,
64+
errInvalidJSObject,
6465

6566
// New ones should be added here
6667

0 commit comments

Comments
 (0)