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

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


The following commit(s) were added to refs/heads/master by this push:
     new ca8ce37  fs/romfs: fix bug about compare path with same prefix
ca8ce37 is described below

commit ca8ce3743346eebdab3334d2b25f5fe914699126
Author: Jiuzhu Dong <dongjiuz...@xiaomi.com>
AuthorDate: Mon Mar 28 23:10:11 2022 +0800

    fs/romfs: fix bug about compare path with same prefix
    
    Signed-off-by: Jiuzhu Dong <dongjiuz...@xiaomi.com>
---
 fs/romfs/fs_romfsutil.c | 35 ++++++++++++++++++++++++++++-------
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/fs/romfs/fs_romfsutil.c b/fs/romfs/fs_romfsutil.c
index 1d4d91c..0cb1038 100644
--- a/fs/romfs/fs_romfsutil.c
+++ b/fs/romfs/fs_romfsutil.c
@@ -51,6 +51,16 @@
 #define NODEINFO_NINCR    4
 
 /****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct romfs_entryname_s
+{
+  FAR const char *re_name;
+  size_t re_len;
+};
+
+/****************************************************************************
  * Private Functions
  ****************************************************************************/
 
@@ -268,17 +278,22 @@ static int romfs_followhardlinks(FAR struct 
romfs_mountpt_s *rm,
 static int romfs_nodeinfo_search(FAR const void *a, FAR const void *b)
 {
   FAR struct romfs_nodeinfo_s *nodeinfo = *(FAR struct romfs_nodeinfo_s **)b;
+  FAR const struct romfs_entryname_s *entry = a;
   FAR const char *name2 = nodeinfo->rn_name;
-  FAR const char *name1 = a;
   size_t len = nodeinfo->rn_namesize;
   int ret;
 
-  ret = strncmp(name1, name2, len);
+  if (len > entry->re_len)
+    {
+      len = entry->re_len;
+    }
+
+  ret = strncmp(entry->re_name, name2, len);
   if (!ret)
     {
-      if (name1[len] == '/' || name1[len] == '\0')
+      if (entry->re_name[len] == '/' || entry->re_name[len] == '\0')
         {
-          return 0;
+          return name2[len] == '\0' ? 0 : -1;
         }
       else
         {
@@ -291,9 +306,12 @@ static int romfs_nodeinfo_search(FAR const void *a, FAR 
const void *b)
 
 static int romfs_nodeinfo_compare(FAR const void *a, FAR const void *b)
 {
-  FAR const char *name = (*(FAR struct romfs_nodeinfo_s **)a)->rn_name;
+  FAR struct romfs_nodeinfo_s *nodeinfo = *(FAR struct romfs_nodeinfo_s **)a;
+  struct romfs_entryname_s entry;
 
-  return romfs_nodeinfo_search(name, b);
+  entry.re_name = nodeinfo->rn_name;
+  entry.re_len = nodeinfo->rn_namesize;
+  return romfs_nodeinfo_search(&entry, b);
 }
 #endif
 
@@ -312,8 +330,11 @@ static inline int romfs_searchdir(FAR struct 
romfs_mountpt_s *rm,
 {
 #ifdef CONFIG_FS_ROMFS_CACHE_NODE
   FAR struct romfs_nodeinfo_s **cnodeinfo;
+  struct romfs_entryname_s entry;
 
-  cnodeinfo = bsearch(entryname, nodeinfo->rn_child, nodeinfo->rn_count,
+  entry.re_name = entryname;
+  entry.re_len = entrylen;
+  cnodeinfo = bsearch(&entry, nodeinfo->rn_child, nodeinfo->rn_count,
                       sizeof(*nodeinfo->rn_child), romfs_nodeinfo_search);
   if (cnodeinfo)
     {

Reply via email to