Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/platform/vboot_reference/cgptlib/cgptlib.c

Issue 2374001: cgpt supports dev and add/delete/modify commands. (Closed) Base URL: ssh://git@chromiumos-git/chromeos
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/platform/vboot_reference/cgptlib/cgptlib_internal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be 2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file. 3 * found in the LICENSE file.
4 */ 4 */
5 5
6 #include "cgptlib.h" 6 #include "cgptlib.h"
7 #include <string.h> 7 #include <string.h>
8 #include "cgptlib_internal.h" 8 #include "cgptlib_internal.h"
9 #include "crc32.h" 9 #include "crc32.h"
10 #include "gpt.h" 10 #include "gpt.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 if (gpt->drive_sectors < (GPT_PMBR_SECTOR + 51 if (gpt->drive_sectors < (GPT_PMBR_SECTOR +
52 GPT_HEADER_SECTOR * 2 + 52 GPT_HEADER_SECTOR * 2 +
53 GPT_ENTRIES_SECTORS * 2)) 53 GPT_ENTRIES_SECTORS * 2))
54 return GPT_ERROR_INVALID_SECTOR_NUMBER; 54 return GPT_ERROR_INVALID_SECTOR_NUMBER;
55 55
56 return GPT_SUCCESS; 56 return GPT_SUCCESS;
57 } 57 }
58 58
59 /* Expects header signature should be GPT_HEADER_SIGNATURE. */ 59 /* Expects header signature should be GPT_HEADER_SIGNATURE. */
60 uint32_t CheckHeaderSignature(GptData *gpt) { 60 uint32_t CheckHeaderSignature(GptData *gpt) {
61 uint32_t valid_headers = MASK_BOTH;
62 GptHeader *headers[] = { 61 GptHeader *headers[] = {
63 (GptHeader*)gpt->primary_header, 62 (GptHeader*)gpt->primary_header,
64 (GptHeader*)gpt->secondary_header, 63 (GptHeader*)gpt->secondary_header,
65 }; 64 };
66 int i; 65 int i;
67 66
68 for (i = PRIMARY; i <= SECONDARY; ++i) { 67 for (i = PRIMARY; i <= SECONDARY; ++i) {
69 if (Memcmp(headers[i]->signature, 68 if (Memcmp(headers[i]->signature,
70 GPT_HEADER_SIGNATURE, 69 GPT_HEADER_SIGNATURE,
71 GPT_HEADER_SIGNATURE_SIZE)) { 70 GPT_HEADER_SIGNATURE_SIZE)) {
72 INVALIDATE_HEADER(valid_headers, i); 71 INVALIDATE_HEADER(gpt->valid_headers, i);
73 } 72 }
74 } 73 }
75 return valid_headers; 74 return gpt->valid_headers;
76 } 75 }
77 76
78 /* The header revision should be GPT_HEADER_REVISION. */ 77 /* The header revision should be GPT_HEADER_REVISION. */
79 uint32_t CheckRevision(GptData *gpt) { 78 uint32_t CheckRevision(GptData *gpt) {
80 uint32_t valid_headers = MASK_BOTH;
81 GptHeader *headers[] = { 79 GptHeader *headers[] = {
82 (GptHeader*)gpt->primary_header, 80 (GptHeader*)gpt->primary_header,
83 (GptHeader*)gpt->secondary_header, 81 (GptHeader*)gpt->secondary_header,
84 }; 82 };
85 int i; 83 int i;
86 84
87 for (i = PRIMARY; i <= SECONDARY; ++i) { 85 for (i = PRIMARY; i <= SECONDARY; ++i) {
88 if (headers[i]->revision != GPT_HEADER_REVISION) 86 if (headers[i]->revision != GPT_HEADER_REVISION)
89 INVALIDATE_HEADER(valid_headers, i); 87 INVALIDATE_HEADER(gpt->valid_headers, i);
90 } 88 }
91 return valid_headers; 89 return gpt->valid_headers;
92 } 90 }
93 91
94 /* A valid header size should be between MIN_SIZE_OF_HEADER and 92 /* A valid header size should be between MIN_SIZE_OF_HEADER and
95 * MAX_SIZE_OF_HEADER. */ 93 * MAX_SIZE_OF_HEADER. */
96 uint32_t CheckSize(GptData *gpt) { 94 uint32_t CheckSize(GptData *gpt) {
97 uint32_t valid_headers = MASK_BOTH;
98 GptHeader *headers[] = { 95 GptHeader *headers[] = {
99 (GptHeader*)gpt->primary_header, 96 (GptHeader*)gpt->primary_header,
100 (GptHeader*)gpt->secondary_header, 97 (GptHeader*)gpt->secondary_header,
101 }; 98 };
102 int i; 99 int i;
103 100
104 for (i = PRIMARY; i <= SECONDARY; ++i) { 101 for (i = PRIMARY; i <= SECONDARY; ++i) {
105 if ((headers[i]->size < MIN_SIZE_OF_HEADER) || 102 if ((headers[i]->size < MIN_SIZE_OF_HEADER) ||
106 (headers[i]->size > MAX_SIZE_OF_HEADER)) 103 (headers[i]->size > MAX_SIZE_OF_HEADER))
107 INVALIDATE_HEADER(valid_headers, i); 104 INVALIDATE_HEADER(gpt->valid_headers, i);
108 } 105 }
109 return valid_headers; 106 return gpt->valid_headers;
110 } 107 }
111 108
112 /* Reserved and padding fields should be zero. */ 109 /* Reserved and padding fields should be zero. */
113 uint32_t CheckReservedFields(GptData *gpt) { 110 uint32_t CheckReservedFields(GptData *gpt) {
114 uint32_t valid_headers = MASK_BOTH;
115 GptHeader *headers[] = { 111 GptHeader *headers[] = {
116 (GptHeader*)gpt->primary_header, 112 (GptHeader*)gpt->primary_header,
117 (GptHeader*)gpt->secondary_header, 113 (GptHeader*)gpt->secondary_header,
118 }; 114 };
119 int i; 115 int i;
120 116
121 for (i = PRIMARY; i <= SECONDARY; ++i) { 117 for (i = PRIMARY; i <= SECONDARY; ++i) {
122 if (headers[i]->reserved || headers[i]->padding) 118 if (headers[i]->reserved || headers[i]->padding)
123 INVALIDATE_HEADER(valid_headers, i); 119 INVALIDATE_HEADER(gpt->valid_headers, i);
124 } 120 }
125 return valid_headers; 121 return gpt->valid_headers;
126 } 122 }
127 123
128 /* my_lba field points to the header itself. 124 /* my_lba field points to the header itself.
129 * So that the my_lba of primary header should be 1 (right after PMBR). 125 * So that the my_lba of primary header should be 1 (right after PMBR).
130 * The my_lba of secondary header should be the last secotr on drive. */ 126 * The my_lba of secondary header should be the last secotr on drive. */
131 uint32_t CheckMyLba(GptData *gpt) { 127 uint32_t CheckMyLba(GptData *gpt) {
132 uint32_t valid_headers = MASK_BOTH;
133 GptHeader *primary_header, *secondary_header; 128 GptHeader *primary_header, *secondary_header;
134 129
135 primary_header = (GptHeader*)gpt->primary_header; 130 primary_header = (GptHeader*)gpt->primary_header;
136 secondary_header = (GptHeader*)gpt->secondary_header; 131 secondary_header = (GptHeader*)gpt->secondary_header;
137 132
138 if (primary_header->my_lba != GPT_PMBR_SECTOR) /* 2nd sector on drive */ 133 if (primary_header->my_lba != GPT_PMBR_SECTOR) /* 2nd sector on drive */
139 INVALIDATE_HEADER(valid_headers, PRIMARY); 134 INVALIDATE_HEADER(gpt->valid_headers, PRIMARY);
140 if (secondary_header->my_lba != (gpt->drive_sectors - 1)) /* last sector */ 135 if (secondary_header->my_lba != (gpt->drive_sectors - 1)) /* last sector */
141 INVALIDATE_HEADER(valid_headers, SECONDARY); 136 INVALIDATE_HEADER(gpt->valid_headers, SECONDARY);
142 return valid_headers; 137 return gpt->valid_headers;
143 } 138 }
144 139
145 /* SizeOfPartitionEntry must be between MIN_SIZE_OF_ENTRY and 140 /* SizeOfPartitionEntry must be between MIN_SIZE_OF_ENTRY and
146 * MAX_SIZE_OF_ENTRY, and a multiple of SIZE_OF_ENTRY_MULTIPLE. */ 141 * MAX_SIZE_OF_ENTRY, and a multiple of SIZE_OF_ENTRY_MULTIPLE. */
147 uint32_t CheckSizeOfPartitionEntry(GptData *gpt) { 142 uint32_t CheckSizeOfPartitionEntry(GptData *gpt) {
148 uint32_t valid_headers = MASK_BOTH;
149 GptHeader *headers[] = { 143 GptHeader *headers[] = {
150 (GptHeader*)gpt->primary_header, 144 (GptHeader*)gpt->primary_header,
151 (GptHeader*)gpt->secondary_header, 145 (GptHeader*)gpt->secondary_header,
152 }; 146 };
153 int i; 147 int i;
154 148
155 for (i = PRIMARY; i <= SECONDARY; ++i) { 149 for (i = PRIMARY; i <= SECONDARY; ++i) {
156 uint32_t size_of_entry = headers[i]->size_of_entry; 150 uint32_t size_of_entry = headers[i]->size_of_entry;
157 if ((size_of_entry < MIN_SIZE_OF_ENTRY) || 151 if ((size_of_entry < MIN_SIZE_OF_ENTRY) ||
158 (size_of_entry > MAX_SIZE_OF_ENTRY) || 152 (size_of_entry > MAX_SIZE_OF_ENTRY) ||
159 (size_of_entry & (SIZE_OF_ENTRY_MULTIPLE - 1))) 153 (size_of_entry & (SIZE_OF_ENTRY_MULTIPLE - 1)))
160 INVALIDATE_HEADER(valid_headers, i); 154 INVALIDATE_HEADER(gpt->valid_headers, i);
161 } 155 }
162 return valid_headers; 156 return gpt->valid_headers;
163 } 157 }
164 158
165 /* number_of_entries must be between MIN_NUMBER_OF_ENTRIES and 159 /* number_of_entries must be between MIN_NUMBER_OF_ENTRIES and
166 * MAX_NUMBER_OF_ENTRIES, and size_of_entry * number_of_entries must be 160 * MAX_NUMBER_OF_ENTRIES, and size_of_entry * number_of_entries must be
167 * equal to TOTAL_ENTRIES_SIZE. */ 161 * equal to TOTAL_ENTRIES_SIZE. */
168 uint32_t CheckNumberOfEntries(GptData *gpt) { 162 uint32_t CheckNumberOfEntries(GptData *gpt) {
169 uint32_t valid_headers = MASK_BOTH;
170 GptHeader *headers[] = { 163 GptHeader *headers[] = {
171 (GptHeader*)gpt->primary_header, 164 (GptHeader*)gpt->primary_header,
172 (GptHeader*)gpt->secondary_header, 165 (GptHeader*)gpt->secondary_header,
173 }; 166 };
174 int i; 167 int i;
175 168
176 for (i = PRIMARY; i <= SECONDARY; ++i) { 169 for (i = PRIMARY; i <= SECONDARY; ++i) {
177 uint32_t number_of_entries = headers[i]->number_of_entries; 170 uint32_t number_of_entries = headers[i]->number_of_entries;
178 if ((number_of_entries < MIN_NUMBER_OF_ENTRIES) || 171 if ((number_of_entries < MIN_NUMBER_OF_ENTRIES) ||
179 (number_of_entries > MAX_NUMBER_OF_ENTRIES) || 172 (number_of_entries > MAX_NUMBER_OF_ENTRIES) ||
180 (number_of_entries * headers[i]->size_of_entry != TOTAL_ENTRIES_SIZE)) 173 (number_of_entries * headers[i]->size_of_entry != TOTAL_ENTRIES_SIZE))
181 INVALIDATE_HEADER(valid_headers, i); 174 INVALIDATE_HEADER(gpt->valid_headers, i);
182 } 175 }
183 return valid_headers; 176 return gpt->valid_headers;
184 } 177 }
185 178
186 /* Make sure entries_lba is correct. 179 /* Make sure entries_lba is correct.
187 * 2 for primary entries 180 * 2 for primary entries
188 * drive_sectors-1-GPT_ENTRIES_SECTORS for secondary entries. */ 181 * drive_sectors-1-GPT_ENTRIES_SECTORS for secondary entries. */
189 uint32_t CheckEntriesLba(GptData *gpt) { 182 uint32_t CheckEntriesLba(GptData *gpt) {
190 uint32_t valid_headers = MASK_BOTH;
191 GptHeader *primary_header, *secondary_header; 183 GptHeader *primary_header, *secondary_header;
192 184
193 primary_header = (GptHeader*)gpt->primary_header; 185 primary_header = (GptHeader*)gpt->primary_header;
194 secondary_header = (GptHeader*)gpt->secondary_header; 186 secondary_header = (GptHeader*)gpt->secondary_header;
195 187
196 /* We assume the primary partition entry table is located at the sector 188 /* We assume the primary partition entry table is located at the sector
197 * right after primary partition header. */ 189 * right after primary partition header. */
198 if (primary_header->entries_lba != (GPT_PMBR_SECTOR + GPT_HEADER_SECTOR)) 190 if (primary_header->entries_lba != (GPT_PMBR_SECTOR + GPT_HEADER_SECTOR))
199 INVALIDATE_HEADER(valid_headers, PRIMARY); 191 INVALIDATE_HEADER(gpt->valid_headers, PRIMARY);
200 /* We assume the secondary partition entry table is the 32 sectors 192 /* We assume the secondary partition entry table is the 32 sectors
201 * right before the secondary partition header. */ 193 * right before the secondary partition header. */
202 if (secondary_header->entries_lba != 194 if (secondary_header->entries_lba !=
203 (gpt->drive_sectors - 1 - GPT_ENTRIES_SECTORS)) 195 (gpt->drive_sectors - 1 - GPT_ENTRIES_SECTORS))
204 INVALIDATE_HEADER(valid_headers, SECONDARY); 196 INVALIDATE_HEADER(gpt->valid_headers, SECONDARY);
205 return valid_headers; 197 return gpt->valid_headers;
206 } 198 }
207 199
208 /* FirstUsableLBA must be after the end of the primary GPT table array. 200 /* FirstUsableLBA must be after the end of the primary GPT table array.
209 * LastUsableLBA must be before the start of the secondary GPT table array. 201 * LastUsableLBA must be before the start of the secondary GPT table array.
210 * FirstUsableLBA <= LastUsableLBA. */ 202 * FirstUsableLBA <= LastUsableLBA. */
211 uint32_t CheckValidUsableLbas(GptData *gpt) { 203 uint32_t CheckValidUsableLbas(GptData *gpt) {
212 uint32_t valid_headers = MASK_BOTH;
213 uint64_t end_of_primary_entries; 204 uint64_t end_of_primary_entries;
214 uint64_t start_of_secondary_entries; 205 uint64_t start_of_secondary_entries;
215 GptHeader *headers[] = { 206 GptHeader *headers[] = {
216 (GptHeader*)gpt->primary_header, 207 (GptHeader*)gpt->primary_header,
217 (GptHeader*)gpt->secondary_header, 208 (GptHeader*)gpt->secondary_header,
218 }; 209 };
219 int i; 210 int i;
220 211
221 end_of_primary_entries = GPT_PMBR_SECTOR + GPT_HEADER_SECTOR + 212 end_of_primary_entries = GPT_PMBR_SECTOR + GPT_HEADER_SECTOR +
222 GPT_ENTRIES_SECTORS; 213 GPT_ENTRIES_SECTORS;
223 start_of_secondary_entries = (gpt->drive_sectors - 1 - GPT_ENTRIES_SECTORS); 214 start_of_secondary_entries = (gpt->drive_sectors - 1 - GPT_ENTRIES_SECTORS);
224 215
225 for (i = PRIMARY; i <= SECONDARY; ++i) { 216 for (i = PRIMARY; i <= SECONDARY; ++i) {
226 if (headers[i]->first_usable_lba < end_of_primary_entries) 217 if (headers[i]->first_usable_lba < end_of_primary_entries)
227 INVALIDATE_HEADER(valid_headers, i); 218 INVALIDATE_HEADER(gpt->valid_headers, i);
228 if (headers[i]->last_usable_lba >= start_of_secondary_entries) 219 if (headers[i]->last_usable_lba >= start_of_secondary_entries)
229 INVALIDATE_HEADER(valid_headers, i); 220 INVALIDATE_HEADER(gpt->valid_headers, i);
230 if (headers[i]->first_usable_lba > headers[i]->last_usable_lba) 221 if (headers[i]->first_usable_lba > headers[i]->last_usable_lba)
231 INVALIDATE_HEADER(valid_headers, i); 222 INVALIDATE_HEADER(gpt->valid_headers, i);
232 } 223 }
233 224
234 if (headers[PRIMARY]->first_usable_lba - headers[PRIMARY]->entries_lba < 225 if (headers[PRIMARY]->first_usable_lba - headers[PRIMARY]->entries_lba <
235 GPT_ENTRIES_SECTORS) 226 GPT_ENTRIES_SECTORS)
236 INVALIDATE_HEADER(valid_headers, PRIMARY); 227 INVALIDATE_HEADER(gpt->valid_headers, PRIMARY);
237 if (headers[SECONDARY]->last_usable_lba >= headers[SECONDARY]->entries_lba) 228 if (headers[SECONDARY]->last_usable_lba >= headers[SECONDARY]->entries_lba)
238 INVALIDATE_HEADER(valid_headers, SECONDARY); 229 INVALIDATE_HEADER(gpt->valid_headers, SECONDARY);
239 230
240 return valid_headers; 231 return gpt->valid_headers;
241 } 232 }
242 233
243 /* Checks header CRC */ 234 /* Checks header CRC */
244 uint32_t CheckHeaderCrc(GptData *gpt) { 235 uint32_t CheckHeaderCrc(GptData *gpt) {
245 uint32_t crc32, original_crc32; 236 uint32_t crc32, original_crc32;
246 GptHeader *headers[] = { 237 GptHeader *headers[] = {
247 (GptHeader*)gpt->primary_header, 238 (GptHeader*)gpt->primary_header,
248 (GptHeader*)gpt->secondary_header, 239 (GptHeader*)gpt->secondary_header,
249 }; 240 };
250 int i; 241 int i;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 273
283 for (i = PRIMARY; i <= SECONDARY; ++i) { 274 for (i = PRIMARY; i <= SECONDARY; ++i) {
284 crc32 = Crc32((const uint8_t *)entries[i], TOTAL_ENTRIES_SIZE); 275 crc32 = Crc32((const uint8_t *)entries[i], TOTAL_ENTRIES_SIZE);
285 if (crc32 != entries_crc32) 276 if (crc32 != entries_crc32)
286 INVALIDATE_ENTRIES(gpt->valid_entries, i); 277 INVALIDATE_ENTRIES(gpt->valid_entries, i);
287 } 278 }
288 return gpt->valid_entries; 279 return gpt->valid_entries;
289 } 280 }
290 281
291 /* Returns non-zero if the given GUID is non-zero. */ 282 /* Returns non-zero if the given GUID is non-zero. */
292 static int NonZeroGuid(const Guid *guid) { 283 int NonZeroGuid(const Guid *guid) {
293 static Guid zero = {{{0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0}}}}; 284 static Guid zero = {{{0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0}}}};
294 return Memcmp(&zero, guid, sizeof(zero)); 285 return Memcmp(&zero, guid, sizeof(zero));
295 } 286 }
296 287
297 /* Checks if entries geometry is valid. 288 /* Checks if entries geometry is valid.
298 * All active (non-zero PartitionTypeGUID) partition entries should have: 289 * All active (non-zero PartitionTypeGUID) partition entries should have:
299 * entry.StartingLBA >= header.FirstUsableLBA 290 * entry.StartingLBA >= header.FirstUsableLBA
300 * entry.EndingLBA <= header.LastUsableLBA 291 * entry.EndingLBA <= header.LastUsableLBA
301 * entry.StartingLBA <= entry.EndingLBA 292 * entry.StartingLBA <= entry.EndingLBA
302 */ 293 */
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 (pairs[i].starting <= pairs[i-1].ending)) 360 (pairs[i].starting <= pairs[i-1].ending))
370 return 1; 361 return 1;
371 } 362 }
372 363
373 return 0; 364 return 0;
374 } 365 }
375 366
376 /* Checks if any two partitions are overlapped in primary and secondary entries. 367 /* Checks if any two partitions are overlapped in primary and secondary entries.
377 */ 368 */
378 uint32_t CheckOverlappedPartition(GptData *gpt) { 369 uint32_t CheckOverlappedPartition(GptData *gpt) {
379 uint32_t valid_entries = MASK_BOTH;
380 GptHeader *headers[] = { 370 GptHeader *headers[] = {
381 (GptHeader*)gpt->primary_header, 371 (GptHeader*)gpt->primary_header,
382 (GptHeader*)gpt->secondary_header, 372 (GptHeader*)gpt->secondary_header,
383 }; 373 };
384 GptEntry *entries[] = { 374 GptEntry *entries[] = {
385 (GptEntry*)gpt->primary_entries, 375 (GptEntry*)gpt->primary_entries,
386 (GptEntry*)gpt->secondary_entries, 376 (GptEntry*)gpt->secondary_entries,
387 }; 377 };
388 int i; 378 int i;
389 uint32_t number_of_entries; 379 uint32_t number_of_entries;
390 380
391 if (gpt->valid_headers & MASK_PRIMARY) 381 if (gpt->valid_headers & MASK_PRIMARY)
392 number_of_entries = headers[PRIMARY]->number_of_entries; 382 number_of_entries = headers[PRIMARY]->number_of_entries;
393 else 383 else
394 number_of_entries = headers[SECONDARY]->number_of_entries; 384 number_of_entries = headers[SECONDARY]->number_of_entries;
395 385
396 for (i = PRIMARY; i <= SECONDARY; ++i) { 386 for (i = PRIMARY; i <= SECONDARY; ++i) {
397 if (OverlappedEntries(entries[i], number_of_entries)) 387 if (OverlappedEntries(entries[i], number_of_entries))
398 INVALIDATE_ENTRIES(valid_entries, i); 388 INVALIDATE_ENTRIES(gpt->valid_entries, i);
399 } 389 }
400 return valid_entries; 390 return gpt->valid_entries;
401 } 391 }
402 392
403 /* Primary entries and secondary entries should be bitwise identical. 393 /* Primary entries and secondary entries should be bitwise identical.
404 * If two entries tables are valid, compare them. If not the same, 394 * If two entries tables are valid, compare them. If not the same,
405 * overwrites secondary with primary (primary always has higher priority), 395 * overwrites secondary with primary (primary always has higher priority),
406 * and marks secondary as modified. 396 * and marks secondary as modified.
407 * If only one is valid, overwrites invalid one. 397 * If only one is valid, overwrites invalid one.
408 * If all are invalid, does nothing. 398 * If all are invalid, does nothing.
409 * This function returns bit masks for GptData.modified field. 399 * This function returns bit masks for GptData.modified field.
410 * Note that CRC is NOT re-computed in this function. 400 * Note that CRC is NOT re-computed in this function.
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 RepairEntries(gpt, MASK_PRIMARY); 800 RepairEntries(gpt, MASK_PRIMARY);
811 /* Actually two entries are dirty now. 801 /* Actually two entries are dirty now.
812 * Also two headers are dirty because entries_crc32 has been updated. */ 802 * Also two headers are dirty because entries_crc32 has been updated. */
813 gpt->modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 | 803 gpt->modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
814 GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2); 804 GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
815 UpdateCrc(gpt); 805 UpdateCrc(gpt);
816 } 806 }
817 807
818 return GPT_SUCCESS; 808 return GPT_SUCCESS;
819 } 809 }
OLDNEW
« no previous file with comments | « no previous file | src/platform/vboot_reference/cgptlib/cgptlib_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698