You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ut...@apache.org on 2018/10/02 00:50:04 UTC
[mynewt-core] branch master updated: Fix double read on enc_flash
driver
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-core.git
The following commit(s) were added to refs/heads/master by this push:
new 6ddd82c Fix double read on enc_flash driver
6ddd82c is described below
commit 6ddd82cd5be1057866266094123a64a6148e3071
Author: Fabio Utzig <ut...@apache.org>
AuthorDate: Mon Sep 24 15:15:08 2018 -0300
Fix double read on enc_flash driver
- Update flash_area_is_empty to use the new hal_flash_isempty_no_buf
call
- When enc_flash is testing for an empty flash, now it checks that the
lower-level driver returned an empty flash already and avoids reading
data that when it is known to be empty.
---
hw/drivers/flash/enc_flash/src/enc_flash.c | 13 ++++++-------
sys/flash_map/src/flash_map.c | 26 +++++++++-----------------
2 files changed, 15 insertions(+), 24 deletions(-)
diff --git a/hw/drivers/flash/enc_flash/src/enc_flash.c b/hw/drivers/flash/enc_flash/src/enc_flash.c
index 7f170bf..d2ac9af 100644
--- a/hw/drivers/flash/enc_flash/src/enc_flash.c
+++ b/hw/drivers/flash/enc_flash/src/enc_flash.c
@@ -159,7 +159,6 @@ enc_flash_is_empty(const struct hal_flash *h_dev, uint32_t addr, void *buf,
struct enc_flash_dev *dev = HAL_TO_ENC(h_dev);
const struct hal_flash *hwdev;
int rc;
- int rc2;
hwdev = dev->efd_hwdev;
@@ -167,18 +166,18 @@ enc_flash_is_empty(const struct hal_flash *h_dev, uint32_t addr, void *buf,
return hwdev->hf_itf->hff_is_empty(hwdev, addr, buf, len);
} else {
rc = hal_flash_is_erased(hwdev, addr, buf, len);
- if (rc < 0) {
+
+ /*
+ * If error or low-level flash is erased, avoid reading it.
+ */
+ if (rc < 0 || rc == 1) {
return rc;
}
/*
* Also read the underlying data.
*/
- rc2 = enc_flash_read(h_dev, addr, buf, len);
- if (rc2 < 0) {
- return rc2;
- }
- return rc;
+ return enc_flash_read(h_dev, addr, buf, len);
}
}
diff --git a/sys/flash_map/src/flash_map.c b/sys/flash_map/src/flash_map.c
index 98c3d35..1a10c54 100644
--- a/sys/flash_map/src/flash_map.c
+++ b/sys/flash_map/src/flash_map.c
@@ -189,25 +189,17 @@ flash_area_erased_val(const struct flash_area *fa)
int
flash_area_is_empty(const struct flash_area *fa, bool *empty)
{
- uint32_t data[64 >> 2];
- uint32_t data_off = 0;
- int8_t bytes_to_read;
int rc;
- while (data_off < fa->fa_size) {
- bytes_to_read = min(64, fa->fa_size - data_off);
- rc = hal_flash_isempty(fa->fa_device_id, fa->fa_off + data_off, data,
- bytes_to_read);
- if (rc < 0) {
- return rc;
- } else if (rc == 0) {
- *empty = false;
- return 0;
- }
- data_off += bytes_to_read;
- }
- *empty = true;
- return 0;
+ *empty = false;
+ rc = hal_flash_isempty_no_buf(fa->fa_device_id, fa->fa_off, fa->fa_size);
+ if (rc < 0) {
+ return rc;
+ } else if (rc == 1) {
+ *empty = true;
+ }
+
+ return 0;
}
int