summaryrefslogtreecommitdiff
path: root/firmware/common
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2011-08-16 13:01:03 +0000
committerThomas Martitz <kugel@rockbox.org>2011-08-16 13:01:03 +0000
commitc08299cedd4424e0777090228f46901addf78ee6 (patch)
treea358db307eea118f51809b995556704d7d0a4801 /firmware/common
parent2ec357248ceeb7ad847cf0b52fbd3678e092b182 (diff)
downloadrockbox-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.c4
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];
107static bool dircache_initialized = false; 107static bool dircache_initialized = false;
108static bool dircache_initializing = false; 108static bool dircache_initializing = false;
109static bool thread_enabled = false; 109static bool thread_enabled = false;
110static unsigned long allocated_size = DIRCACHE_LIMIT; 110static unsigned long allocated_size = 0;
111static unsigned long dircache_size = 0; 111static unsigned long dircache_size = 0;
112static unsigned long entry_count = 0; 112static unsigned long entry_count = 0;
113static unsigned long reserve_used = 0; 113static 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;