Fix FS#12325 - screen corruption on early usb.
When booting with USB inserted, the dircache build can get interrupted by the usb connection, in which case the dircache buffer is freed. Due to a bug the re-creation of dircache used the old freed buffer and overwrite new allocs (causing screen corruption). Set allocated_size to 0 to make it not take the code path that assumes an existing buffer, and bring that and freeing together in the code. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30845 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
f5d664ad93
commit
9886126858
1 changed files with 13 additions and 5 deletions
|
@ -824,6 +824,15 @@ static int dircache_do_rebuild(void)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Free all associated resources, if any */
|
||||
static void dircache_free(void)
|
||||
{
|
||||
if (dircache_handle > 0)
|
||||
dircache_handle = core_free(dircache_handle);
|
||||
dircache_size = allocated_size = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal thread that controls transparent cache building.
|
||||
*/
|
||||
|
@ -846,7 +855,7 @@ static void dircache_thread(void)
|
|||
case DIRCACHE_BUILD:
|
||||
thread_enabled = true;
|
||||
if (dircache_do_rebuild() < 0)
|
||||
dircache_handle = core_free(dircache_handle);
|
||||
dircache_free();
|
||||
thread_enabled = false;
|
||||
break ;
|
||||
|
||||
|
@ -902,8 +911,8 @@ int dircache_build(int last_size)
|
|||
return 2;
|
||||
}
|
||||
|
||||
if (dircache_handle > 0)
|
||||
dircache_handle = core_free(dircache_handle);
|
||||
/* start by freeing, as we possibly re-allocate */
|
||||
dircache_free();
|
||||
|
||||
if (last_size > DIRCACHE_RESERVE && last_size < DIRCACHE_LIMIT )
|
||||
{
|
||||
|
@ -1130,8 +1139,7 @@ bool dircache_resume(void)
|
|||
void dircache_disable(void)
|
||||
{
|
||||
dircache_suspend();
|
||||
dircache_handle = core_free(dircache_handle);
|
||||
dircache_size = allocated_size = 0;
|
||||
dircache_free();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue