at91sam7: ensure probed flash bank has a name (fix a segfault)
authorAurelien Jacobs <aurel@gnuage.org>
Mon, 17 Oct 2011 12:49:18 +0000 (14:49 +0200)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 15 Nov 2011 09:27:50 +0000 (09:27 +0000)
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>
src/flash/nor/at91sam7.c

index 67e383a333c3937f2e51abac1c263aa16e10657a..74d9ba3d9c7074af2d7c513c51e3d8bd4bcfacb3 100644 (file)
@@ -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;

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)