at91sam7: ensure probed flash bank has a name (fix a segfault)
Before this commit, openocd used to segfault when probing flash of an at91sam7x512 (which contains 2 banks of flash). This was due to the way it systematically insert a new flash bank without setting its name. Then, when get_flash_bank_by_name_noprobe() is called, it is doing a strcmp() on the non-initialized bank->name. This commit prevents allocation of second probed bank if it is already allocated (for example, if it is set in a target config file). If a new bank really needs to be allocated, it ensures that a default name is set. Change-Id: I38d15bef1fda2ec746efad37171975136cf7b371 Signed-off-by: Aurelien Jacobs <aurel@gnuage.org> Reviewed-on: http://openocd.zylin.com/171 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>__archive__
parent
a943ec1ca9
commit
67c3ad8c40
|
@ -622,16 +622,19 @@ static int at91sam7_read_part_info(struct flash_bank *bank)
|
||||||
{
|
{
|
||||||
if (bnk > 0)
|
if (bnk > 0)
|
||||||
{
|
{
|
||||||
/* create a new flash bank element */
|
if (!t_bank->next) {
|
||||||
struct flash_bank *fb = malloc(sizeof(struct flash_bank));
|
/* create a new flash bank element */
|
||||||
fb->target = target;
|
struct flash_bank *fb = malloc(sizeof(struct flash_bank));
|
||||||
fb->driver = bank->driver;
|
fb->target = target;
|
||||||
fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
|
fb->driver = bank->driver;
|
||||||
fb->next = NULL;
|
fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
|
||||||
|
fb->name = "sam7_probed";
|
||||||
|
fb->next = NULL;
|
||||||
|
|
||||||
/* link created bank in 'flash_banks' list and redirect t_bank */
|
/* link created bank in 'flash_banks' list */
|
||||||
t_bank->next = fb;
|
t_bank->next = fb;
|
||||||
t_bank = fb;
|
}
|
||||||
|
t_bank = t_bank->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
t_bank->bank_number = bnk;
|
t_bank->bank_number = bnk;
|
||||||
|
@ -875,16 +878,19 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command)
|
||||||
{
|
{
|
||||||
if (bnk > 0)
|
if (bnk > 0)
|
||||||
{
|
{
|
||||||
/* create a new bank element */
|
if (!t_bank->next) {
|
||||||
struct flash_bank *fb = malloc(sizeof(struct flash_bank));
|
/* create a new bank element */
|
||||||
fb->target = target;
|
struct flash_bank *fb = malloc(sizeof(struct flash_bank));
|
||||||
fb->driver = bank->driver;
|
fb->target = target;
|
||||||
fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
|
fb->driver = bank->driver;
|
||||||
fb->next = NULL;
|
fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank));
|
||||||
|
fb->name = "sam7_probed";
|
||||||
|
fb->next = NULL;
|
||||||
|
|
||||||
/* link created bank in 'flash_banks' list and redirect t_bank */
|
/* link created bank in 'flash_banks' list */
|
||||||
t_bank->next = fb;
|
t_bank->next = fb;
|
||||||
t_bank = fb;
|
}
|
||||||
|
t_bank = t_bank->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
t_bank->bank_number = bnk;
|
t_bank->bank_number = bnk;
|
||||||
|
|
Loading…
Reference in New Issue