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

Reply via email to