From 812b83af450e7b2c984ee71f99738f389f20ab2e Mon Sep 17 00:00:00 2001 From: Jeffrey Han Date: Wed, 2 Jul 2014 10:14:15 -0400 Subject: [PATCH] Added extra checks in the parser for invalid line. Credits to xasuma for the report. --- src/itdelatrisu/opsu/OsuParser.java | 35 ++++++++++++++--------- src/itdelatrisu/opsu/states/MainMenu.java | 2 +- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/itdelatrisu/opsu/OsuParser.java b/src/itdelatrisu/opsu/OsuParser.java index 89c2fddb..6aed40e8 100644 --- a/src/itdelatrisu/opsu/OsuParser.java +++ b/src/itdelatrisu/opsu/OsuParser.java @@ -120,7 +120,8 @@ public class OsuParser { continue; if (line.charAt(0) == '[') break; - tokens = tokenize(line); + if ((tokens = tokenize(line)) == null) + continue; switch (tokens[0]) { case "AudioFilename": osu.audioFilename = new File(file.getParent() + File.separator + tokens[1]); @@ -172,7 +173,8 @@ public class OsuParser { if (line.charAt(0) == '[') break; /* Not implemented. */ -// tokens = tokenize(line); +// if ((tokens = tokenize(line)) == null) +// continue; // switch (tokens[0]) { // case "Bookmarks": // String[] bookmarks = tokens[1].split(","); @@ -204,7 +206,8 @@ public class OsuParser { continue; if (line.charAt(0) == '[') break; - tokens = tokenize(line); + if ((tokens = tokenize(line)) == null) + continue; switch (tokens[0]) { case "Title": osu.title = tokens[1]; @@ -246,7 +249,8 @@ public class OsuParser { continue; if (line.charAt(0) == '[') break; - tokens = tokenize(line); + if ((tokens = tokenize(line)) == null) + continue; switch (tokens[0]) { case "HPDrainRate": osu.HPDrainRate = Float.parseFloat(tokens[1]); @@ -346,7 +350,8 @@ public class OsuParser { continue; if (line.charAt(0) == '[') break; - tokens = tokenize(line); + if ((tokens = tokenize(line)) == null) + continue; switch (tokens[0]) { case "Combo1": case "Combo2": @@ -464,6 +469,8 @@ public class OsuParser { break; // create a new OsuHitObject for each line tokens = line.split(","); + if (tokens.length < 5) + continue; float scaledX = Integer.parseInt(tokens[0]) * xMultiplier + xOffset; float scaledY = Integer.parseInt(tokens[1]) * yMultiplier + yOffset; int type = Integer.parseInt(tokens[3]); @@ -525,16 +532,18 @@ public class OsuParser { /** * Splits line into two strings: tag, value. + * If no ':' character is present, null will be returned. */ private static String[] tokenize(String line) { - String[] tokens = new String[2]; - try { - int index = line.indexOf(':'); - tokens[0] = line.substring(0, index).trim(); - tokens[1] = line.substring(index + 1).trim(); - } catch (java.lang.StringIndexOutOfBoundsException e) { - Log.error(String.format("Failed to tokenize line: '%s'.", line), e); + int index = line.indexOf(':'); + if (index == -1) { + Log.debug(String.format("Failed to tokenize line: '%s'.", line)); + return null; } + + String[] tokens = new String[2]; + tokens[0] = line.substring(0, index).trim(); + tokens[1] = line.substring(index + 1).trim(); return tokens; } @@ -543,6 +552,6 @@ public class OsuParser { */ public static String getExtension(String file) { int i = file.lastIndexOf('.'); - return (i > -1) ? file.substring(i + 1).toLowerCase() : ""; + return (i != -1) ? file.substring(i + 1).toLowerCase() : ""; } } \ No newline at end of file diff --git a/src/itdelatrisu/opsu/states/MainMenu.java b/src/itdelatrisu/opsu/states/MainMenu.java index e99a1ddf..8eac1291 100644 --- a/src/itdelatrisu/opsu/states/MainMenu.java +++ b/src/itdelatrisu/opsu/states/MainMenu.java @@ -218,7 +218,7 @@ public class MainMenu extends BasicGameState { Utils.drawFPS(); Utils.drawCursor(); } - + @Override public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException {