mirror of
https://github.com/revanced/smali.git
synced 2025-05-05 00:54:25 +02:00
Add better support for invalid strings and chars
git-svn-id: https://smali.googlecode.com/svn/trunk@746 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
8136408a58
commit
b9f0c569ea
@ -17,6 +17,7 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
|
|
||||||
%{
|
%{
|
||||||
private StringBuffer sb = new StringBuffer();
|
private StringBuffer sb = new StringBuffer();
|
||||||
|
private String stringOrCharError = null;
|
||||||
private int stringStartLine;
|
private int stringStartLine;
|
||||||
private int stringStartCol;
|
private int stringStartCol;
|
||||||
private int stringStartChar;
|
private int stringStartChar;
|
||||||
@ -97,11 +98,16 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
stringStartLine = getLine();
|
stringStartLine = getLine();
|
||||||
stringStartCol = getColumn();
|
stringStartCol = getColumn();
|
||||||
stringStartChar = yychar;
|
stringStartChar = yychar;
|
||||||
|
stringOrCharError = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Token endStringOrChar(int type) {
|
private Token endStringOrChar(int type) {
|
||||||
yybegin(YYINITIAL);
|
yybegin(YYINITIAL);
|
||||||
|
|
||||||
|
if (stringOrCharError != null) {
|
||||||
|
return invalidStringOrChar(stringOrCharError);
|
||||||
|
}
|
||||||
|
|
||||||
CommonToken token = new CommonToken(type, sb.toString());
|
CommonToken token = new CommonToken(type, sb.toString());
|
||||||
token.setStartIndex(stringStartChar);
|
token.setStartIndex(stringStartChar);
|
||||||
token.setStopIndex(yychar + yylength() - 1);
|
token.setStopIndex(yychar + yylength() - 1);
|
||||||
@ -110,6 +116,12 @@ import static org.jf.smali.smaliParser.*;
|
|||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setStringOrCharError(String message) {
|
||||||
|
if (stringOrCharError == null) {
|
||||||
|
stringOrCharError = message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Token invalidStringOrChar(String message) {
|
private Token invalidStringOrChar(String message) {
|
||||||
yybegin(YYINITIAL);
|
yybegin(YYINITIAL);
|
||||||
|
|
||||||
@ -130,6 +142,7 @@ HexPrefix = 0 [xX]
|
|||||||
|
|
||||||
HexDigit = [0-9a-fA-F]
|
HexDigit = [0-9a-fA-F]
|
||||||
HexDigits = [0-9a-fA-F]{4}
|
HexDigits = [0-9a-fA-F]{4}
|
||||||
|
FewerHexDigits = [0-9a-fA-F]{0,3}
|
||||||
|
|
||||||
Integer1 = 0
|
Integer1 = 0
|
||||||
Integer2 = [1-9] [0-9]*
|
Integer2 = [1-9] [0-9]*
|
||||||
@ -247,7 +260,15 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
|
|||||||
"\\\\" { sb.append('\\'); }
|
"\\\\" { sb.append('\\'); }
|
||||||
"\\u" {HexDigits} { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16)); }
|
"\\u" {HexDigits} { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16)); }
|
||||||
|
|
||||||
/*TODO: Handle embedded newlines. error or non-error?*/
|
"\\u" {FewerHexDigits} {
|
||||||
|
sb.append(yytext());
|
||||||
|
setStringOrCharError("Invalid \\u sequence. \\u must be followed by 4 hex digits");
|
||||||
|
}
|
||||||
|
|
||||||
|
"\\" [^btnfr'\"\\u] {
|
||||||
|
sb.append(yytext());
|
||||||
|
setStringOrCharError("Invalid escape sequence " + yytext());
|
||||||
|
}
|
||||||
|
|
||||||
<<EOF>> { return invalidStringOrChar("Unterminated string literal"); }
|
<<EOF>> { return invalidStringOrChar("Unterminated string literal"); }
|
||||||
}
|
}
|
||||||
@ -275,6 +296,16 @@ Type = {PrimitiveType} | {ClassDescriptor} | {ArrayDescriptor}
|
|||||||
"\\\\" { sb.append('\\'); }
|
"\\\\" { sb.append('\\'); }
|
||||||
"\\u" {HexDigits} { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16)); }
|
"\\u" {HexDigits} { sb.append((char)Integer.parseInt(yytext().substring(2,6), 16)); }
|
||||||
|
|
||||||
|
"\\u" {HexDigit}* {
|
||||||
|
sb.append(yytext());
|
||||||
|
setStringOrCharError("Invalid \\u sequence. \\u must be followed by exactly 4 hex digits");
|
||||||
|
}
|
||||||
|
|
||||||
|
"\\" [^btnfr'\"\\u] {
|
||||||
|
sb.append(yytext());
|
||||||
|
setStringOrCharError("Invalid escape sequence " + yytext());
|
||||||
|
}
|
||||||
|
|
||||||
<<EOF>> { return invalidStringOrChar("Unterminated character literal"); }
|
<<EOF>> { return invalidStringOrChar("Unterminated character literal"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user