This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 54b0066a695 libs/libc: Fix divide-by-zero in stat() with large 
filesystem block sizes
54b0066a695 is described below

commit 54b0066a6953c08a903b5930d89c5a94640e0c42
Author: Ansh Rai <[email protected]>
AuthorDate: Wed Jul 15 19:55:22 2026 +0530

    libs/libc: Fix divide-by-zero in stat() with large filesystem block sizes
    
    blksize_t is currently defined as int16_t, which overflows when a
    filesystem reports a block size larger than 32767 bytes. This causes
    st_blksize to become zero, leading to an integer divide-by-zero when
    st_blocks is calculated in stat().
    
    Widen blksize_t to int32_t to support larger filesystem block sizes.
    
    Update nuttx_blksize_t in include/nuttx/fs/hostfs.h to keep it
    consistent with include/sys/types.h.
    
    struct geometry.geo_sectorsize (include/nuttx/fs/ioctl.h) is also
    typed blksize_t, so every debug print of that field using a 16-bit
    format specifier is updated to PRId32 to match the new width:
    drivers/misc/ramdisk.c, drivers/mmcsd/mmcsd_spi.c, drivers/mtd/ftl.c,
    fs/driver/fs_blockmerge.c, drivers/mtd/smart.c,
    drivers/usbhost/usbhost_storage.c, drivers/mmcsd/mmcsd_sdio.c,
    arch/arm/src/s32k1xx/s32k1xx_eeeprom.c,
    arch/arm/src/lc823450/lc823450_mmcl.c.
    
    Signed-off-by: Ansh Rai <[email protected]>
    Signed-off-by: root <[email protected]>
---
 arch/arm/src/lc823450/lc823450_mmcl.c  | 2 +-
 arch/arm/src/s32k1xx/s32k1xx_eeeprom.c | 2 +-
 drivers/misc/ramdisk.c                 | 2 +-
 drivers/mmcsd/mmcsd_sdio.c             | 2 +-
 drivers/mmcsd/mmcsd_spi.c              | 2 +-
 drivers/mtd/ftl.c                      | 2 +-
 drivers/mtd/smart.c                    | 2 +-
 drivers/usbhost/usbhost_storage.c      | 2 +-
 fs/driver/fs_blockmerge.c              | 4 ++--
 include/nuttx/fs/hostfs.h              | 2 +-
 include/sys/types.h                    | 2 +-
 11 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/arch/arm/src/lc823450/lc823450_mmcl.c 
b/arch/arm/src/lc823450/lc823450_mmcl.c
index 13de5f0ad54..f8d521d875c 100644
--- a/arch/arm/src/lc823450/lc823450_mmcl.c
+++ b/arch/arm/src/lc823450/lc823450_mmcl.c
@@ -205,7 +205,7 @@ static int mmcl_geometry(struct inode *inode, struct 
geometry *geometry)
       finfo("available: true mediachanged: false writeenabled: %s\n",
             geometry->geo_writeenabled ? "true" : "false");
 
-      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRIi16 "\n",
+      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRId32 "\n",
             geometry->geo_nsectors, geometry->geo_sectorsize);
 
       return OK;
diff --git a/arch/arm/src/s32k1xx/s32k1xx_eeeprom.c 
b/arch/arm/src/s32k1xx/s32k1xx_eeeprom.c
index c0ad4bb78e4..9782be4d59f 100644
--- a/arch/arm/src/s32k1xx/s32k1xx_eeeprom.c
+++ b/arch/arm/src/s32k1xx/s32k1xx_eeeprom.c
@@ -304,7 +304,7 @@ static int eeed_geometry(struct inode *inode, struct 
geometry *geometry)
 
       finfo("available: true mediachanged: false writeenabled: %s\n",
             geometry->geo_writeenabled ? "true" : "false");
-      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRIu16 "\n",
+      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRId32 "\n",
             geometry->geo_nsectors, geometry->geo_sectorsize);
 
       return OK;
diff --git a/drivers/misc/ramdisk.c b/drivers/misc/ramdisk.c
index 81454341d0a..96bb2f0f4a7 100644
--- a/drivers/misc/ramdisk.c
+++ b/drivers/misc/ramdisk.c
@@ -324,7 +324,7 @@ static int rd_geometry(FAR struct inode *inode,
 
       finfo("available: true mediachanged: false writeenabled: %s\n",
             geometry->geo_writeenabled ? "true" : "false");
-      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRIi16 "\n",
+      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRId32 "\n",
             geometry->geo_nsectors, geometry->geo_sectorsize);
 
       return OK;
diff --git a/drivers/mmcsd/mmcsd_sdio.c b/drivers/mmcsd/mmcsd_sdio.c
index 4f0db8cd154..c034f48fef5 100644
--- a/drivers/mmcsd/mmcsd_sdio.c
+++ b/drivers/mmcsd/mmcsd_sdio.c
@@ -2591,7 +2591,7 @@ static int mmcsd_geometry(FAR struct inode *inode, struct 
geometry *geometry)
           finfo("available: true mediachanged: %s writeenabled: %s\n",
                  geometry->geo_mediachanged ? "true" : "false",
                  geometry->geo_writeenabled ? "true" : "false");
