From 8f4356dc6408d7a0563706134342d2af80639252 Mon Sep 17 00:00:00 2001 From: Jay Kim Date: Sun, 23 Oct 2022 14:52:10 -0700 Subject: [PATCH] Review memory allocation code and fix memory leakage. - issue #525 --- src/global.c | 12 +++++++++++- src/jerryxx.c | 2 +- src/modules/flash/module_flash.c | 1 + src/modules/graphics/module_graphics.c | 1 + src/modules/i2c/module_i2c.c | 17 ++++++++++++----- src/modules/pwm/module_pwm.c | 11 ++++++++++- src/modules/rp2/module_rp2.c | 2 ++ src/modules/sdcard/module_sdcard.c | 1 + src/modules/spi/module_spi.c | 9 ++++++++- src/modules/stream/module_stream.c | 2 ++ src/modules/uart/module_uart.c | 2 ++ src/modules/vfs_lfs/module_vfs_lfs.c | 3 +++ targets/linux/src/main.c | 4 +++- 13 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/global.c b/src/global.c index 6b34963e..65e86ad9 100644 --- a/src/global.c +++ b/src/global.c @@ -257,10 +257,13 @@ JERRYXX_FUN(pulse_read_fn) { } else { trigger_buf[i] = 0; } + jerry_release_value(item); } } } + jerry_release_value(trigger_interval); } + jerry_release_value(trigger); } // triggering @@ -276,7 +279,7 @@ JERRYXX_FUN(pulse_read_fn) { count = pulse_read(pin, state, buf, count, timeout); // free trigger buffer - if (trigger_len > 0) { + if (trigger_buf) { free(trigger_buf); } @@ -316,6 +319,7 @@ JERRYXX_FUN(pulse_write_fn) { } else { buf[i] = 0; // write 0 for non-number item. } + jerry_release_value(item); } pulse_write(pin, value, buf, length); } else { @@ -431,6 +435,7 @@ static void irq_cb(uint8_t pin) { jerry_release_value(ret_val); jerry_release_value(this_val); } + jerry_release_value(cb); } JERRYXX_FUN(attach_interrupt_fn) { @@ -981,6 +986,7 @@ JERRYXX_FUN(textencoder_encode_fn) { jerry_char_t buf[sz + 1]; jerry_size_t len = jerry_string_to_char_buffer(encoding, buf, sz); buf[len] = '\0'; + jerry_release_value(encoding); if (strcmp((char *)buf, "ascii") == 0) { jerry_size_t len = jerryxx_get_ascii_string_size(input); jerry_value_t array = jerry_create_typedarray(JERRY_TYPEDARRAY_UINT8, len); @@ -1021,6 +1027,7 @@ static void register_global_text_encoder() { jerry_value_t global = jerry_get_global_object(); jerryxx_set_property(global, MSTR_TEXT_ENCODER, textencoder_ctor); + jerry_release_value(textencoder_ctor); jerry_release_value(global); } @@ -1057,6 +1064,7 @@ JERRYXX_FUN(textdecoder_decode_fn) { jerry_size_t sz = jerry_get_string_size(encoding); jerry_char_t buf[sz + 1]; jerry_size_t len = jerry_string_to_char_buffer(encoding, buf, sz); + jerry_release_value(encoding); buf[len] = '\0'; if (strcmp((char *)buf, "ascii") == 0) { // return String.fromCharCode.apply(null, input); @@ -1105,6 +1113,7 @@ static void register_global_text_decoder() { jerry_value_t global = jerry_get_global_object(); jerryxx_set_property(global, MSTR_TEXT_DECODER, textdecoder_ctor); + jerry_release_value(textdecoder_ctor); jerry_release_value(global); } @@ -1271,6 +1280,7 @@ static void register_global_system_error() { jerryxx_inherit(global_error, system_error_ctor); // global.SystemError = SystemError jerryxx_set_property(global, MSTR_SYSTEM_ERROR, system_error_ctor); + jerry_release_value(system_error_ctor); jerry_release_value(global_error); jerry_release_value(global); } diff --git a/src/jerryxx.c b/src/jerryxx.c index a9c5edcd..642a0319 100644 --- a/src/jerryxx.c +++ b/src/jerryxx.c @@ -255,8 +255,8 @@ jerry_value_t jerryxx_call_method(jerry_value_t obj, char *name, jerry_value_t *args, int args_count) { jerry_value_t method = jerryxx_get_property(obj, name); jerry_value_t ret = jerry_call_function(method, obj, args, args_count); - return ret; jerry_release_value(method); + return ret; } void jerryxx_inherit(jerry_value_t super_ctor, jerry_value_t sub_ctor) { diff --git a/src/modules/flash/module_flash.c b/src/modules/flash/module_flash.c index 0c4158c2..cdc81c92 100644 --- a/src/modules/flash/module_flash.c +++ b/src/modules/flash/module_flash.c @@ -178,5 +178,6 @@ jerry_value_t module_flash_init() { /* flash module exports */ jerry_value_t exports = jerry_create_object(); jerryxx_set_property(exports, MSTR_FLASH_FLASH, flash_ctor); + jerry_release_value(flash_ctor); return exports; } diff --git a/src/modules/graphics/module_graphics.c b/src/modules/graphics/module_graphics.c index 513d37c3..8ee364a5 100644 --- a/src/modules/graphics/module_graphics.c +++ b/src/modules/graphics/module_graphics.c @@ -699,6 +699,7 @@ JERRYXX_FUN(buffered_gc_ctor_fn) { gc_handle->buffer = jerry_get_arraybuffer_pointer(buf); gc_handle->buffer_size = size; jerry_release_value(buf); + jerry_release_value(buffer); return jerry_create_undefined(); } diff --git a/src/modules/i2c/module_i2c.c b/src/modules/i2c/module_i2c.c index 012893d8..21a1651d 100644 --- a/src/modules/i2c/module_i2c.c +++ b/src/modules/i2c/module_i2c.c @@ -101,12 +101,13 @@ JERRYXX_FUN(i2c_write_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"I2C bus is not initialized."); } uint8_t bus = (uint8_t)jerry_get_number_value(bus_value); - + jerry_release_value(bus_value); // check the mode (determine slave mode or master mode) km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE); @@ -187,12 +188,13 @@ JERRYXX_FUN(i2c_read_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"I2C bus is not initialized."); } uint8_t bus = (uint8_t)jerry_get_number_value(bus_value); - + jerry_release_value(bus_value); // check the mode (determine slave mode or master mode) km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE); @@ -222,6 +224,7 @@ JERRYXX_FUN(i2c_read_fn) { jerry_create_arraybuffer_external(length, buf, buffer_free_cb); jerry_value_t array = jerry_create_typedarray_for_arraybuffer( JERRY_TYPEDARRAY_UINT8, array_buffer); + free(buf); jerry_release_value(array_buffer); return array; } @@ -249,12 +252,13 @@ JERRYXX_FUN(i2c_memwrite_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"I2C bus is not initialized."); } uint8_t bus = (uint8_t)jerry_get_number_value(bus_value); - + jerry_release_value(bus_value); // check the mode (determine slave mode or master mode) km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE); if (i2cmode == KM_I2C_SLAVE) @@ -322,12 +326,13 @@ JERRYXX_FUN(i2c_memread_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"I2C bus is not initialized."); } uint8_t bus = (uint8_t)jerry_get_number_value(bus_value); - + jerry_release_value(bus_value); // check the mode (determine slave mode or master mode) km_i2c_mode_t i2cmode = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_MODE); if (i2cmode == KM_I2C_SLAVE) @@ -348,6 +353,7 @@ JERRYXX_FUN(i2c_memread_fn) { jerry_value_t array = jerry_create_typedarray_for_arraybuffer( JERRY_TYPEDARRAY_UINT8, array_buffer); jerry_release_value(array_buffer); + free(buf); return array; } } @@ -360,12 +366,13 @@ JERRYXX_FUN(i2c_close_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_I2C_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"I2C bus is not initialized."); } uint8_t bus = (uint8_t)jerry_get_number_value(bus_value); - + jerry_release_value(bus_value); // close the bus int ret = km_i2c_close(bus); if (ret < 0) { diff --git a/src/modules/pwm/module_pwm.c b/src/modules/pwm/module_pwm.c index c707bbc3..c8532cae 100644 --- a/src/modules/pwm/module_pwm.c +++ b/src/modules/pwm/module_pwm.c @@ -54,6 +54,7 @@ JERRYXX_FUN(pwm_set_inversion_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -77,6 +78,7 @@ JERRYXX_FUN(pwm_get_inversion_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_INV_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM inversion pin error."); } @@ -92,6 +94,7 @@ JERRYXX_FUN(pwm_start_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -109,6 +112,7 @@ JERRYXX_FUN(pwm_stop_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -126,6 +130,7 @@ JERRYXX_FUN(pwm_get_frequency_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -146,6 +151,7 @@ JERRYXX_FUN(pwm_set_frequency_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -163,6 +169,7 @@ JERRYXX_FUN(pwm_get_duty_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -187,6 +194,7 @@ JERRYXX_FUN(pwm_set_duty_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -204,6 +212,7 @@ JERRYXX_FUN(pwm_close_fn) { jerry_value_t pin_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_PWM_PIN); if (!jerry_value_is_number(pin_value)) { + jerry_release_value(pin_value); return jerry_create_error(JERRY_ERROR_REFERENCE, (const jerry_char_t *)"PWM pin is not setup."); } @@ -222,7 +231,6 @@ jerry_value_t module_pwm_init() { jerry_value_t pwm_ctor = jerry_create_external_function(pwm_ctor_fn); jerry_value_t prototype = jerry_create_object(); jerryxx_set_property(pwm_ctor, "prototype", prototype); - jerry_release_value(prototype); jerryxx_set_property_function(prototype, MSTR_PWM_START, pwm_start_fn); jerryxx_set_property_function(prototype, MSTR_PWM_STOP, pwm_stop_fn); jerryxx_set_property_function(prototype, MSTR_PWM_GET_FREQUENCY, @@ -236,6 +244,7 @@ jerry_value_t module_pwm_init() { jerryxx_set_property_function(prototype, MSTR_PWM_GET_INVERSION, pwm_get_inversion_fn); jerryxx_set_property_function(prototype, MSTR_PWM_CLOSE, pwm_close_fn); + jerry_release_value(prototype); /* pwm module exports */ jerry_value_t exports = jerry_create_object(); diff --git a/src/modules/rp2/module_rp2.c b/src/modules/rp2/module_rp2.c index 43fd08a5..997aca0f 100644 --- a/src/modules/rp2/module_rp2.c +++ b/src/modules/rp2/module_rp2.c @@ -426,6 +426,8 @@ JERRYXX_FUN(dormant_fn) { } _pins[i] = (uint8_t)jerry_get_number_value(pin); _events[i] = (uint8_t)jerry_get_number_value(event); + jerry_release_value(pin); + jerry_release_value(event); } // Hibernate system for dormant diff --git a/src/modules/sdcard/module_sdcard.c b/src/modules/sdcard/module_sdcard.c index 7f8d8c4b..d4f11648 100644 --- a/src/modules/sdcard/module_sdcard.c +++ b/src/modules/sdcard/module_sdcard.c @@ -542,5 +542,6 @@ jerry_value_t module_sdcard_init() { /* sdcard module exports */ jerry_value_t exports = jerry_create_object(); jerryxx_set_property(exports, MSTR_SDCARD_SDCARD, sdcard_ctor); + jerry_release_value(sdcard_ctor); return exports; } diff --git a/src/modules/spi/module_spi.c b/src/modules/spi/module_spi.c index f0833163..5fb3ee40 100644 --- a/src/modules/spi/module_spi.c +++ b/src/modules/spi/module_spi.c @@ -101,6 +101,7 @@ JERRYXX_FUN(spi_transfer_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"SPI bus is not initialized."); @@ -120,6 +121,7 @@ JERRYXX_FUN(spi_transfer_fn) { uint8_t *tx_buf = jerry_get_arraybuffer_pointer(array_buffer); uint8_t *rx_buf = malloc(len); int ret = km_spi_sendrecv(bus, tx_buf, rx_buf, len, timeout); + jerry_release_value(array_buffer); if (ret < 0) { free(rx_buf); return jerry_create_error_from_value(create_system_error(ret), true); @@ -129,9 +131,9 @@ JERRYXX_FUN(spi_transfer_fn) { jerry_value_t array = jerry_create_typedarray_for_arraybuffer( JERRY_TYPEDARRAY_UINT8, buffer); jerry_release_value(buffer); + free(rx_buf); return array; } - jerry_release_value(array_buffer); } else if (jerry_value_is_string(data)) { /* for string */ jerry_size_t len = jerryxx_get_ascii_string_size(data); uint8_t tx_buf[len]; @@ -147,6 +149,7 @@ JERRYXX_FUN(spi_transfer_fn) { jerry_value_t array = jerry_create_typedarray_for_arraybuffer( JERRY_TYPEDARRAY_UINT8, buffer); jerry_release_value(buffer); + free(rx_buf); return array; } } else { @@ -171,6 +174,7 @@ JERRYXX_FUN(spi_send_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"SPI bus is not initialized."); @@ -226,6 +230,7 @@ JERRYXX_FUN(spi_recv_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"SPI bus is not initialized."); @@ -247,6 +252,7 @@ JERRYXX_FUN(spi_recv_fn) { jerry_value_t array = jerry_create_typedarray_for_arraybuffer( JERRY_TYPEDARRAY_UINT8, array_buffer); jerry_release_value(array_buffer); + free(buf); return array; } } @@ -259,6 +265,7 @@ JERRYXX_FUN(spi_close_fn) { jerry_value_t bus_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_SPI_BUS); if (!jerry_value_is_number(bus_value)) { + jerry_release_value(bus_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"SPI bus is not initialized."); diff --git a/src/modules/stream/module_stream.c b/src/modules/stream/module_stream.c index 0c682391..8ea3d262 100644 --- a/src/modules/stream/module_stream.c +++ b/src/modules/stream/module_stream.c @@ -100,6 +100,7 @@ jerry_value_t module_stream_init() { jerryxx_set_property(stdin_ctor, MSTR_PROTOTYPE, stdin_prototype); jerryxx_set_property_function(stdin_prototype, MSTR_STREAM_READ, stdin_read_fn); + jerry_release_value(stdin_prototype); /* StdOutNative class */ jerry_value_t stdout_ctor = jerry_create_external_function(stdout_ctor_fn); @@ -107,6 +108,7 @@ jerry_value_t module_stream_init() { jerryxx_set_property(stdout_ctor, MSTR_PROTOTYPE, stdout_prototype); jerryxx_set_property_function(stdout_prototype, MSTR_STREAM_WRITE, stdout_write_fn); + jerry_release_value(stdout_prototype); /* stream module exports */ jerry_value_t exports = jerry_create_object(); diff --git a/src/modules/uart/module_uart.c b/src/modules/uart/module_uart.c index bb97deb7..9f1b099e 100644 --- a/src/modules/uart/module_uart.c +++ b/src/modules/uart/module_uart.c @@ -145,6 +145,7 @@ JERRYXX_FUN(uart_write_fn) { jerry_value_t port_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_UART_PORT); if (!jerry_value_is_number(port_value)) { + jerry_release_value(port_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"UART port is not initialized."); @@ -196,6 +197,7 @@ JERRYXX_FUN(uart_close_fn) { jerry_value_t port_value = jerryxx_get_property(JERRYXX_GET_THIS, MSTR_UART_PORT); if (!jerry_value_is_number(port_value)) { + jerry_release_value(port_value); return jerry_create_error( JERRY_ERROR_REFERENCE, (const jerry_char_t *)"UART port is not initialized."); diff --git a/src/modules/vfs_lfs/module_vfs_lfs.c b/src/modules/vfs_lfs/module_vfs_lfs.c index f8ef47d7..3921a731 100644 --- a/src/modules/vfs_lfs/module_vfs_lfs.c +++ b/src/modules/vfs_lfs/module_vfs_lfs.c @@ -34,6 +34,9 @@ static void vfs_handle_freecb(void *handle) { vfs_lfs_handle_t *vfs_handle = (vfs_lfs_handle_t *)handle; + free(vfs_handle->config.lookahead_buffer); + free(vfs_handle->config.prog_buffer); + free(vfs_handle->config.read_buffer); jerry_release_value(vfs_handle->blkdev_js); vfs_lfs_handle_remove(handle); free(handle); diff --git a/targets/linux/src/main.c b/targets/linux/src/main.c index ff3c5e65..8b92cdb3 100644 --- a/targets/linux/src/main.c +++ b/targets/linux/src/main.c @@ -56,9 +56,11 @@ int main(int argc, char* argv[]) { jerry_value_t parsed_code = jerry_parse(NULL, 0, (jerry_char_t*)script, size, JERRY_PARSE_STRICT_MODE); if (!jerry_value_is_error(parsed_code)) { + jerry_release_value(parsed_code); jerry_value_t ret_value = jerry_run(parsed_code); if (jerry_value_is_error(ret_value)) { jerryxx_print_error(ret_value, true); + jerry_release_value(ret_value); // km_runtime_cleanup(); // km_runtime_init(false, false); return 0; @@ -69,6 +71,6 @@ int main(int argc, char* argv[]) { } jerry_release_value(parsed_code); } - + free(script); km_io_run(argc < 2); }