mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-15 23:31:37 +00:00
AsmParser: Don't crash if a null byte is inside a quoted string
We don't allow Value* to have names which contain null bytes. The AsmParser should reject .ll files that try to do this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223869 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f8225ab80f
commit
eca84264a7
@ -257,46 +257,7 @@ void LLLexer::SkipLineComment() {
|
|||||||
/// GlobalVar @[-a-zA-Z$._][-a-zA-Z$._0-9]*
|
/// GlobalVar @[-a-zA-Z$._][-a-zA-Z$._0-9]*
|
||||||
/// GlobalVarID @[0-9]+
|
/// GlobalVarID @[0-9]+
|
||||||
lltok::Kind LLLexer::LexAt() {
|
lltok::Kind LLLexer::LexAt() {
|
||||||
// Handle AtStringConstant: @\"[^\"]*\"
|
return LexVar(lltok::GlobalVar, lltok::GlobalID);
|
||||||
if (CurPtr[0] == '"') {
|
|
||||||
++CurPtr;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
int CurChar = getNextChar();
|
|
||||||
|
|
||||||
if (CurChar == EOF) {
|
|
||||||
Error("end of file in global variable name");
|
|
||||||
return lltok::Error;
|
|
||||||
}
|
|
||||||
if (CurChar == '"') {
|
|
||||||
StrVal.assign(TokStart+2, CurPtr-1);
|
|
||||||
UnEscapeLexed(StrVal);
|
|
||||||
if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
|
|
||||||
Error("Null bytes are not allowed in names");
|
|
||||||
return lltok::Error;
|
|
||||||
}
|
|
||||||
return lltok::GlobalVar;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle GlobalVarName: @[-a-zA-Z$._][-a-zA-Z$._0-9]*
|
|
||||||
if (ReadVarName())
|
|
||||||
return lltok::GlobalVar;
|
|
||||||
|
|
||||||
// Handle GlobalVarID: @[0-9]+
|
|
||||||
if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
|
|
||||||
for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
|
|
||||||
/*empty*/;
|
|
||||||
|
|
||||||
uint64_t Val = atoull(TokStart+1, CurPtr);
|
|
||||||
if ((unsigned)Val != Val)
|
|
||||||
Error("invalid value number (too large)!");
|
|
||||||
UIntVal = unsigned(Val);
|
|
||||||
return lltok::GlobalID;
|
|
||||||
}
|
|
||||||
|
|
||||||
return lltok::Error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lltok::Kind LLLexer::LexDollar() {
|
lltok::Kind LLLexer::LexDollar() {
|
||||||
@ -372,22 +333,35 @@ bool LLLexer::ReadVarName() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// LexPercent - Lex all tokens that start with a % character:
|
lltok::Kind LLLexer::LexVar(lltok::Kind Var, lltok::Kind VarID) {
|
||||||
/// LocalVar ::= %\"[^\"]*\"
|
// Handle StringConstant: \"[^\"]*\"
|
||||||
/// LocalVar ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]*
|
|
||||||
/// LocalVarID ::= %[0-9]+
|
|
||||||
lltok::Kind LLLexer::LexPercent() {
|
|
||||||
// Handle LocalVarName: %\"[^\"]*\"
|
|
||||||
if (CurPtr[0] == '"') {
|
if (CurPtr[0] == '"') {
|
||||||
++CurPtr;
|
++CurPtr;
|
||||||
return ReadString(lltok::LocalVar);
|
|
||||||
|
while (1) {
|
||||||
|
int CurChar = getNextChar();
|
||||||
|
|
||||||
|
if (CurChar == EOF) {
|
||||||
|
Error("end of file in global variable name");
|
||||||
|
return lltok::Error;
|
||||||
|
}
|
||||||
|
if (CurChar == '"') {
|
||||||
|
StrVal.assign(TokStart+2, CurPtr-1);
|
||||||
|
UnEscapeLexed(StrVal);
|
||||||
|
if (StringRef(StrVal).find_first_of(0) != StringRef::npos) {
|
||||||
|
Error("Null bytes are not allowed in names");
|
||||||
|
return lltok::Error;
|
||||||
|
}
|
||||||
|
return Var;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle LocalVarName: %[-a-zA-Z$._][-a-zA-Z$._0-9]*
|
// Handle VarName: [-a-zA-Z$._][-a-zA-Z$._0-9]*
|
||||||
if (ReadVarName())
|
if (ReadVarName())
|
||||||
return lltok::LocalVar;
|
return Var;
|
||||||
|
|
||||||
// Handle LocalVarID: %[0-9]+
|
// Handle VarID: [0-9]+
|
||||||
if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
|
if (isdigit(static_cast<unsigned char>(CurPtr[0]))) {
|
||||||
for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
|
for (++CurPtr; isdigit(static_cast<unsigned char>(CurPtr[0])); ++CurPtr)
|
||||||
/*empty*/;
|
/*empty*/;
|
||||||
@ -396,12 +370,19 @@ lltok::Kind LLLexer::LexPercent() {
|
|||||||
if ((unsigned)Val != Val)
|
if ((unsigned)Val != Val)
|
||||||
Error("invalid value number (too large)!");
|
Error("invalid value number (too large)!");
|
||||||
UIntVal = unsigned(Val);
|
UIntVal = unsigned(Val);
|
||||||
return lltok::LocalVarID;
|
return VarID;
|
||||||
}
|
}
|
||||||
|
|
||||||
return lltok::Error;
|
return lltok::Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// LexPercent - Lex all tokens that start with a % character:
|
||||||
|
/// LocalVar ::= %\"[^\"]*\"
|
||||||
|
/// LocalVar ::= %[-a-zA-Z$._][-a-zA-Z$._0-9]*
|
||||||
|
/// LocalVarID ::= %[0-9]+
|
||||||
|
lltok::Kind LLLexer::LexPercent() {
|
||||||
|
return LexVar(lltok::LocalVar, lltok::LocalVarID);
|
||||||
|
}
|
||||||
|
|
||||||
/// LexQuote - Lex all tokens that start with a " character:
|
/// LexQuote - Lex all tokens that start with a " character:
|
||||||
/// QuoteLabel "[^"]+":
|
/// QuoteLabel "[^"]+":
|
||||||
/// StringConstant "[^"]*"
|
/// StringConstant "[^"]*"
|
||||||
|
@ -82,6 +82,7 @@ namespace llvm {
|
|||||||
lltok::Kind LexDollar();
|
lltok::Kind LexDollar();
|
||||||
lltok::Kind LexExclaim();
|
lltok::Kind LexExclaim();
|
||||||
lltok::Kind LexPercent();
|
lltok::Kind LexPercent();
|
||||||
|
lltok::Kind LexVar(lltok::Kind Var, lltok::Kind VarID);
|
||||||
lltok::Kind LexQuote();
|
lltok::Kind LexQuote();
|
||||||
lltok::Kind Lex0x();
|
lltok::Kind Lex0x();
|
||||||
lltok::Kind LexHash();
|
lltok::Kind LexHash();
|
||||||
|
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user