-          finfo("nsectors: %" PRIuOFF " sectorsize: %" PRIi16 "\n",
+          finfo("nsectors: %" PRIuOFF " sectorsize: %" PRId32 "\n",
                  geometry->geo_nsectors,
                  geometry->geo_sectorsize);
 
diff --git a/drivers/mmcsd/mmcsd_spi.c b/drivers/mmcsd/mmcsd_spi.c
index eb08b106a83..1f4aea8a97d 100644
--- a/drivers/mmcsd/mmcsd_spi.c
+++ b/drivers/mmcsd/mmcsd_spi.c
@@ -1649,7 +1649,7 @@ static int mmcsd_geometry(FAR struct inode *inode,
   finfo("geo_mediachanged:  %d\n", geometry->geo_mediachanged);
   finfo("geo_writeenabled:  %d\n", geometry->geo_writeenabled);
   finfo("geo_nsectors:      %" PRIuOFF "\n", geometry->geo_nsectors);
-  finfo("geo_sectorsize:    %" PRIi16 "\n", geometry->geo_sectorsize);
+  finfo("geo_sectorsize:    %" PRId32 "\n", geometry->geo_sectorsize);
 
   return OK;
 }
diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c
index eee562c787d..2d50ac28f0e 100644
--- a/drivers/mtd/ftl.c
+++ b/drivers/mtd/ftl.c
@@ -833,7 +833,7 @@ static int ftl_geometry(FAR struct inode *inode,
 
       finfo("available: true mediachanged: false writeenabled: %s\n",
             geometry->geo_writeenabled ? "true" : "false");
-      finfo("nsectors: %" PRIuOFF " sectorsize: %u\n",
+      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRId32 "\n",
             geometry->geo_nsectors, geometry->geo_sectorsize);
 
       return OK;
diff --git a/drivers/mtd/smart.c b/drivers/mtd/smart.c
index 8d008a6f6bb..1855da6a0e9 100644
--- a/drivers/mtd/smart.c
+++ b/drivers/mtd/smart.c
@@ -1074,7 +1074,7 @@ static int smart_geometry(FAR struct inode *inode,
 
       finfo("available: true mediachanged: false writeenabled: %s\n",
             geometry->geo_writeenabled ? "true" : "false");
-      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRIi16 "\n",
+      finfo("nsectors: %" PRIuOFF " sectorsize: %" PRId32 "\n",
             geometry->geo_nsectors, geometry->geo_sectorsize);
 
       return OK;
diff --git a/drivers/usbhost/usbhost_storage.c 
b/drivers/usbhost/usbhost_storage.c
index 7621049f68b..ecb3eae76cb 100644
--- a/drivers/usbhost/usbhost_storage.c
+++ b/drivers/usbhost/usbhost_storage.c
@@ -2235,7 +2235,7 @@ static int usbhost_geometry(FAR struct inode *inode,
           geometry->geo_sectorsize    = priv->blocksize;
           nxmutex_unlock(&priv->lock);
 
-          uinfo("nsectors: %" PRIdOFF " sectorsize: %" PRIi16 "\n",
+          uinfo("nsectors: %" PRIdOFF " sectorsize: %" PRId32 "\n",
                 geometry->geo_nsectors, geometry->geo_sectorsize);
         }
     }
diff --git a/fs/driver/fs_blockmerge.c b/fs/driver/fs_blockmerge.c
index 69506611c0e..3d4a5d45161 100644
--- a/fs/driver/fs_blockmerge.c
+++ b/fs/driver/fs_blockmerge.c
@@ -126,7 +126,7 @@ static int merge_open(FAR struct inode *inode)
           goto err_with_inode;
         }
 
-      finfo("[%s] nsectors: %" PRIuOFF " sectorsize:%u\n",
+      finfo("[%s] nsectors: %" PRIuOFF " sectorsize:%" PRId32 "\n",
             priv->part[i].path, priv->part[i].geo.geo_nsectors,
             priv->part[i].geo.geo_sectorsize);
     }
@@ -260,7 +260,7 @@ static int merge_geometry(FAR struct inode *inode,
           geometry->geo_nsectors += priv->part[i].geo.geo_nsectors;
         }
 
-      finfo("nsectors: %" PRIuOFF " sectorsize:%u\n",
+      finfo("nsectors: %" PRIuOFF " sectorsize:%" PRId32 "\n",
             geometry->geo_nsectors, geometry->geo_sectorsize);
       return OK;
     }
diff --git a/include/nuttx/fs/hostfs.h b/include/nuttx/fs/hostfs.h
index 85840d23b5e..694efe10c45 100644
--- a/include/nuttx/fs/hostfs.h
+++ b/include/nuttx/fs/hostfs.h
@@ -123,7 +123,7 @@
 
 /* These must match the definitions in include/sys/types.h */
 
-typedef int16_t      nuttx_blksize_t;
+typedef int32_t      nuttx_blksize_t;
 
 #  ifdef CONFIG_SMALL_MEMORY
 typedef uint16_t     nuttx_size_t;
diff --git a/include/sys/types.h b/include/sys/types.h
index e36aad87d49..31e8410e789 100644
--- a/include/sys/types.h
+++ b/include/sys/types.h
@@ -229,7 +229,7 @@ typedef off_t        loff_t;
 
 /* blksize_t is a signed integer value used for file block sizes */
 
-typedef int16_t      blksize_t;
+typedef int32_t      blksize_t;
 
 /* Network related */
 

Reply via email to