diff options
author | William Wilgus <wilgus.william@gmail.com> | 2024-03-26 19:02:09 -0400 |
---|---|---|
committer | William Wilgus <me.theuser@yahoo.com> | 2024-03-29 10:27:03 -0400 |
commit | 52e22b253d7b7d2419a9fb22e2f40c5aeeaa821d (patch) | |
tree | 2869286de851e0a7affd2b7061a1b93cb2fb4710 /firmware/common/rb_namespace.c | |
parent | 19f21a2b3f75b38d313a3d9a1f87a537211c0204 (diff) | |
download | rockbox-52e22b253d7b7d2419a9fb22e2f40c5aeeaa821d.tar.gz rockbox-52e22b253d7b7d2419a9fb22e2f40c5aeeaa821d.zip |
[Bugfix] ft_assemble_path extra slashes, Volume unmound double free
Change-Id: Ie2e7702d8e252ce29af0b9dbd2e8d9e892b9ca18
Diffstat (limited to 'firmware/common/rb_namespace.c')
-rw-r--r-- | firmware/common/rb_namespace.c | 19 |
1 files changed, 10 insertions, 9 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; |