]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/Comp.c
ShellPkg: Add checks for NULL pointers.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Comp.c
1 /** @file
2 Main file for Comp shell Debug1 function.
3
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "UefiShellDebug1CommandsLib.h"
16
17 /**
18 Function for 'comp' command.
19
20 @param[in] ImageHandle Handle to the Image (NULL if Internal).
21 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
22 **/
23 SHELL_STATUS
24 EFIAPI
25 ShellCommandRunComp (
26 IN EFI_HANDLE ImageHandle,
27 IN EFI_SYSTEM_TABLE *SystemTable
28 )
29 {
30 EFI_STATUS Status;
31 LIST_ENTRY *Package;
32 CHAR16 *ProblemParam;
33 SHELL_STATUS ShellStatus;
34 UINTN LoopVar;
35 SHELL_FILE_HANDLE FileHandle1;
36 SHELL_FILE_HANDLE FileHandle2;
37 UINT8 ErrorCount;
38 UINT64 Size1;
39 UINT64 Size2;
40 UINT8 DataFromFile1;
41 UINT8 DataFromFile2;
42 UINT8 ADF_File11;
43 UINT8 ADF_File12;
44 UINT8 ADF_File13;
45 UINT8 ADF_File21;
46 UINT8 ADF_File22;
47 UINT8 ADF_File23;
48 UINTN DataSizeFromFile1;
49 UINTN DataSizeFromFile2;
50 CHAR16 *FileName1;
51 CHAR16 *FileName2;
52 CONST CHAR16 *TempParam;
53
54 ErrorCount = 0;
55 ShellStatus = SHELL_SUCCESS;
56 Status = EFI_SUCCESS;
57 FileName1 = NULL;
58 FileName2 = NULL;
59 FileHandle1 = NULL;
60 FileHandle2 = NULL;
61 Size1 = 0;
62
63 //
64 // initialize the shell lib (we must be in non-auto-init...)
65 //
66 Status = ShellInitialize();
67 ASSERT_EFI_ERROR(Status);
68
69 Status = CommandInit();
70 ASSERT_EFI_ERROR(Status);
71
72 //
73 // parse the command line
74 //
75 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
76 if (EFI_ERROR(Status)) {
77 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
78 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
79 FreePool(ProblemParam);
80 ShellStatus = SHELL_INVALID_PARAMETER;
81 } else {
82 ASSERT(FALSE);
83 }
84 } else {
85 if (ShellCommandLineGetCount(Package) > 3) {
86 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
87 ShellStatus = SHELL_INVALID_PARAMETER;
88 } else if (ShellCommandLineGetCount(Package) < 3) {
89 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
90 ShellStatus = SHELL_INVALID_PARAMETER;
91 } else {
92 TempParam = ShellCommandLineGetRawValue(Package, 1);
93 ASSERT(TempParam != NULL);
94 FileName1 = ShellFindFilePath(TempParam);
95 if (FileName1 == NULL) {
96 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, TempParam);
97 ShellStatus = SHELL_NOT_FOUND;
98 } else {
99 Status = ShellOpenFileByName(FileName1, &FileHandle1, EFI_FILE_MODE_READ, 0);
100 if (EFI_ERROR(Status)) {
101 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, TempParam, Status);
102 ShellStatus = SHELL_NOT_FOUND;
103 }
104 }
105 TempParam = ShellCommandLineGetRawValue(Package, 2);
106 ASSERT(TempParam != NULL);
107 FileName2 = ShellFindFilePath(TempParam);
108 if (FileName2 == NULL) {
109 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_FIND_FAIL), gShellDebug1HiiHandle, TempParam);
110 ShellStatus = SHELL_NOT_FOUND;
111 } else {
112 Status = ShellOpenFileByName(FileName2, &FileHandle2, EFI_FILE_MODE_READ, 0);
113 if (EFI_ERROR(Status)) {
114 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_FILE_OPEN_FAIL), gShellDebug1HiiHandle, TempParam, Status);
115 ShellStatus = SHELL_NOT_FOUND;
116 }
117 }
118 if (ShellStatus == SHELL_SUCCESS) {
119 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_HEADER), gShellDebug1HiiHandle, FileName1, FileName2);
120 Status = gEfiShellProtocol->GetFileSize(FileHandle1, &Size1);
121 ASSERT_EFI_ERROR(Status);
122 Status = gEfiShellProtocol->GetFileSize(FileHandle2, &Size2);
123 ASSERT_EFI_ERROR(Status);
124 if (Size1 != Size2) {
125 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_SIZE_FAIL), gShellDebug1HiiHandle);
126 ErrorCount++;
127 ShellStatus = SHELL_NOT_EQUAL;
128 }
129 }
130 if (ShellStatus == SHELL_SUCCESS) {
131 for (LoopVar = 0 ; LoopVar < Size1 && ErrorCount <= 10 ; LoopVar++) {
132 DataSizeFromFile1 = 1;
133 DataSizeFromFile2 = 1;
134 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &DataFromFile1);
135 ASSERT_EFI_ERROR(Status);
136 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &DataFromFile2);
137 ASSERT_EFI_ERROR(Status);
138 if (DataFromFile1 != DataFromFile2) {
139 ADF_File11 = 0;
140 ADF_File12 = 0;
141 ADF_File13 = 0;
142 ADF_File21 = 0;
143 ADF_File22 = 0;
144 ADF_File23 = 0;
145 if (LoopVar + 1 < Size1) {
146 LoopVar++;
147 DataSizeFromFile1 = 1;
148 DataSizeFromFile2 = 1;
149 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &ADF_File11);
150 ASSERT_EFI_ERROR(Status);
151 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &ADF_File21);
152 ASSERT_EFI_ERROR(Status);
153 if (LoopVar + 1 < Size1) {
154 LoopVar++;
155 DataSizeFromFile1 = 1;
156 DataSizeFromFile2 = 1;
157 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &ADF_File12);
158 ASSERT_EFI_ERROR(Status);
159 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &ADF_File22);
160 ASSERT_EFI_ERROR(Status);
161 if (LoopVar + 1 < Size1) {
162 LoopVar++;
163 DataSizeFromFile1 = 1;
164 DataSizeFromFile2 = 1;
165 Status = gEfiShellProtocol->ReadFile(FileHandle1, &DataSizeFromFile1, &ADF_File13);
166 ASSERT_EFI_ERROR(Status);
167 Status = gEfiShellProtocol->ReadFile(FileHandle2, &DataSizeFromFile2, &ADF_File23);
168 ASSERT_EFI_ERROR(Status);
169 }
170 }
171 }
172 if (ADF_File13 != ADF_File23) {
173 ShellPrintHiiEx(
174 -1,
175 -1,
176 NULL,
177 STRING_TOKEN (STR_COMP_SPOT_FAIL4),
178 gShellDebug1HiiHandle,
179 ++ErrorCount,
180 FileName1,
181 LoopVar,
182 DataFromFile1, ADF_File11, ADF_File12, ADF_File13,
183 DataFromFile1, ADF_File11, ADF_File12, ADF_File13,
184 FileName2,
185 LoopVar,
186 DataFromFile2, ADF_File21, ADF_File22, ADF_File23,
187 DataFromFile2, ADF_File21, ADF_File22, ADF_File23
188 );
189 } else if (ADF_File12 != ADF_File22) {
190 ShellPrintHiiEx(
191 -1,
192 -1,
193 NULL,
194 STRING_TOKEN (STR_COMP_SPOT_FAIL3),
195 gShellDebug1HiiHandle,
196 ++ErrorCount,
197 FileName1,
198 LoopVar,
199 DataFromFile1, ADF_File11, ADF_File12,
200 DataFromFile1, ADF_File11, ADF_File12,
201 FileName2,
202 LoopVar,
203 DataFromFile2, ADF_File21, ADF_File22,
204 DataFromFile2, ADF_File21, ADF_File22
205 );
206 } else if (ADF_File11 != ADF_File21) {
207 ShellPrintHiiEx(
208 -1,
209 -1,
210 NULL,
211 STRING_TOKEN (STR_COMP_SPOT_FAIL2),
212 gShellDebug1HiiHandle,
213 ++ErrorCount,
214 FileName1,
215 LoopVar,
216 DataFromFile1, ADF_File11,
217 DataFromFile1, ADF_File11,
218 FileName2,
219 LoopVar,
220 DataFromFile2, ADF_File21,
221 DataFromFile2, ADF_File21
222 );
223 } else {
224 ShellPrintHiiEx(
225 -1,
226 -1,
227 NULL,
228 STRING_TOKEN (STR_COMP_SPOT_FAIL1),
229 gShellDebug1HiiHandle,
230 ++ErrorCount,
231 FileName1,
232 LoopVar,
233 DataFromFile1,
234 DataFromFile1,
235 FileName2,
236 LoopVar,
237 DataFromFile2,
238 DataFromFile2
239 );
240 }
241 ShellStatus = SHELL_NOT_EQUAL;
242 }
243 }
244 if (ErrorCount == 0) {
245 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_FOOTER_PASS), gShellDebug1HiiHandle);
246 } else {
247 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_COMP_FOOTER_FAIL), gShellDebug1HiiHandle);
248 }
249 }
250 }
251
252 ShellCommandLineFreeVarList (Package);
253 }
254 SHELL_FREE_NON_NULL(FileName1);
255 SHELL_FREE_NON_NULL(FileName2);
256
257 if (FileHandle1 != NULL) {
258 gEfiShellProtocol->CloseFile(FileHandle1);
259 }
260 if (FileHandle2 != NULL) {
261 gEfiShellProtocol->CloseFile(FileHandle2);
262 }
263
264 return (ShellStatus);
265 }