]> code.delx.au - refind/blobdiff - refind/config.c
Fixed bug that caused crash when an empty refind_linux.conf file was
[refind] / refind / config.c
index 9e5016b0f9022fbb9c3a398e797fb24bf6ea0a6f..fa1d9a6f53857a1c236fb679322060eeb92c3d2b 100644 (file)
@@ -35,7 +35,7 @@
  */
 
 /*
- * Modifications copyright (c) 2012-2014 Roderick W. Smith
+ * Modifications copyright (c) 2012-2015 Roderick W. Smith
  * 
  * Modifications distributed under the terms of the GNU General Public
  * License (GPL) version 3 (GPLv3), a copy of which must be distributed
@@ -64,7 +64,8 @@
 #define GetTime ST->RuntimeServices->GetTime
 #define LAST_MINUTE 1439 /* Last minute of a day */
 
-static REFIT_MENU_ENTRY MenuEntryReturn   = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL };
+extern REFIT_MENU_ENTRY MenuEntryReturn;
+//static REFIT_MENU_ENTRY MenuEntryReturn   = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL };
 
 //
 // read a file into a buffer
@@ -266,6 +267,10 @@ UINTN ReadTokenLine(IN REFIT_FILE *File, OUT CHAR16 ***TokenList)
         Line = ReadLine(File);
         if (Line == NULL)
             return(0);
+        if (Line[0] == L'\0') {
+            MyFreePool(Line);
+            return(0);
+        } // if
 
         p = Line;
         LineFinished = FALSE;
@@ -399,7 +404,7 @@ static BOOLEAN HandleBoolean(IN CHAR16 **TokenList, IN UINTN TokenCount) {
 static VOID SetDefaultByTime(IN CHAR16 **TokenList, OUT CHAR16 **Default) {
    EFI_STATUS            Status;
    EFI_TIME              CurrentTime;
-   UINTN                 StartTime = LAST_MINUTE + 1, EndTime = LAST_MINUTE + 1, Now;
+   UINTN                 StartTime, EndTime, Now;
    BOOLEAN               SetIt = FALSE;
 
    StartTime = HandleTime(TokenList[2]);
@@ -514,6 +519,8 @@ VOID ReadConfig(CHAR16 *FileName)
                    GlobalConfig.HideUIFlags |= HIDEUI_FLAG_EDITOR;
                 } else if (StriCmp(FlagName, L"safemode") == 0) {
                    GlobalConfig.HideUIFlags |= HIDEUI_FLAG_SAFEMODE;
+                } else if (StriCmp(FlagName, L"badges") == 0) {
+                   GlobalConfig.HideUIFlags |= HIDEUI_FLAG_BADGES;
                 } else if (StriCmp(FlagName, L"all") == 0) {
                    GlobalConfig.HideUIFlags = HIDEUI_FLAG_ALL;
                 } else {
@@ -767,11 +774,13 @@ static VOID AddSubmenu(LOADER_ENTRY *Entry, REFIT_FILE *File, REFIT_VOLUME *Volu
 
       } else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) {
          if (FindVolume(&Volume, TokenList[1])) {
-            MyFreePool(SubEntry->me.Title);
-            SubEntry->me.Title        = AllocateZeroPool(256 * sizeof(CHAR16));
-            SPrint(SubEntry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", Volume->VolName);
-            SubEntry->me.BadgeImage   = Volume->VolBadgeImage;
-            SubEntry->VolName         = Volume->VolName;
+            if ((Volume != NULL) && (Volume->IsReadable) && (Volume->RootDir)) {
+               MyFreePool(SubEntry->me.Title);
+               SubEntry->me.Title        = AllocateZeroPool(256 * sizeof(CHAR16));
+               SPrint(SubEntry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", Volume->VolName);
+               SubEntry->me.BadgeImage   = Volume->VolBadgeImage;
+               SubEntry->VolName         = Volume->VolName;
+            } // if volume is readable
          } // if match found
 
       } else if (StriCmp(TokenList[0], L"initrd") == 0) {
@@ -848,11 +857,13 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C
 
       } else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) {
          if (FindVolume(&CurrentVolume, TokenList[1])) {
-            MyFreePool(Entry->me.Title);
-            Entry->me.Title        = AllocateZeroPool(256 * sizeof(CHAR16));
-            SPrint(Entry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", CurrentVolume->VolName);
-            Entry->me.BadgeImage   = CurrentVolume->VolBadgeImage;
-            Entry->VolName         = CurrentVolume->VolName;
+            if ((CurrentVolume != NULL) && (CurrentVolume->IsReadable) && (CurrentVolume->RootDir)) {
+               MyFreePool(Entry->me.Title);
+               Entry->me.Title        = AllocateZeroPool(256 * sizeof(CHAR16));
+               SPrint(Entry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", CurrentVolume->VolName);
+               Entry->me.BadgeImage   = CurrentVolume->VolBadgeImage;
+               Entry->VolName         = CurrentVolume->VolName;
+            } // if volume is readable
          } // if match found
 
       } else if ((StriCmp(TokenList[0], L"icon") == 0) && (TokenCount > 1)) {