]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Hash.c
FatPkg EnhancedFatDxe: Use safe string functions
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Hash.c
CommitLineData
b9ec9330
QH
1/*++\r
2\r
e76bc43e 3Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>\r
6163cc98 4This program and the accompanying materials are licensed and made available\r
b9ec9330
QH
5under the terms and conditions of the BSD License which accompanies this\r
6distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12\r
13Module Name:\r
14\r
15 Hash.c\r
16\r
17Abstract:\r
18\r
19 Hash table operations\r
20\r
21Revision History\r
22\r
23--*/\r
24\r
25#include "Fat.h"\r
26\r
27STATIC\r
28UINT32\r
29FatHashLongName (\r
30 IN CHAR16 *LongNameString\r
31 )\r
32/*++\r
33\r
34Routine Description:\r
35\r
36 Get hash value for long name.\r
37\r
38Arguments:\r
39\r
40 LongNameString - The long name string to be hashed.\r
41\r
42Returns:\r
43\r
44 HashValue.\r
45\r
46--*/\r
47{\r
48 UINT32 HashValue;\r
49 CHAR16 UpCasedLongFileName[EFI_PATH_STRING_LENGTH];\r
e76bc43e
HW
50 StrnCpyS (\r
51 UpCasedLongFileName,\r
52 sizeof (UpCasedLongFileName) / sizeof (UpCasedLongFileName[0]),\r
53 LongNameString,\r
54 sizeof (UpCasedLongFileName) / sizeof (UpCasedLongFileName[0]) - 1\r
55 );\r
b9ec9330
QH
56 FatStrUpr (UpCasedLongFileName);\r
57 gBS->CalculateCrc32 (UpCasedLongFileName, StrSize (UpCasedLongFileName), &HashValue);\r
58 return (HashValue & HASH_TABLE_MASK);\r
59}\r
60\r
61STATIC\r
62UINT32\r
63FatHashShortName (\r
64 IN CHAR8 *ShortNameString\r
65 )\r
66/*++\r
67\r
68Routine Description:\r
69\r
70 Get hash value for short name.\r
71\r
72Arguments:\r
73\r
74 ShortNameString - The short name string to be hashed.\r
75\r
76Returns:\r
77\r
78 HashValue\r
79\r
80--*/\r
81{\r
82 UINT32 HashValue;\r
83 gBS->CalculateCrc32 (ShortNameString, FAT_NAME_LEN, &HashValue);\r
84 return (HashValue & HASH_TABLE_MASK);\r
85}\r
86\r
87FAT_DIRENT **\r
88FatLongNameHashSearch (\r
89 IN FAT_ODIR *ODir,\r
90 IN CHAR16 *LongNameString\r
91 )\r
92/*++\r
93\r
94Routine Description:\r
95\r
96 Search the long name hash table for the directory entry.\r
97\r
98Arguments:\r
99\r
100 ODir - The directory to be searched.\r
101 LongNameString - The long name string to search.\r
102\r
103Returns:\r
104\r
105 The previous long name hash node of the directory entry.\r
106\r
107--*/\r
108{\r
109 FAT_DIRENT **PreviousHashNode;\r
110 for (PreviousHashNode = &ODir->LongNameHashTable[FatHashLongName (LongNameString)];\r
111 *PreviousHashNode != NULL;\r
112 PreviousHashNode = &(*PreviousHashNode)->LongNameForwardLink\r
113 ) {\r
114 if (FatStriCmp (LongNameString, (*PreviousHashNode)->FileString) == 0) {\r
115 break;\r
116 }\r
117 }\r
118\r
119 return PreviousHashNode;\r
120}\r
121\r
122FAT_DIRENT **\r
123FatShortNameHashSearch (\r
124 IN FAT_ODIR *ODir,\r
125 IN CHAR8 *ShortNameString\r
126 )\r
127/*++\r
128\r
129Routine Description:\r
130\r
131 Search the short name hash table for the directory entry.\r
132\r
133Arguments:\r
134\r
135 ODir - The directory to be searched.\r
136 ShortNameString - The short name string to search.\r
137\r
138Returns:\r
139\r
140 The previous short name hash node of the directory entry.\r
141\r
142--*/\r
143{\r
144 FAT_DIRENT **PreviousHashNode;\r
145 for (PreviousHashNode = &ODir->ShortNameHashTable[FatHashShortName (ShortNameString)];\r
146 *PreviousHashNode != NULL;\r
147 PreviousHashNode = &(*PreviousHashNode)->ShortNameForwardLink\r
148 ) {\r
149 if (CompareMem (ShortNameString, (*PreviousHashNode)->Entry.FileName, FAT_NAME_LEN) == 0) {\r
150 break;\r
151 }\r
152 }\r
153\r
154 return PreviousHashNode;\r
155}\r
156\r
157VOID\r
158FatInsertToHashTable (\r
159 IN FAT_ODIR *ODir,\r
160 IN FAT_DIRENT *DirEnt\r
161 )\r
162/*++\r
163\r
164Routine Description:\r
165\r
166 Insert directory entry to hash table.\r
167\r
168Arguments:\r
169\r
170 ODir - The parent directory.\r
171 DirEnt - The directory entry node.\r
172\r
173Returns:\r
174\r
175 None.\r
176\r
177--*/\r
178{\r
179 FAT_DIRENT **HashTable;\r
180 UINT32 HashTableIndex;\r
181\r
182 //\r
183 // Insert hash table index for short name\r
184 //\r
185 HashTableIndex = FatHashShortName (DirEnt->Entry.FileName);\r
186 HashTable = ODir->ShortNameHashTable;\r
187 DirEnt->ShortNameForwardLink = HashTable[HashTableIndex];\r
188 HashTable[HashTableIndex] = DirEnt;\r
189 //\r
190 // Insert hash table index for long name\r
191 //\r
192 HashTableIndex = FatHashLongName (DirEnt->FileString);\r
193 HashTable = ODir->LongNameHashTable;\r
194 DirEnt->LongNameForwardLink = HashTable[HashTableIndex];\r
195 HashTable[HashTableIndex] = DirEnt;\r
196}\r
197\r
198VOID\r
199FatDeleteFromHashTable (\r
200 IN FAT_ODIR *ODir,\r
201 IN FAT_DIRENT *DirEnt\r
202 )\r
203/*++\r
204\r
205Routine Description:\r
206\r
207 Delete directory entry from hash table.\r
208\r
209Arguments:\r
210\r
211 ODir - The parent directory.\r
212 DirEnt - The directory entry node.\r
213\r
214Returns:\r
215\r
216 None.\r
217\r
218--*/\r
219{\r
220 *FatShortNameHashSearch (ODir, DirEnt->Entry.FileName) = DirEnt->ShortNameForwardLink;\r
221 *FatLongNameHashSearch (ODir, DirEnt->FileString) = DirEnt->LongNameForwardLink;\r
222}\r