diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2011-10-17 14:49:18 +0200 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2011-11-15 09:27:50 +0000 |
commit | 67c3ad8c403ec552cff6a499f8834f369f928c4f (patch) | |
tree | 142d8c86f44aceaefe1aa3dd1812a262d138a14a /src | |
parent | a943ec1ca9e8ef742ce0c0ae6b15acff960675ef (diff) |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/flash/nor/at91sam7.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/src/flash/nor/at91sam7.c b/src/flash/nor/at91sam7.c index 67e383a3..74d9ba3d 100644 --- a/src/flash/nor/at91sam7.c +++ b/src/flash/nor/at91sam7.c @@ -622,16 +622,19 @@ static int at91sam7_read_part_info(struct flash_bank *bank) { if (bnk > 0) { - /* create a new flash bank element */ - struct flash_bank *fb = malloc(sizeof(struct flash_bank)); - fb->target = target; - fb->driver = bank->driver; - fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank)); - fb->next = NULL; - - /* link created bank in 'flash_banks' list and redirect t_bank */ - t_bank->next = fb; - t_bank = fb; + if (!t_bank->next) { + /* create a new flash bank element */ + struct flash_bank *fb = malloc(sizeof(struct flash_bank)); + fb->target = target; + fb->driver = bank->driver; + fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank)); + fb->name = "sam7_probed"; + fb->next = NULL; + + /* link created bank in 'flash_banks' list */ + t_bank->next = fb; + } + t_bank = t_bank->next; } t_bank->bank_number = bnk; @@ -875,16 +878,19 @@ FLASH_BANK_COMMAND_HANDLER(at91sam7_flash_bank_command) { if (bnk > 0) { - /* create a new bank element */ - struct flash_bank *fb = malloc(sizeof(struct flash_bank)); - fb->target = target; - fb->driver = bank->driver; - fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank)); - fb->next = NULL; - - /* link created bank in 'flash_banks' list and redirect t_bank */ - t_bank->next = fb; - t_bank = fb; + if (!t_bank->next) { + /* create a new bank element */ + struct flash_bank *fb = malloc(sizeof(struct flash_bank)); + fb->target = target; + fb->driver = bank->driver; + fb->driver_priv = malloc(sizeof(struct at91sam7_flash_bank)); + fb->name = "sam7_probed"; + fb->next = NULL; + + /* link created bank in 'flash_banks' list */ + t_bank->next = fb; + } + t_bank = t_bank->next; } t_bank->bank_number = bnk; |