diff options
author | Thomas Martitz <kugel@rockbox.org> | 2011-08-16 13:01:03 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2011-08-16 13:01:03 +0000 |
commit | c08299cedd4424e0777090228f46901addf78ee6 (patch) | |
tree | a358db307eea118f51809b995556704d7d0a4801 /firmware/common | |
parent | 2ec357248ceeb7ad847cf0b52fbd3678e092b182 (diff) | |
download | rockbox-c08299cedd4424e0777090228f46901addf78ee6.tar.gz rockbox-c08299cedd4424e0777090228f46901addf78ee6.zip |
Dircache: Fix memory leak (and recently panic).
If the dircache was interrupted during generation (e.g. through USB
insertion), then the allocated buffer was leaked and a new one
was allocated for the second cache generation. This causes a
panic since r30308 since playback holds the control over the
audiobuffer at that time.
The fix is to simply check allocated_size instead of
dircache_size which is reset to 0 upon cancellation.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30321 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/common')
-rw-r--r-- | firmware/common/dircache.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index f42c79d169..f47e65e428 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c | |||
@@ -107,7 +107,7 @@ static struct dircache_entry *fd_bindings[MAX_OPEN_FILES]; | |||
107 | static bool dircache_initialized = false; | 107 | static bool dircache_initialized = false; |
108 | static bool dircache_initializing = false; | 108 | static bool dircache_initializing = false; |
109 | static bool thread_enabled = false; | 109 | static bool thread_enabled = false; |
110 | static unsigned long allocated_size = DIRCACHE_LIMIT; | 110 | static unsigned long allocated_size = 0; |
111 | static unsigned long dircache_size = 0; | 111 | static unsigned long dircache_size = 0; |
112 | static unsigned long entry_count = 0; | 112 | static unsigned long entry_count = 0; |
113 | static unsigned long reserve_used = 0; | 113 | static unsigned long reserve_used = 0; |
@@ -829,7 +829,7 @@ int dircache_build(int last_size) | |||
829 | #endif | 829 | #endif |
830 | 830 | ||
831 | /* Background build, dircache has been previously allocated */ | 831 | /* Background build, dircache has been previously allocated */ |
832 | if (dircache_size > 0) | 832 | if (allocated_size > 0) |
833 | { | 833 | { |
834 | d_names_start = d_names_end; | 834 | d_names_start = d_names_end; |
835 | dircache_size = 0; | 835 | dircache_size = 0; |