]> git.sur5r.net Git - openocd/blobdiff - src/flash/nor/at91sam7.c
at91sam7: ensure probed flash bank has a name (fix a segfault)
[openocd] / 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;