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

Side by Side Diff: cgpt/cmd_show.c

Issue 3594010: Address some security concerns in the cgpt tool. (Closed) Base URL: http://git.chromium.org/git/vboot_reference.git
Patch Set: A little more cleanup. Take one more look, please. Created 10 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « cgpt/cmd_find.c ('k') | utility/vbutil_keyblock.c » ('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 #include "cgpt.h" 5 #include "cgpt.h"
6 6
7 #define __STDC_FORMAT_MACROS 7 #define __STDC_FORMAT_MACROS
8 #include <getopt.h> 8 #include <getopt.h>
9 #include <inttypes.h> 9 #include <inttypes.h>
10 #include <stdio.h> 10 #include <stdio.h>
11 #include <stdlib.h> 11 #include <stdlib.h>
12 #include <string.h> 12 #include <string.h>
13 13
14 #include "cgptlib_internal.h" 14 #include "cgptlib_internal.h"
15 15
16 static void Usage(void) 16 static void Usage(void)
17 { 17 {
18 printf("\nUsage: %s show [OPTIONS] DRIVE\n\n" 18 printf("\nUsage: %s show [OPTIONS] DRIVE\n\n"
19 "Display the GPT table\n\n" 19 "Display the GPT table\n\n"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 #define GPT_FMT "%10d%10d%8s %s\n" 73 #define GPT_FMT "%10d%10d%8s %s\n"
74 #define GPT_MORE "%10s%10s%8s ", "", "", "" 74 #define GPT_MORE "%10s%10s%8s ", "", "", ""
75 #define PARTITION_FMT "%10d%10d%8d %s\n" 75 #define PARTITION_FMT "%10d%10d%8d %s\n"
76 #define PARTITION_MORE "%10s%10s%8s %s%s\n", "", "", "" 76 #define PARTITION_MORE "%10s%10s%8s %s%s\n", "", "", ""
77 77
78 static void HeaderDetails(GptHeader *header, const char *indent, int raw) { 78 static void HeaderDetails(GptHeader *header, const char *indent, int raw) {
79 int i; 79 int i;
80 80
81 printf("%sSig: ", indent); 81 printf("%sSig: ", indent);
82 if (!raw) { 82 if (!raw) {
83 printf("["); 83 printf("[");
84 for (i = 0; i < sizeof(header->signature); ++i) 84 for (i = 0; i < sizeof(header->signature); ++i)
85 printf("%c", header->signature[i]); 85 printf("%c", header->signature[i]);
86 printf("]"); 86 printf("]");
87 } else { 87 } else {
88 char buf[BUFFER_SIZE(sizeof(header->signature))]; 88 char buf[BUFFER_SIZE(sizeof(header->signature))];
89 RawDump((uint8_t *)header->signature, sizeof(header->signature), buf, 1); 89 RawDump((uint8_t *)header->signature, sizeof(header->signature), buf, 1);
90 printf("%s", buf); 90 printf("%s", buf);
91 } 91 }
92 printf("\n"); 92 printf("\n");
93 93
94 printf("%sRev: 0x%08x\n", indent, header->revision); 94 printf("%sRev: 0x%08x\n", indent, header->revision);
95 printf("%sSize: %d\n", indent, header->size); 95 printf("%sSize: %d\n", indent, header->size);
96 printf("%sHeader CRC: 0x%08x\n", indent, header->header_crc32); 96 printf("%sHeader CRC: 0x%08x\n", indent, header->header_crc32);
97 printf("%sMy LBA: %lld\n", indent, (long long)header->my_lba); 97 printf("%sMy LBA: %lld\n", indent, (long long)header->my_lba);
98 printf("%sAlternate LBA: %lld\n", indent, (long long)header->alternate_lba); 98 printf("%sAlternate LBA: %lld\n", indent, (long long)header->alternate_lba);
99 printf("%sFirst LBA: %lld\n", indent, (long long)header->first_usable_lba); 99 printf("%sFirst LBA: %lld\n", indent, (long long)header->first_usable_lba);
100 printf("%sLast LBA: %lld\n", indent, (long long)header->last_usable_lba); 100 printf("%sLast LBA: %lld\n", indent, (long long)header->last_usable_lba);
101 101
102 { /* For disk guid */ 102 { /* For disk guid */
103 char buf[GUID_STRLEN]; 103 char buf[GUID_STRLEN];
104 GuidToStr(&header->disk_uuid, buf); 104 GuidToStr(&header->disk_uuid, buf, GUID_STRLEN);
105 printf("%sDisk UUID: %s\n", indent, buf); 105 printf("%sDisk UUID: %s\n", indent, buf);
106 } 106 }
107 107
108 printf("%sEntries LBA: %lld\n", indent, (long long)header->entries_lba); 108 printf("%sEntries LBA: %lld\n", indent, (long long)header->entries_lba);
109 printf("%sNumber of entries: %d\n", indent, header->number_of_entries); 109 printf("%sNumber of entries: %d\n", indent, header->number_of_entries);
110 printf("%sSize of entry: %d\n", indent, header->size_of_entry); 110 printf("%sSize of entry: %d\n", indent, header->size_of_entry);
111 printf("%sEntries CRC: 0x%08x\n", indent, header->entries_crc32); 111 printf("%sEntries CRC: 0x%08x\n", indent, header->entries_crc32);
112 } 112 }
113 113
114 void EntryDetails(GptEntry *entry, int index, int raw) { 114 void EntryDetails(GptEntry *entry, uint32_t index, int raw) {
115 char contents[256]; 115 char contents[256]; // scratch buffer for formatting output
116 uint8_t label[sizeof(entry->name) * 3 / 2]; 116 uint8_t label[GPT_PARTNAME_LEN];
117 117
118 if (!raw) { 118 if (!raw) {
119 char type[GUID_STRLEN], unique[GUID_STRLEN];; 119 char type[GUID_STRLEN], unique[GUID_STRLEN];
120 120
121 UTF16ToUTF8(entry->name, label); 121 UTF16ToUTF8(entry->name, sizeof(entry->name) / sizeof(entry->name[0]),
122 snprintf(contents, sizeof(contents), "Label: \"%s\"", label); 122 label, sizeof(label));
123 require(snprintf(contents, sizeof(contents),
124 "Label: \"%s\"", label) < sizeof(contents));
123 printf(PARTITION_FMT, (int)entry->starting_lba, 125 printf(PARTITION_FMT, (int)entry->starting_lba,
124 (int)(entry->ending_lba - entry->starting_lba + 1), 126 (int)(entry->ending_lba - entry->starting_lba + 1),
125 index+1, contents); 127 index+1, contents);
126 if (CGPT_OK == ResolveType(&entry->type, type)) { 128 if (CGPT_OK == ResolveType(&entry->type, type)) {
127 printf(PARTITION_MORE, "Type: ", type); 129 printf(PARTITION_MORE, "Type: ", type);
128 } else { 130 } else {
129 GuidToStr(&entry->type, type); 131 GuidToStr(&entry->type, type, GUID_STRLEN);
130 printf(PARTITION_MORE, "Type: ", type); 132 printf(PARTITION_MORE, "Type: ", type);
131 } 133 }
132 GuidToStr(&entry->unique, unique); 134 GuidToStr(&entry->unique, unique, GUID_STRLEN);
133 printf(PARTITION_MORE, "UUID: ", unique); 135 printf(PARTITION_MORE, "UUID: ", unique);
134 if (!memcmp(&guid_chromeos_kernel, &entry->type, sizeof(Guid))) { 136 if (!memcmp(&guid_chromeos_kernel, &entry->type, sizeof(Guid))) {
135 int tries = (entry->attrs.fields.gpt_att & 137 int tries = (entry->attrs.fields.gpt_att &
136 CGPT_ATTRIBUTE_TRIES_MASK) >> 138 CGPT_ATTRIBUTE_TRIES_MASK) >>
137 CGPT_ATTRIBUTE_TRIES_OFFSET; 139 CGPT_ATTRIBUTE_TRIES_OFFSET;
138 int successful = (entry->attrs.fields.gpt_att & 140 int successful = (entry->attrs.fields.gpt_att &
139 CGPT_ATTRIBUTE_SUCCESSFUL_MASK) >> 141 CGPT_ATTRIBUTE_SUCCESSFUL_MASK) >>
140 CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET; 142 CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET;
141 int priority = (entry->attrs.fields.gpt_att & 143 int priority = (entry->attrs.fields.gpt_att &
142 CGPT_ATTRIBUTE_PRIORITY_MASK) >> 144 CGPT_ATTRIBUTE_PRIORITY_MASK) >>
143 CGPT_ATTRIBUTE_PRIORITY_OFFSET; 145 CGPT_ATTRIBUTE_PRIORITY_OFFSET;
144 snprintf(contents, sizeof(contents), 146 require(snprintf(contents, sizeof(contents),
145 "priority=%d tries=%d successful=%d", 147 "priority=%d tries=%d successful=%d",
146 priority, tries, successful); 148 priority, tries, successful) < sizeof(contents));
147 printf(PARTITION_MORE, "Attr: ", contents); 149 printf(PARTITION_MORE, "Attr: ", contents);
148 } 150 }
149 } else { 151 } else {
150 char type[GUID_STRLEN], unique[GUID_STRLEN]; 152 char type[GUID_STRLEN], unique[GUID_STRLEN];
151 153
152 UTF16ToUTF8(entry->name, label); 154 UTF16ToUTF8(entry->name, sizeof(entry->name) / sizeof(entry->name[0]),
153 snprintf(contents, sizeof(contents), "Label: \"%s\"", label); 155 label, sizeof(label));
156 require(snprintf(contents, sizeof(contents),
157 "Label: \"%s\"", label) < sizeof(contents));
154 printf(PARTITION_FMT, (int)entry->starting_lba, 158 printf(PARTITION_FMT, (int)entry->starting_lba,
155 (int)(entry->ending_lba - entry->starting_lba + 1), 159 (int)(entry->ending_lba - entry->starting_lba + 1),
156 index+1, contents); 160 index+1, contents);
157 GuidToStr(&entry->type, type); 161 GuidToStr(&entry->type, type, GUID_STRLEN);
158 printf(PARTITION_MORE, "Type: ", type); 162 printf(PARTITION_MORE, "Type: ", type);
159 GuidToStr(&entry->unique, unique); 163 GuidToStr(&entry->unique, unique, GUID_STRLEN);
160 printf(PARTITION_MORE, "UUID: ", unique); 164 printf(PARTITION_MORE, "UUID: ", unique);
161 snprintf(contents, sizeof(contents), "[%x]", entry->attrs.fields.gpt_att); 165 require(snprintf(contents, sizeof(contents),
166 "[%x]", entry->attrs.fields.gpt_att) < sizeof(contents));
162 printf(PARTITION_MORE, "Attr: ", contents); 167 printf(PARTITION_MORE, "Attr: ", contents);
163 } 168 }
164 } 169 }
165 170
166 171
167 void EntriesDetails(GptData *gpt, const int secondary, int raw) { 172 void EntriesDetails(GptData *gpt, const int secondary, int raw) {
168 int i; 173 uint32_t i;
169 174
170 for (i = 0; i < GetNumberOfEntries(gpt); ++i) { 175 for (i = 0; i < GetNumberOfEntries(gpt); ++i) {
171 GptEntry *entry; 176 GptEntry *entry;
172 entry = GetEntry(gpt, secondary, i); 177 entry = GetEntry(gpt, secondary, i);
173 178
174 if (!memcmp(&guid_unused, &entry->type, sizeof(Guid))) continue; 179 if (!memcmp(&guid_unused, &entry->type, sizeof(Guid))) continue;
175 180
176 EntryDetails(entry, i, raw); 181 EntryDetails(entry, i, raw);
177 } 182 }
178 } 183 }
179 184
180 int cmd_show(int argc, char *argv[]) { 185 int cmd_show(int argc, char *argv[]) {
181 struct drive drive; 186 struct drive drive;
182 int numeric = 0; 187 int numeric = 0;
183 int verbose = 0; 188 int verbose = 0;
184 int quick = 0; 189 int quick = 0;
185 int partition = 0; 190 uint32_t partition = 0;
186 int single_item = 0; 191 int single_item = 0;
187 int gpt_retval; 192 int gpt_retval;
188 193
189 int c; 194 int c;
190 int errorcnt = 0; 195 int errorcnt = 0;
191 char *e = 0; 196 char *e = 0;
192 197
193 opterr = 0; // quiet, you 198 opterr = 0; // quiet, you
194 while ((c=getopt(argc, argv, ":hnvqi:bstulSTPA")) != -1) 199 while ((c=getopt(argc, argv, ":hnvqi:bstulSTPA")) != -1)
195 { 200 {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 return CGPT_FAILED; 266 return CGPT_FAILED;
262 } 267 }
263 268
264 if (partition) { // show single partition 269 if (partition) { // show single partition
265 270
266 if (partition > GetNumberOfEntries(&drive.gpt)) { 271 if (partition > GetNumberOfEntries(&drive.gpt)) {
267 Error("invalid partition number: %d\n", partition); 272 Error("invalid partition number: %d\n", partition);
268 return CGPT_FAILED; 273 return CGPT_FAILED;
269 } 274 }
270 275
271 int index = partition - 1; 276 uint32_t index = partition - 1;
272 GptEntry *entry = GetEntry(&drive.gpt, PRIMARY, index); 277 GptEntry *entry = GetEntry(&drive.gpt, PRIMARY, index);
273 char buf[256]; 278 char buf[256]; // scratch buffer for string conversion
274 279
275 if (single_item) { 280 if (single_item) {
276 switch(single_item) { 281 switch(single_item) {
277 case 'b': 282 case 'b':
278 printf("%" PRId64 "\n", entry->starting_lba); 283 printf("%" PRId64 "\n", entry->starting_lba);
279 break; 284 break;
280 case 's': 285 case 's':
281 printf("%" PRId64 "\n", entry->ending_lba - entry->starting_lba + 1); 286 printf("%" PRId64 "\n", entry->ending_lba - entry->starting_lba + 1);
282 break; 287 break;
283 case 't': 288 case 't':
284 GuidToStr(&entry->type, buf); 289 GuidToStr(&entry->type, buf, sizeof(buf));
285 printf("%s\n", buf); 290 printf("%s\n", buf);
286 break; 291 break;
287 case 'u': 292 case 'u':
288 GuidToStr(&entry->unique, buf); 293 GuidToStr(&entry->unique, buf, sizeof(buf));
289 printf("%s\n", buf); 294 printf("%s\n", buf);
290 break; 295 break;
291 case 'l': 296 case 'l':
292 UTF16ToUTF8(entry->name, (uint8_t *)buf); 297 UTF16ToUTF8(entry->name, sizeof(entry->name) / sizeof(entry->name[0]),
298 (uint8_t *)buf, sizeof(buf));
293 printf("%s\n", buf); 299 printf("%s\n", buf);
294 break; 300 break;
295 case 'S': 301 case 'S':
296 printf("%d\n", GetSuccessful(&drive.gpt, PRIMARY, index)); 302 printf("%d\n", GetSuccessful(&drive.gpt, PRIMARY, index));
297 break; 303 break;
298 case 'T': 304 case 'T':
299 printf("%d\n", GetTries(&drive.gpt, PRIMARY, index)); 305 printf("%d\n", GetTries(&drive.gpt, PRIMARY, index));
300 break; 306 break;
301 case 'P': 307 case 'P':
302 printf("%d\n", GetPriority(&drive.gpt, PRIMARY, index)); 308 printf("%d\n", GetPriority(&drive.gpt, PRIMARY, index));
303 break; 309 break;
304 case 'A': 310 case 'A':
305 printf("0x%x\n", entry->attrs.fields.gpt_att); 311 printf("0x%x\n", entry->attrs.fields.gpt_att);
306 break; 312 break;
307 } 313 }
308 } else { 314 } else {
309 printf(TITLE_FMT, "start", "size", "part", "contents"); 315 printf(TITLE_FMT, "start", "size", "part", "contents");
310 EntryDetails(entry, index, numeric); 316 EntryDetails(entry, index, numeric);
311 } 317 }
312 318
313 } else if (quick) { // show all partitions, quickly 319 } else if (quick) { // show all partitions, quickly
314 int i; 320 uint32_t i;
315 GptEntry *entry; 321 GptEntry *entry;
316 char type[GUID_STRLEN]; 322 char type[GUID_STRLEN];
317 323
318 for (i = 0; i < GetNumberOfEntries(&drive.gpt); ++i) { 324 for (i = 0; i < GetNumberOfEntries(&drive.gpt); ++i) {
319 entry = GetEntry(&drive.gpt, PRIMARY, i); 325 entry = GetEntry(&drive.gpt, PRIMARY, i);
320 326
321 if (IsZero(&entry->type)) 327 if (IsZero(&entry->type))
322 continue; 328 continue;
323 329
324 if (!numeric && CGPT_OK == ResolveType(&entry->type, type)) { 330 if (!numeric && CGPT_OK == ResolveType(&entry->type, type)) {
325 } else { 331 } else {
326 GuidToStr(&entry->type, type); 332 GuidToStr(&entry->type, type, GUID_STRLEN);
327 } 333 }
328 printf(PARTITION_FMT, (int)entry->starting_lba, 334 printf(PARTITION_FMT, (int)entry->starting_lba,
329 (int)(entry->ending_lba - entry->starting_lba + 1), 335 (int)(entry->ending_lba - entry->starting_lba + 1),
330 i+1, type); 336 i+1, type);
331 } 337 }
332 338
333 } else { // show all partitions 339 } else { // show all partitions
334 340
335 if (CGPT_OK != ReadPMBR(&drive)) { 341 if (CGPT_OK != ReadPMBR(&drive)) {
336 Error("Unable to read PMBR\n"); 342 Error("Unable to read PMBR\n");
337 return CGPT_FAILED; 343 return CGPT_FAILED;
338 } 344 }
339 345
340 printf(TITLE_FMT, "start", "size", "part", "contents"); 346 printf(TITLE_FMT, "start", "size", "part", "contents");
341 char buf[256]; 347 char buf[256]; // buffer for formatted PMBR content
342 PMBRToStr(&drive.pmbr, buf); 348 PMBRToStr(&drive.pmbr, buf, sizeof(buf)); // will exit if buf is too small
343 printf(GPT_FMT, 0, GPT_PMBR_SECTOR, "", buf); 349 printf(GPT_FMT, 0, GPT_PMBR_SECTOR, "", buf);
344 350
345 if (drive.gpt.valid_headers & MASK_PRIMARY) { 351 if (drive.gpt.valid_headers & MASK_PRIMARY) {
346 printf(GPT_FMT, (int)GPT_PMBR_SECTOR, 352 printf(GPT_FMT, (int)GPT_PMBR_SECTOR,
347 (int)GPT_HEADER_SECTOR, "", "Pri GPT header"); 353 (int)GPT_HEADER_SECTOR, "", "Pri GPT header");
348 if (verbose) { 354 if (verbose) {
349 GptHeader *header; 355 GptHeader *header;
350 char indent[64]; 356 char indent[64];
351 357
352 snprintf(indent, sizeof(indent), GPT_MORE); 358 require(snprintf(indent, sizeof(indent), GPT_MORE) < sizeof(indent));
353 header = (GptHeader*)drive.gpt.primary_header; 359 header = (GptHeader*)drive.gpt.primary_header;
354 HeaderDetails(header, indent, numeric); 360 HeaderDetails(header, indent, numeric);
355 } 361 }
356 } else { 362 } else {
357 printf(GPT_FMT, (int)GPT_PMBR_SECTOR, 363 printf(GPT_FMT, (int)GPT_PMBR_SECTOR,
358 (int)GPT_HEADER_SECTOR, "INVALID", "Pri GPT header"); 364 (int)GPT_HEADER_SECTOR, "INVALID", "Pri GPT header");
359 } 365 }
360 366
361 printf(GPT_FMT, (int)(GPT_PMBR_SECTOR + GPT_HEADER_SECTOR), 367 printf(GPT_FMT, (int)(GPT_PMBR_SECTOR + GPT_HEADER_SECTOR),
362 (int)GPT_ENTRIES_SECTORS, 368 (int)GPT_ENTRIES_SECTORS,
(...skipping 30 matching lines...) Expand all
393 * 2. secondary is not synonymous to primary. 399 * 2. secondary is not synonymous to primary.
394 */ 400 */
395 if ((drive.gpt.valid_headers & MASK_SECONDARY) && 401 if ((drive.gpt.valid_headers & MASK_SECONDARY) &&
396 (!(drive.gpt.valid_headers & MASK_PRIMARY) || 402 (!(drive.gpt.valid_headers & MASK_PRIMARY) ||
397 !IsSynonymous((GptHeader*)drive.gpt.primary_header, 403 !IsSynonymous((GptHeader*)drive.gpt.primary_header,
398 (GptHeader*)drive.gpt.secondary_header))) { 404 (GptHeader*)drive.gpt.secondary_header))) {
399 if (verbose) { 405 if (verbose) {
400 GptHeader *header; 406 GptHeader *header;
401 char indent[64]; 407 char indent[64];
402 408
403 snprintf(indent, sizeof(indent), GPT_MORE); 409 require(snprintf(indent, sizeof(indent), GPT_MORE) < sizeof(indent));
404 header = (GptHeader*)drive.gpt.secondary_header; 410 header = (GptHeader*)drive.gpt.secondary_header;
405 HeaderDetails(header, indent, numeric); 411 HeaderDetails(header, indent, numeric);
406 } 412 }
407 } 413 }
408 } 414 }
409 415
410 (void) CheckValid(&drive); 416 (void) CheckValid(&drive);
411 (void) DriveClose(&drive, 0); 417 (void) DriveClose(&drive, 0);
412 418
413 return CGPT_OK; 419 return CGPT_OK;
414 } 420 }
415
416
417
OLDNEW
« no previous file with comments | « cgpt/cmd_find.c ('k') | utility/vbutil_keyblock.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698