Skip to content

Commit a7e57a8

Browse files
robertsipkayichoi
authored andcommitted
Add a more secure type validator to SPI (#985)
IoT.js-DCO-1.0-Signed-off-by: Robert Sipka [email protected]
1 parent 39de9f3 commit a7e57a8

File tree

1 file changed

+17
-20
lines changed

1 file changed

+17
-20
lines changed

src/modules/iotjs_module_spi.c

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@
2323
/*
2424
* SPI instance function
2525
*/
26-
static void iotjs_spi_destroy(iotjs_spi_t* spi);
2726
static iotjs_spi_t* iotjs_spi_instance_from_jval(const iotjs_jval_t* jspi);
28-
IOTJS_DEFINE_NATIVE_HANDLE_INFO(spi);
2927

28+
IOTJS_DEFINE_NATIVE_HANDLE_INFO_THIS_MODULE(spi);
3029

3130
static iotjs_spi_t* iotjs_spi_create(const iotjs_jval_t* jspi) {
3231
iotjs_spi_t* spi = IOTJS_ALLOC(iotjs_spi_t);
3332
IOTJS_VALIDATED_STRUCT_CONSTRUCTOR(iotjs_spi_t, spi);
34-
iotjs_jobjectwrap_initialize(&_this->jobjectwrap, jspi, &spi_native_info);
33+
iotjs_jobjectwrap_initialize(&_this->jobjectwrap, jspi,
34+
&this_module_native_info);
3535

3636
_this->device = iotjs_string_create("");
3737

@@ -51,14 +51,14 @@ static void iotjs_spi_destroy(iotjs_spi_t* spi) {
5151

5252

5353
static iotjs_spi_reqwrap_t* iotjs_spi_reqwrap_create(
54-
const iotjs_jval_t* jcallback, const iotjs_jval_t* jspi, SpiOp op) {
54+
const iotjs_jval_t* jcallback, const iotjs_spi_t* spi, SpiOp op) {
5555
iotjs_spi_reqwrap_t* spi_reqwrap = IOTJS_ALLOC(iotjs_spi_reqwrap_t);
5656
IOTJS_VALIDATED_STRUCT_CONSTRUCTOR(iotjs_spi_reqwrap_t, spi_reqwrap);
5757

5858
iotjs_reqwrap_initialize(&_this->reqwrap, jcallback, (uv_req_t*)&_this->req);
5959

6060
_this->req_data.op = op;
61-
_this->spi_instance = iotjs_spi_instance_from_jval(jspi);
61+
_this->spi_instance = spi;
6262

6363
return spi_reqwrap;
6464
}
@@ -312,11 +312,11 @@ iotjs_spi_t* iotjs_spi_get_instance(const iotjs_jval_t* jspi) {
312312
}
313313

314314

315-
#define SPI_ASYNC(call, jthis, jcallback, op) \
315+
#define SPI_ASYNC(call, this, jcallback, op) \
316316
do { \
317317
uv_loop_t* loop = iotjs_environment_loop(iotjs_environment_get()); \
318318
iotjs_spi_reqwrap_t* req_wrap = \
319-
iotjs_spi_reqwrap_create(jcallback, jthis, op); \
319+
iotjs_spi_reqwrap_create(jcallback, this, op); \
320320
uv_work_t* req = iotjs_spi_reqwrap_req(req_wrap); \
321321
uv_queue_work(loop, req, iotjs_spi_##call##_worker, iotjs_spi_after_work); \
322322
} while (0)
@@ -336,25 +336,24 @@ JHANDLER_FUNCTION(SpiConstructor) {
336336
iotjs_spi_set_configuration(spi, jconfiguration);
337337

338338
const iotjs_jval_t* jcallback = JHANDLER_GET_ARG(1, function);
339-
SPI_ASYNC(open, jspi, jcallback, kSpiOpOpen);
339+
SPI_ASYNC(open, spi, jcallback, kSpiOpOpen);
340340
}
341341

342342

343343
// FIXME: do not need transferArray if array buffer is implemented.
344344
JHANDLER_FUNCTION(TransferArray) {
345-
DJHANDLER_CHECK_THIS(object);
345+
JHANDLER_DECLARE_THIS_PTR(spi, spi);
346+
346347
DJHANDLER_CHECK_ARGS(2, array, array);
347348
DJHANDLER_CHECK_ARG_IF_EXIST(2, function);
348349

349350
const iotjs_jval_t* jcallback = JHANDLER_GET_ARG_IF_EXIST(2, function);
350-
const iotjs_jval_t* jspi = JHANDLER_GET_THIS(object);
351-
iotjs_spi_t* spi = iotjs_spi_get_instance(jspi);
352351

353352
iotjs_spi_set_array_buffer(spi, JHANDLER_GET_ARG(0, array),
354353
JHANDLER_GET_ARG(1, array));
355354

356355
if (jcallback) {
357-
SPI_ASYNC(transfer, jspi, jcallback, kSpiOpTransfer);
356+
SPI_ASYNC(transfer, spi, jcallback, kSpiOpTransfer);
358357
} else {
359358
if (!iotjs_spi_transfer(spi)) {
360359
JHANDLER_THROW(COMMON, "SPI Transfer Error");
@@ -371,19 +370,18 @@ JHANDLER_FUNCTION(TransferArray) {
371370

372371

373372
JHANDLER_FUNCTION(TransferBuffer) {
374-
DJHANDLER_CHECK_THIS(object);
373+
JHANDLER_DECLARE_THIS_PTR(spi, spi);
374+
375375
DJHANDLER_CHECK_ARGS(2, object, object);
376376
DJHANDLER_CHECK_ARG_IF_EXIST(2, function);
377377

378378
const iotjs_jval_t* jcallback = JHANDLER_GET_ARG_IF_EXIST(2, function);
379-
const iotjs_jval_t* jspi = JHANDLER_GET_THIS(object);
380-
iotjs_spi_t* spi = iotjs_spi_get_instance(jspi);
381379

382380
iotjs_spi_set_buffer(spi, JHANDLER_GET_ARG(0, object),
383381
JHANDLER_GET_ARG(1, object));
384382

385383
if (jcallback) {
386-
SPI_ASYNC(transfer, jspi, jcallback, kSpiOpTransfer);
384+
SPI_ASYNC(transfer, spi, jcallback, kSpiOpTransfer);
387385
} else {
388386
if (!iotjs_spi_transfer(spi)) {
389387
JHANDLER_THROW(COMMON, "SPI Transfer Error");
@@ -400,15 +398,14 @@ JHANDLER_FUNCTION(TransferBuffer) {
400398

401399

402400
JHANDLER_FUNCTION(Close) {
403-
DJHANDLER_CHECK_THIS(object);
401+
JHANDLER_DECLARE_THIS_PTR(spi, spi);
402+
404403
DJHANDLER_CHECK_ARG_IF_EXIST(0, function);
405404

406405
const iotjs_jval_t* jcallback = JHANDLER_GET_ARG_IF_EXIST(0, function);
407-
const iotjs_jval_t* jspi = JHANDLER_GET_THIS(object);
408-
iotjs_spi_t* spi = iotjs_spi_get_instance(jspi);
409406

410407
if (jcallback) {
411-
SPI_ASYNC(close, jspi, jcallback, kSpiOpClose);
408+
SPI_ASYNC(close, spi, jcallback, kSpiOpClose);
412409
} else {
413410
if (!iotjs_spi_close(spi)) {
414411
JHANDLER_THROW(COMMON, "SPI Close Error");

0 commit comments

Comments
 (0)