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

Side by Side Diff: lib/Bitcode/NaCl/TestUtils/NaClBitcodeMungeWriter.cpp

Issue 1157273004: Check for invalid abbreviation operators in munged bitcode. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-llvm.git@master
Patch Set: Fix nit. Remove copied comment from tests. Created 5 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
OLDNEW
1 //===- NaClBitcodeMungeWriter.cpp - Write munged bitcode --------*- C++ -*-===// 1 //===- NaClBitcodeMungeWriter.cpp - Write munged bitcode --------*- C++ -*-===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // Implements method NaClMungedBitcode.write(), which writes out a munged 10 // Implements method NaClMungedBitcode.write(), which writes out a munged
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 111
112 // Marks that an abbreviation definition is being omitted (i.e. not 112 // Marks that an abbreviation definition is being omitted (i.e. not
113 // written) for the current block. 113 // written) for the current block.
114 void markCurrentBlockWithOmittedAbbreviations() { 114 void markCurrentBlockWithOmittedAbbreviations() {
115 assert(!ScopeStack.empty()); 115 assert(!ScopeStack.empty());
116 ScopeStack.back().OmittedAbbreviations = true; 116 ScopeStack.back().OmittedAbbreviations = true;
117 if (getCurWriteBlockID() == naclbitc::BLOCKINFO_BLOCK_ID) 117 if (getCurWriteBlockID() == naclbitc::BLOCKINFO_BLOCK_ID)
118 BlocksWithOmittedAbbrevs.insert(SetBID); 118 BlocksWithOmittedAbbrevs.insert(SetBID);
119 } 119 }
120 120
121 // Returns true if abbreviation operand is legal. If not, generates
jvoung (off chromium) 2015/05/27 20:09:37 Maybe "logs" instead of "generates"? It's not retu
Karl 2015/05/28 20:50:31 Ok. Updated the comment to better reflect this.
122 // a recoverable error and returns false.
123 bool verifyAbbrevOp(NaClBitCodeAbbrevOp::Encoding Encoding, uint64_t Value,
124 const NaClBitcodeAbbrevRecord &Record);
125
121 // Converts the abbreviation record to the corresponding abbreviation. 126 // Converts the abbreviation record to the corresponding abbreviation.
122 // Returns nullptr if unable to build abbreviation. 127 // Returns nullptr if unable to build abbreviation.
123 NaClBitCodeAbbrev *buildAbbrev(const NaClBitcodeAbbrevRecord &Record); 128 NaClBitCodeAbbrev *buildAbbrev(const NaClBitcodeAbbrevRecord &Record);
124 129
125 // Emits the given record to the bitcode file. Returns true if 130 // Emits the given record to the bitcode file. Returns true if
126 // successful. 131 // successful.
127 bool LLVM_ATTRIBUTE_UNUSED_RESULT 132 bool LLVM_ATTRIBUTE_UNUSED_RESULT
128 emitRecord(NaClBitstreamWriter &Writer, 133 emitRecord(NaClBitstreamWriter &Writer,
129 const NaClBitcodeAbbrevRecord &Record); 134 const NaClBitcodeAbbrevRecord &Record);
130 135
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 break; 463 break;
459 } 464 }
460 return true; 465 return true;
461 } 466 }
462 467
463 static NaClBitCodeAbbrev *deleteAbbrev(NaClBitCodeAbbrev *Abbrev) { 468 static NaClBitCodeAbbrev *deleteAbbrev(NaClBitCodeAbbrev *Abbrev) {
464 Abbrev->dropRef(); 469 Abbrev->dropRef();
465 return nullptr; 470 return nullptr;
466 } 471 }
467 472
473 bool WriteState::verifyAbbrevOp(NaClBitCodeAbbrevOp::Encoding Encoding,
474 uint64_t Value,
475 const NaClBitcodeAbbrevRecord &Record) {
476 if (NaClBitCodeAbbrevOp::isValid(Encoding, Value))
477 return true;
478 RecoverableError() << "Invalid abbreviation "
479 << NaClBitCodeAbbrevOp::getEncodingName(Encoding)
480 << "(" << static_cast<int64_t>(Value)
481 << ") in: " << Record << "\n";
482 return false;
483 }
484
468 NaClBitCodeAbbrev *WriteState::buildAbbrev( 485 NaClBitCodeAbbrev *WriteState::buildAbbrev(
469 const NaClBitcodeAbbrevRecord &Record) { 486 const NaClBitcodeAbbrevRecord &Record) {
470 // Note: Recover by removing abbreviation. 487 // Note: Recover by removing abbreviation.
471 NaClBitCodeAbbrev *Abbrev = new NaClBitCodeAbbrev(); 488 NaClBitCodeAbbrev *Abbrev = new NaClBitCodeAbbrev();
472 size_t Index = 0; 489 size_t Index = 0;
473 size_t NumValues = Record.Values.size(); 490 size_t NumValues = Record.Values.size();
474 if (NumValues == 0) { 491 if (NumValues == 0) {
475 RecoverableError() << "Empty abbreviation record not allowed: " 492 RecoverableError() << "Empty abbreviation record not allowed: "
476 << Record << "\n"; 493 << Record << "\n";
477 return deleteAbbrev(Abbrev); 494 return deleteAbbrev(Abbrev);
478 } 495 }
479 size_t NumAbbreviations = Record.Values[Index++]; 496 size_t NumAbbreviations = Record.Values[Index++];
jvoung (off chromium) 2015/05/27 20:09:37 Sorry a few random cleanup suggestions as I'm re-r
Karl 2015/05/28 20:50:31 Good point. Changing.
480 if (NumAbbreviations == 0) { 497 if (NumAbbreviations == 0) {
481 RecoverableError() << "Abbreviation must contain at least one operator: " 498 RecoverableError() << "Abbreviation must contain at least one operator: "
482 << Record << "\n"; 499 << Record << "\n";
483 return deleteAbbrev(Abbrev); 500 return deleteAbbrev(Abbrev);
484 } 501 }
485 for (size_t Count = 0; Count < NumAbbreviations; ++Count) { 502 for (size_t Count = 0; Count < NumAbbreviations; ++Count) {
486 if (Index >= NumValues) { 503 if (Index >= NumValues) {
487 RecoverableError() 504 RecoverableError()
488 << "Malformed abbreviation found. Expects " << NumAbbreviations 505 << "Malformed abbreviation found. Expects " << NumAbbreviations
489 << " operands but found " << Count << ": " << Record << "\n"; 506 << " operands but found " << Count << ": " << Record << "\n";
490 return deleteAbbrev(Abbrev); 507 return deleteAbbrev(Abbrev);
491 } 508 }
492 switch (Record.Values[Index++]) { 509 switch (Record.Values[Index++]) {
jvoung (off chromium) 2015/05/27 20:09:37 Maybe stash Record.Values[Index++] in a named vari
Karl 2015/05/28 20:50:31 Done.
493 case 1: 510 case 1: {
494 if (Index >= NumValues) { 511 if (Index >= NumValues) {
495 RecoverableError() << "Malformed literal abbreviation: " 512 RecoverableError() << "Malformed literal abbreviation: "
496 << Record << "\n"; 513 << Record << "\n";
497 return deleteAbbrev(Abbrev); 514 return deleteAbbrev(Abbrev);
498 } 515 }
499 Abbrev->Add(NaClBitCodeAbbrevOp(Record.Values[Index++])); 516 uint64_t Value = Record.Values[Index++];
517 if (!verifyAbbrevOp(NaClBitCodeAbbrevOp::Literal, Value, Record))
518 return deleteAbbrev(Abbrev);
519 Abbrev->Add(NaClBitCodeAbbrevOp(Value));
500 break; 520 break;
521 }
501 case 0: { 522 case 0: {
502 if (Index >= NumValues) { 523 if (Index >= NumValues) {
503 RecoverableError() << "Malformed abbreviation found: " 524 RecoverableError() << "Malformed abbreviation found: "
504 << Record << "\n"; 525 << Record << "\n";
505 return deleteAbbrev(Abbrev); 526 return deleteAbbrev(Abbrev);
506 } 527 }
507 unsigned Kind = Record.Values[Index++]; 528 unsigned Kind = Record.Values[Index++];
508 switch (Kind) { 529 switch (Kind) {
509 case NaClBitCodeAbbrevOp::Fixed: 530 case NaClBitCodeAbbrevOp::Fixed: {
510 if (Index >= NumValues) { 531 if (Index >= NumValues) {
511 RecoverableError() << "Malformed fixed abbreviation found: " 532 RecoverableError() << "Malformed fixed abbreviation found: "
512 << Record << "\n"; 533 << Record << "\n";
513 return deleteAbbrev(Abbrev); 534 return deleteAbbrev(Abbrev);
514 } 535 }
515 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, 536 uint64_t Value = Record.Values[Index++];
516 Record.Values[Index++])); 537 if (!verifyAbbrevOp(NaClBitCodeAbbrevOp::Fixed, Value, Record))
538 return deleteAbbrev(Abbrev);
539 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Fixed, Value));
517 break; 540 break;
518 case NaClBitCodeAbbrevOp::VBR: 541 }
542 case NaClBitCodeAbbrevOp::VBR: {
519 if (Index >= NumValues) { 543 if (Index >= NumValues) {
520 RecoverableError() << "Malformed vbr abbreviation found: " 544 RecoverableError() << "Malformed vbr abbreviation found: "
521 << Record << "\n"; 545 << Record << "\n";
522 return deleteAbbrev(Abbrev); 546 return deleteAbbrev(Abbrev);
523 } 547 }
524 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, 548 uint64_t Value = Record.Values[Index++];
525 Record.Values[Index++])); 549 if (!verifyAbbrevOp(NaClBitCodeAbbrevOp::VBR, Value, Record))
550 return deleteAbbrev(Abbrev);
551 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::VBR, Value));
526 break; 552 break;
553 }
527 case NaClBitCodeAbbrevOp::Array: 554 case NaClBitCodeAbbrevOp::Array:
528 if (Index >= NumValues) { 555 if (Index >= NumValues) {
jvoung (off chromium) 2015/05/27 20:09:37 fwiw, in the other cases that have this check agai
Karl 2015/05/28 20:50:31 I agree. Fixing. Also, since getting values and c
529 RecoverableError() << "Malformed array abbreviation found: " 556 RecoverableError() << "Malformed array abbreviation found: "
530 << Record << "\n"; 557 << Record << "\n";
531 return deleteAbbrev(Abbrev); 558 return deleteAbbrev(Abbrev);
532 } 559 }
560 if (Count + 2 != NumAbbreviations) {
561 RecoverableError() << "Array abbreviation must be second to last: "
562 << Record << "\n";
563 return deleteAbbrev(Abbrev);
564 }
533 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array)); 565 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Array));
534 break; 566 break;
535 case NaClBitCodeAbbrevOp::Char6: 567 case NaClBitCodeAbbrevOp::Char6:
536 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6)); 568 Abbrev->Add(NaClBitCodeAbbrevOp(NaClBitCodeAbbrevOp::Char6));
537 break; 569 break;
538 default: 570 default:
539 RecoverableError() << "Unknown abbreviation kind " << Kind 571 RecoverableError() << "Unknown abbreviation kind " << Kind
540 << ": " << Record << "\n"; 572 << ": " << Record << "\n";
541 return deleteAbbrev(Abbrev); 573 return deleteAbbrev(Abbrev);
542 } 574 }
543 break; 575 break;
544 } 576 }
545 default: 577 default:
546 RecoverableError() << "Error: Bad abbreviation operand encoding " 578 RecoverableError() << "Bad abbreviation operand encoding "
547 << Record.Values[Index-1] << ": " << Record << "\n"; 579 << Record.Values[Index-1] << ": " << Record << "\n";
548 return deleteAbbrev(Abbrev); 580 return deleteAbbrev(Abbrev);
549 } 581 }
550 } 582 }
583 if (Index != NumValues) {
584 RecoverableError() << "Error: Too many values for number of operands ("
585 << NumAbbreviations << "): "
586 << Record << "\n";
587 return deleteAbbrev(Abbrev);
588 }
589 if (!Abbrev->isValid()) {
590 raw_ostream &Out = RecoverableError();
591 Abbrev->Print(Out << "Abbreviation ");
592 Out << " not valid: " << Record << "\n";
593 return deleteAbbrev(Abbrev);
594 }
551 return Abbrev; 595 return Abbrev;
552 } 596 }
553 597
554 } // end of anonymous namespace. 598 } // end of anonymous namespace.
555 599
556 NaClMungedBitcode::WriteResults NaClMungedBitcode::writeMaybeRepair( 600 NaClMungedBitcode::WriteResults NaClMungedBitcode::writeMaybeRepair(
557 SmallVectorImpl<char> &Buffer, bool AddHeader, 601 SmallVectorImpl<char> &Buffer, bool AddHeader,
558 const WriteFlags &Flags) const { 602 const WriteFlags &Flags) const {
559 NaClBitstreamWriter Writer(Buffer); 603 NaClBitstreamWriter Writer(Buffer);
560 WriteState State(Flags); 604 WriteState State(Flags);
561 if (AddHeader) { 605 if (AddHeader) {
562 NaClWriteHeader(Writer, true); 606 NaClWriteHeader(Writer, true);
563 } 607 }
564 for (const NaClBitcodeAbbrevRecord &Record : *this) { 608 for (const NaClBitcodeAbbrevRecord &Record : *this) {
565 if (!State.emitRecord(Writer, Record)) 609 if (!State.emitRecord(Writer, Record))
566 break; 610 break;
567 } 611 }
568 bool RecoverSilently = 612 bool RecoverSilently =
569 State.Results.NumErrors > 0 && !Flags.getTryToRecover(); 613 State.Results.NumErrors > 0 && !Flags.getTryToRecover();
570 return State.finish(Writer, RecoverSilently); 614 return State.finish(Writer, RecoverSilently);
571 } 615 }
OLDNEW
« no previous file with comments | « no previous file | unittests/Bitcode/NaClMungeWriteErrorTests.cpp » ('j') | unittests/Bitcode/NaClMungeWriteErrorTests.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698