diff --git a/src/fwbank.c b/src/fwbank.c index 469a615697642d4c7567e9e3e210917c84561f24..1741be12afe9e6b916876018b02be4ab98d0747a 100644 --- a/src/fwbank.c +++ b/src/fwbank.c @@ -213,6 +213,18 @@ static void fwbank_dump_timer(struct uloop_timeout *timeout) sysmngr_init_fwbank_dump(data->ctx); } +static int free_global_fwbank_dump(struct blob_buf *fwbank_dump_bb) +{ + if (fwbank_dump_bb->head && blob_len(fwbank_dump_bb->head)) { + BBF_DEBUG("Freeing fwbank dump blob buffer"); + blob_buf_free(fwbank_dump_bb); + } else { + BBF_DEBUG("fwbank dump blob buffer is already empty"); + } + + return 0; +} + static int validate_global_fwbank_dump(struct blob_buf *fwbank_dump_bb) { if (!fwbank_dump_bb->head || !blob_len(fwbank_dump_bb->head)) { @@ -271,25 +283,42 @@ static void fwbank_dump_finish_callback(struct ubus_context *ctx, struct ubus_re close(pipe_fds[0]); // Close read end - if (bytes_read < 0) { + if (bytes_read < 0 || strlen(buffer) == 0) { BBF_ERR("Failed to read from pipe"); goto retry; } - memset(&g_fwbank_dump.output, 0, sizeof(struct blob_buf)); - blob_buf_init(&g_fwbank_dump.output, 0); + // Use a temporary blob_buf for validation + struct blob_buf temp_buf = {0}; - if (!blobmsg_add_json_from_string(&g_fwbank_dump.output, buffer)) { - BBF_ERR("Failed to create blob buf"); - goto retry; + memset(&temp_buf, 0, sizeof(struct blob_buf)); + blob_buf_init(&temp_buf, 0); + + if (!blobmsg_add_json_from_string(&temp_buf, buffer)) { + BBF_ERR("Invalid JSON format in buffer"); + blob_buf_free(&temp_buf); + goto retry; } - int res = validate_global_fwbank_dump(&g_fwbank_dump.output); + int res = validate_global_fwbank_dump(&temp_buf); if (res) { BBF_ERR("Failed to validate 'fwbank' output"); + blob_buf_free(&temp_buf); goto retry; } + free_global_fwbank_dump(&g_fwbank_dump.output); + + // Init g_fwbank_dump.output + memset(&g_fwbank_dump.output, 0, sizeof(struct blob_buf)); + blob_buf_init(&g_fwbank_dump.output, 0); + + // Move validated JSON from temp_buf to g_fwbank_dump.output + blobmsg_add_blob(&g_fwbank_dump.output, blob_data(temp_buf.head)); + + // Free the temporary buffer + blob_buf_free(&temp_buf); + return; retry: @@ -319,18 +348,6 @@ static int init_global_fwbank_dump(void) return 0; } -static int free_global_fwbank_dump(struct blob_buf *fwbank_dump_bb) -{ - if (fwbank_dump_bb->head && blob_len(fwbank_dump_bb->head)) { - BBF_DEBUG("Freeing fwbank dump blob buffer"); - blob_buf_free(fwbank_dump_bb); - } else { - BBF_DEBUG("fwbank dump blob buffer is already empty"); - } - - return 0; -} - static void fwbank_listen_timeout(struct uloop_timeout *timeout) { struct fwbank_event_data *data = NULL; @@ -387,7 +404,7 @@ static void fwbank_receive_sysupgrade(struct ubus_context *ctx, struct ubus_even if (DM_STRCMP(attr_val, "Available") == 0) { BBF_DEBUG("Sysupgrade status: Available. Refreshing fwbank dump."); - sysmngr_fwbank_refresh_global_dump(); + init_global_fwbank_dump(); break; } } @@ -512,7 +529,7 @@ static void fwbank_set_bootbank_finish_callback(struct ubus_context *ctx, struct if (is_success) { // Update fwbank dump output - sysmngr_fwbank_refresh_global_dump(); + init_global_fwbank_dump(); } return; @@ -602,14 +619,6 @@ int sysmngr_fwbank_upgrade(const char *path, bool auto_activate, uint32_t bank_i return 0; } -void sysmngr_fwbank_refresh_global_dump(void) -{ - BBF_INFO("fwbank refresh global dump blob buf"); - - free_global_fwbank_dump(&g_fwbank_dump.output); - init_global_fwbank_dump(); -} - static int dump_handler(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg)