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) {