summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2024-11-13 14:21:29 +1100
committerDamien George <damien@micropython.org>2024-11-13 14:21:29 +1100
commit5dc9eda1953668eb6861be01ca85f147dcf8d406 (patch)
treed294b8e1fac93983e40097f817f4979d340bda40
parent611d8f9ce82ab5e04fb86ab6cfc28d5ed98f33bf (diff)
extmod/vfs_blockdev: Support bool return from Python read/write blocks.
Commit f4ab9d924790581989f2398fe30bbac5d680577f inadvertently broke some Python block devices, for example esp32 and stm32 SDCard classes. Those classes return a bool from their `readblocks` and `writeblocks` methods instead of an integer errno code. With that change, both `False` and `True` return values are now be interpreted as non-zero and hence the block device call fails. The fix in this commit is to allow a bool and explicitly convert `True` to 0 and `False` to `-MP_EIO`. Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--extmod/vfs_blockdev.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/extmod/vfs_blockdev.c b/extmod/vfs_blockdev.c
index a7c14b76e..d43c96b08 100644
--- a/extmod/vfs_blockdev.c
+++ b/extmod/vfs_blockdev.c
@@ -58,6 +58,13 @@ static int mp_vfs_blockdev_call_rw(mp_obj_t *args, size_t block_num, size_t bloc
if (ret == mp_const_none) {
return 0;
} else {
+ // Some block devices return a bool indicating success, so
+ // convert those to an errno integer code.
+ if (ret == mp_const_true) {
+ return 0;
+ } else if (ret == mp_const_false) {
+ return -MP_EIO;
+ }
// Block device functions are expected to return 0 on success
// and negative integer on errors. Check for positive integer
// results as some callers (i.e. littlefs) will produce corrupt