]> git.proxmox.com Git - mirror_edk2.git/blobdiff - FatPkg/EnhancedFatDxe/Misc.c
FatPkg: Clean up source files
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Misc.c
index c035670bf78fcc831eae00bc38d2a3e23cc35e5d..244b9dd921afb21cb7e1291cd06e3523bc42d492 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Miscellaneous functions.\r
 \r
-Copyright (c) 2005 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available\r
 under the terms and conditions of the BSD License which accompanies this\r
 distribution. The full text of the license may be found at\r
@@ -132,6 +132,7 @@ FatQueueTask (
 {\r
   EFI_STATUS          Status;\r
   LIST_ENTRY          *Link;\r
+  LIST_ENTRY          *NextLink;\r
   FAT_SUBTASK         *Subtask;\r
 \r
   //\r
@@ -149,13 +150,21 @@ FatQueueTask (
   EfiReleaseLock (&FatTaskLock);\r
 \r
   Status = EFI_SUCCESS;\r
-  for ( Link = GetFirstNode (&Task->Subtasks)\r
-      ; !IsNull (&Task->Subtasks, Link)\r
-      ; Link = GetNextNode (&Task->Subtasks, Link)\r
+  //\r
+  // Use NextLink to store the next link of the list, because Link might be remove from the\r
+  // doubly-linked list and get freed in the end of current loop.\r
+  //\r
+  // Also, list operation APIs like IsNull() and GetNextNode() are avoided during the loop, since\r
+  // they may check the validity of doubly-linked lists by traversing them. These APIs cannot\r
+  // handle list elements being removed during the traverse.\r
+  //\r
+  for ( Link = GetFirstNode (&Task->Subtasks), NextLink = GetNextNode (&Task->Subtasks, Link)\r
+      ; Link != &Task->Subtasks\r
+      ; Link = NextLink, NextLink = Link->ForwardLink\r
       ) {\r
     Subtask = CR (Link, FAT_SUBTASK, Link, FAT_SUBTASK_SIGNATURE);\r
     if (Subtask->Write) {\r
-      \r
+\r
       Status = IFile->OFile->Volume->DiskIo2->WriteDiskEx (\r
                                                 IFile->OFile->Volume->DiskIo2,\r
                                                 IFile->OFile->Volume->MediaId,\r