summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2024-03-26 19:02:09 -0400
committerWilliam Wilgus <me.theuser@yahoo.com>2024-03-29 10:27:03 -0400
commit52e22b253d7b7d2419a9fb22e2f40c5aeeaa821d (patch)
tree2869286de851e0a7affd2b7061a1b93cb2fb4710 /firmware
parent19f21a2b3f75b38d313a3d9a1f87a537211c0204 (diff)
downloadrockbox-52e22b253d7b7d2419a9fb22e2f40c5aeeaa821d.tar.gz
rockbox-52e22b253d7b7d2419a9fb22e2f40c5aeeaa821d.zip
[Bugfix] ft_assemble_path extra slashes, Volume unmound double free
Change-Id: Ie2e7702d8e252ce29af0b9dbd2e8d9e892b9ca18
Diffstat (limited to 'firmware')
-rw-r--r--firmware/common/rb_namespace.c19
-rw-r--r--firmware/include/dircache_redirect.h5
2 files changed, 12 insertions, 12 deletions
diff --git a/firmware/common/rb_namespace.c b/firmware/common/rb_namespace.c
index 85f647c474..5069a8681e 100644
--- a/firmware/common/rb_namespace.c
+++ b/firmware/common/rb_namespace.c
@@ -74,7 +74,7 @@ static void unmount_item(int item)
74 if (!state) 74 if (!state)
75 return; 75 return;
76 76
77 if (state & NSITEM_CONTENTS) 77 if (item == ROOT_CONTENTS_INDEX && state & NSITEM_CONTENTS)
78 { 78 {
79 fileobj_unmount(root_bindp); 79 fileobj_unmount(root_bindp);
80 root_bindp = NULL; 80 root_bindp = NULL;
@@ -139,18 +139,19 @@ int root_mount_path(const char *path, unsigned int flags)
139 int root_state = NSITEM_MOUNTED | (flags & (NSITEM_HIDDEN|NSITEM_CONTENTS)); 139 int root_state = NSITEM_MOUNTED | (flags & (NSITEM_HIDDEN|NSITEM_CONTENTS));
140 set_root_item_state(ROOT_CONTENTS_INDEX, root_state); 140 set_root_item_state(ROOT_CONTENTS_INDEX, root_state);
141 flags |= state; /* preserve the state of the mounted volume */ 141 flags |= state; /* preserve the state of the mounted volume */
142 if (!folder) 142
143 { 143 if (folder)
144 folder = "";
145 }
146 else
147 { 144 {
145 while (*folder == PATH_SEPCH)
146 folder++;
148 /*if a folder has been enumerated don't mark the whole volume */ 147 /*if a folder has been enumerated don't mark the whole volume */
149 if (folder[0] != '\0' && folder[1] != '\0') 148 if (folder[0] != '\0')
150 flags &= ~NSITEM_CONTENTS; 149 flags &= ~NSITEM_CONTENTS;
151 150 else
151 folder = NULL; /*Ensure separator is added by path_append */
152 } 152 }
153 snprintf(root_realpath_internal(), ROOT_MAX_REALPATH,"%s%s", volname, folder); 153
154 path_append(root_realpath_internal(), volname, folder, ROOT_MAX_REALPATH);
154 } 155 }
155 else if (state) /* error volume already mounted */ 156 else if (state) /* error volume already mounted */
156 return -EBUSY; 157 return -EBUSY;
diff --git a/firmware/include/dircache_redirect.h b/firmware/include/dircache_redirect.h
index 36f68b7251..f51ce70690 100644
--- a/firmware/include/dircache_redirect.h
+++ b/firmware/include/dircache_redirect.h
@@ -139,10 +139,8 @@ static inline void fileop_onsync_internal(struct filestr_base *stream)
139 139
140static inline void volume_onmount_internal(IF_MV_NONVOID(int volume)) 140static inline void volume_onmount_internal(IF_MV_NONVOID(int volume))
141{ 141{
142#if (defined(HAVE_MULTIVOLUME) || (defined(HAVE_MULTIBOOT) && !defined(BOOTLOADER)))
143 char path[VOL_MAX_LEN+2];
144#endif
145#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR) && !defined(BOOTLOADER) 142#if defined(HAVE_MULTIBOOT) && !defined(SIMULATOR) && !defined(BOOTLOADER)
143 char path[VOL_MAX_LEN+2];
146 char rtpath[MAX_PATH / 2]; 144 char rtpath[MAX_PATH / 2];
147 make_volume_root(volume, path); 145 make_volume_root(volume, path);
148 146
@@ -185,6 +183,7 @@ standard_redirect:
185 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS); 183 root_mount_path(RB_ROOT_CONTENTS_DIR, NSITEM_CONTENTS);
186 } 184 }
187#elif defined(HAVE_MULTIVOLUME) 185#elif defined(HAVE_MULTIVOLUME)
186 char path[VOL_MAX_LEN+2];
188 make_volume_root(volume, path); 187 make_volume_root(volume, path);
189 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0); 188 root_mount_path(path, RB_ROOT_VOL_HIDDEN(volume) ? NSITEM_HIDDEN : 0);
190 if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false)) 189 if (volume == path_strip_volume(RB_ROOT_CONTENTS_DIR, NULL, false))