Print this page
8226 missing boot environments cause bootadm list-menu to segfault

@@ -24,10 +24,11 @@
  */
 
 /*
  * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
  * Copyright 2016 Toomas Soome <tsoome@me.com>
+ * Copyright 2017 RackTop Systems.
  */
 
 /*
  * Loader menu management.
  */

@@ -180,36 +181,40 @@
 static void
 print_menu_nodes(boolean_t parsable, struct hdr_info *hdr,
     struct menu_lst *menu)
 {
         struct menu_entry  *entry;
-        int i = -1;
+        int i = 0;
         int rv;
         be_node_list_t *be_nodes, *be_node;
 
         rv = be_list(NULL, &be_nodes);
         if (rv != BE_SUCCESS)
                 return;
 
         STAILQ_FOREACH(entry, menu, next) {
-                i++;
+                boolean_t active = B_FALSE;
+
                 for (be_node = be_nodes; be_node;
                     be_node = be_node->be_next_node)
                         if (strcmp(be_node->be_root_ds, entry->bootfs) == 0)
-                                break;
+                                if (be_node->be_active_on_boot)
+                                        active = B_TRUE;
 
                 if (parsable)
                         (void) printf("%d;%s;%s;%s\n", i,
-                            be_node->be_active_on_boot == B_TRUE? "*" : "-",
+                            active == B_TRUE ? "*" : "-",
                             entry->bootfs, entry->title);
                 else
                         (void) printf("%-*d %-*s %-*s %-*s\n",
                             hdr->cols[0].width, i,
                             hdr->cols[1].width,
-                            be_node->be_active_on_boot == B_TRUE? "*" : "-",
+                            active == B_TRUE ? "*" : "-",
                             hdr->cols[2].width, entry->bootfs,
                             hdr->cols[3].width, entry->title);
+
+                i++;
         }
         be_free_list(be_nodes);
 }
 
 static void