Skip to content

Commit

Permalink
Increase the resilience of CalendarParserImpl to superfluous newline …
Browse files Browse the repository at this point in the history
…characters between objects in the input file.
  • Loading branch information
edwhiting committed Aug 18, 2020
1 parent 1f52049 commit 92e4470
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions src/main/java/net/fortuna/ical4j/data/CalendarParserImpl.java
Expand Up @@ -112,6 +112,8 @@ private void parseCalendar(final StreamTokenizer tokeniser, Reader in,

handler.startCalendar();

absorbWhitespace(tokeniser, in);

// parse calendar properties..
propertyListParser.parse(tokeniser, in, handler);

Expand Down Expand Up @@ -180,7 +182,8 @@ private void parseCalendarList(final StreamTokenizer tokeniser, Reader in,
int ntok = assertToken(tokeniser, in, Calendar.BEGIN, false, true);
while (ntok != StreamTokenizer.TT_EOF) {
parseCalendar(tokeniser, in, handler);
ntok = absorbWhitespace(tokeniser, in, true);
absorbWhitespace(tokeniser, in);
ntok = nextToken(tokeniser, in, true);
}
}

Expand Down Expand Up @@ -214,7 +217,8 @@ public void parse(final StreamTokenizer tokeniser, Reader in,
} else if (!CompatibilityHints.isHintEnabled(CompatibilityHints.KEY_RELAXED_PARSING)) {
throw new ParserException("Invalid property name", getLineNumber(tokeniser, in));
}
absorbWhitespace(tokeniser, in, false);
absorbWhitespace(tokeniser, in);
nextToken(tokeniser, in, false);
// assertToken(tokeniser, StreamTokenizer.TT_WORD);
}
}
Expand Down Expand Up @@ -394,7 +398,8 @@ private void parse(final StreamTokenizer tokeniser, Reader in,

while (Component.BEGIN.equals(tokeniser.sval)) {
componentParser.parse(tokeniser, in, handler);
absorbWhitespace(tokeniser, in, false);
absorbWhitespace(tokeniser, in);
nextToken(tokeniser, in, false);
// assertToken(tokeniser, StreamTokenizer.TT_WORD);
}
}
Expand Down Expand Up @@ -425,6 +430,7 @@ private void parse(final StreamTokenizer tokeniser, Reader in,
handler.startComponent(name);

assertToken(tokeniser, in, StreamTokenizer.TT_EOL);
absorbWhitespace(tokeniser, in);

propertyListParser.parse(tokeniser, in, handler);

Expand Down Expand Up @@ -579,18 +585,19 @@ private String getSvalIgnoringBom(StreamTokenizer tokeniser, Reader in, String t
* @return int value of the ttype field of the tokeniser
* @throws IOException
*/
private int absorbWhitespace(final StreamTokenizer tokeniser, Reader in, boolean ignoreEOF) throws IOException, ParserException {
// HACK: absorb extraneous whitespace between components (KOrganizer)..
int ntok;
while ((ntok = nextToken(tokeniser, in, ignoreEOF)) == StreamTokenizer.TT_EOL) {
private void absorbWhitespace(final StreamTokenizer tokeniser, Reader in) throws IOException, ParserException {
while (nextToken(tokeniser, in, true) == StreamTokenizer.TT_EOL) {
if (log.isTraceEnabled()) {
log.trace("Absorbing extra whitespace..");
}
}
if (log.isTraceEnabled()) {
log.trace("Aborting: absorbing extra whitespace complete");
}
return ntok;
/* In effect, we only want to absorb extra newlines after the current
* token, and not absorb the current token, even if it is a newline.
*/
tokeniser.pushBack();
}

/**
Expand Down

0 comments on commit 92e4470

Please sign in to comment.