This is an automated email from the ASF dual-hosted git repository. utzig pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-mcumgr.git
commit 3fdb7fe0a59dd879f81569a4fb36ea4b44b83792 Author: Andrzej Puzdrowski <andrzej.puzdrow...@nordicsemi.no> AuthorDate: Tue May 12 12:59:59 2020 +0200 cmd/img_mgmt/port/zephyr: fix to img_mgmt_impl_erase_image_data() It was possible that the function tried to erase non erase-block-size aligned number of bytes which might have cause failure. Additionally the image trailer area might have been not erased at all. Reworked implementation so: - the erase request is corrected to erase proper amount of memory - erase of image trailer is ensured. Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrow...@nordicsemi.no> --- cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c | 59 +++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c b/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c index 3bf30b5..eb5647a 100644 --- a/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c +++ b/cmd/img_mgmt/port/zephyr/src/zephyr_img_mgmt.c @@ -318,18 +318,67 @@ img_mgmt_impl_erase_image_data(unsigned int off, unsigned int num_bytes) const struct flash_area *fa; int rc; + if (off != 0) { + rc = MGMT_ERR_EINVAL; + goto end; + } + rc = flash_area_open(FLASH_AREA_ID(image_1), &fa); if (rc != 0) { - return MGMT_ERR_EUNKNOWN; + LOG_ERR("Can't bind to the flash area (err %d)", rc); + rc = MGMT_ERR_EUNKNOWN; + goto end; } - rc = flash_area_erase(fa, off, num_bytes); - flash_area_close(fa); + /* align requested erase size to the erase-block-size */ + struct device *dev = flash_area_get_device(fa); + struct flash_pages_info page; + + rc = flash_get_page_info_by_offs(dev, fa->fa_off + num_bytes -1, &page); if (rc != 0) { - return MGMT_ERR_EUNKNOWN; + LOG_ERR("bad offset (0x%x)", fa->fa_off + num_bytes -1); + rc = MGMT_ERR_EUNKNOWN; + goto end_fa; } - return 0; + size_t erase_size = page.start_offset + page.size - fa->fa_off; + + rc = flash_area_erase(fa, 0, erase_size); + + if (rc != 0) { + LOG_ERR("image slot erase of 0x%x bytes failed (err %d)", erase_size, + rc); + rc = MGMT_ERR_EUNKNOWN; + goto end_fa; + } + + LOG_INF("Erased 0x%x bytes of image slot", erase_size); + + /* erase the image trailer area if it was not erased */ + off = BOOT_TRAILER_IMG_STATUS_OFFS(fa); + if (off >= erase_size) { + rc = flash_get_page_info_by_offs(dev, fa->fa_off + off, &page); + + off = page.start_offset - fa->fa_off; + erase_size = fa->fa_size - off; + + rc = flash_area_erase(fa, off, erase_size); + if (rc != 0) { + LOG_ERR("image slot trailer erase of 0x%x bytes failed (err %d)", + erase_size, rc); + rc = MGMT_ERR_EUNKNOWN; + goto end_fa; + } + + LOG_INF("Erased 0x%x bytes of image slot trailer", erase_size); + } + + rc = 0; + +end_fa: + flash_area_close(fa); +end: + return rc; } #if IMG_MGMT_LAZY_ERASE