Skip to content

Commit d903d81

Browse files
committed
Add more checks for end-of-file in auto-format code.
Otherwise, you tend to get out of memory errors caused by infinite loops. http://code.google.com/p/arduino/issues/detail?id=859
1 parent 6030f96 commit d903d81

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

app/src/processing/app/tools/AutoFormat.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void comment() throws IOException {
9999
c = string[j++] = getchr(); // extra char
100100
while (done == 0) {
101101
c = string[j++] = getchr();
102-
while ((c != '/') && (j < string.length)) {
102+
while ((c != '/') && (j < string.length) && EOF == 0) {
103103
if(c == '\n' || c == '\r') {
104104
lineNumber++;
105105
putcoms();
@@ -111,7 +111,9 @@ public void comment() throws IOException {
111111
if (j>1 && string[j-2] == '*') {
112112
done = 1;
113113
jdoc = 0;
114-
}
114+
} else if (EOF != 0) {
115+
done = 1;
116+
}
115117
}
116118

117119
putcoms();
@@ -134,7 +136,7 @@ public char get_string() throws IOException {
134136
}
135137
if (ch == '\'' || ch == '"') {
136138
cc = string[j++] = getchr();
137-
while (cc != ch) {
139+
while (cc != ch && EOF == 0) {
138140
if (cc == '\\') string[j++] = getchr();
139141
cc = string[j++] = getchr();
140142
}
@@ -207,7 +209,7 @@ public void putcoms()
207209
}
208210
string[j] = '\0';
209211
i = 0;
210-
while (string[i] == ' ') i++;
212+
while (string[i] == ' ' && EOF == 0) i++;
211213
if (lookup_com(w_jdoc) == 1) jdoc = 1;
212214
String strBuffer = new String(string,0,j);
213215
if (string[i] == '/' && string[i+1]=='*')
@@ -241,7 +243,7 @@ public void putcoms()
241243
public void cpp_comment() throws IOException
242244
{
243245
c = getchr();
244-
while(c != '\n' && c != '\r')
246+
while(c != '\n' && c != '\r' && EOF == 0)
245247
{
246248
string[j++] = c;
247249
c = getchr();
@@ -337,7 +339,7 @@ public int getnl() throws IOException
337339
peekc = getchr();
338340
//while ((peekc == '\t' || peekc == ' ') &&
339341
// (j < string.length)) {
340-
while (peekc == '\t' || peekc == ' ') {
342+
while ((peekc == '\t' || peekc == ' ') && EOF == 0) {
341343
string[j++] = peekc;
342344
peek = -1;
343345
peekc = '`';
@@ -398,7 +400,7 @@ public int lookup (String keyword)
398400

399401
if (j<1) return (0);
400402
kk=0;
401-
while(string[kk] == ' ')kk++;
403+
while(string[kk] == ' ' && EOF == 0)kk++;
402404
l=0;
403405
l = j_string.indexOf(keyword);
404406
if (l<0 || l!=kk)
@@ -421,7 +423,7 @@ public int lookup_com (String keyword)
421423

422424
if (j<1) return (0);
423425
kk=0;
424-
while(string[kk] == ' ')kk++;
426+
while(string[kk] == ' ' && EOF == 0) kk++;
425427
l=0;
426428
l = j_string.indexOf(keyword);
427429
if (l<0 || l!=kk)
@@ -637,8 +639,12 @@ public void run() {
637639
case '\'':
638640
string[j++] = c;
639641
cc = getchr();
640-
while(cc != c)
642+
int count = 0;
643+
while(cc != c && EOF == 0)
641644
{
645+
if (++count % 100000 == 0) {
646+
System.err.println("Stuck: " + count);
647+
}
642648
// max. length of line should be 256
643649
string[j++] = cc;
644650

@@ -784,7 +790,7 @@ public void run() {
784790
case '#':
785791
string[j++] = c;
786792
cc = getchr();
787-
while(cc != '\n')
793+
while(cc != '\n' && EOF == 0)
788794
{
789795
string[j++] = cc;
790796
cc = getchr();
@@ -827,13 +833,13 @@ else if(tabs > 0)
827833
if ((lookup(w_for) == 1))
828834
{
829835
c = get_string();
830-
while(c != ';') c = get_string();
836+
while(c != ';' && EOF == 0) c = get_string();
831837
ct=0;
832838
int for_done = 0;
833-
while (for_done==0)
839+
while (for_done == 0 && EOF == 0)
834840
{
835841
c = get_string();
836-
while(c != ')')
842+
while(c != ')' && EOF == 0)
837843
{
838844
if(c == '(') ct++;
839845
c = get_string();

0 commit comments

Comments
 (0)