From 418fda3c8f3493ebb556798453350f1a34027880 Mon Sep 17 00:00:00 2001 From: Daniel Gredler Date: Thu, 30 Aug 2018 15:10:39 -0400 Subject: [PATCH] Add missing checks against null. The program can dereference a null pointer because it does not check the return value of a function that might return null. --- .../getdown/launcher/GetdownApp.java | 2 +- .../getdown/launcher/GetdownApplet.java | 15 ++++++--- .../com/threerings/getdown/tools/JarDiff.java | 6 ++-- .../getdown/tools/JarDiffPatcher.java | 4 +++ .../threerings/getdown/util/LaunchUtil.java | 9 ++++-- .../threerings/getdown/tools/JarDiffTest.java | 32 +++++++++++++++++++ 6 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 src/test/java/com/threerings/getdown/tools/JarDiffTest.java diff --git a/src/main/java/com/threerings/getdown/launcher/GetdownApp.java b/src/main/java/com/threerings/getdown/launcher/GetdownApp.java index 4de0770..d25d4cb 100644 --- a/src/main/java/com/threerings/getdown/launcher/GetdownApp.java +++ b/src/main/java/com/threerings/getdown/launcher/GetdownApp.java @@ -197,7 +197,7 @@ public class GetdownApp String[] cmdarray; if (RunAnywhere.isWindows()) { String osName = System.getProperty("os.name"); - if (osName.indexOf("9") != -1 || osName.indexOf("Me") != -1) { + if (osName != null && (osName.indexOf("9") != -1 || osName.indexOf("Me") != -1)) { cmdarray = new String[] { "command.com", "/c", "start", "\"" + url + "\"" }; } else { diff --git a/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java b/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java index 68b46e3..7f1d32a 100644 --- a/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java +++ b/src/main/java/com/threerings/getdown/launcher/GetdownApplet.java @@ -93,9 +93,12 @@ public class GetdownApplet extends JApplet // getSigners() returns all certificates used to sign this applet which may allow a // third party to insert a trusted certificate. This should be avoided. log.warning("No resource certificate found, falling back to class signers"); - for (Object signer : GetdownApplet.class.getSigners()) { - if (signer instanceof Certificate) { - signers.add((Certificate)signer); + Object[] candidates = GetdownApplet.class.getSigners(); + if (candidates != null) { + for (Object signer : candidates) { + if (signer instanceof Certificate) { + signers.add((Certificate)signer); + } } } } @@ -307,7 +310,11 @@ public class GetdownApplet extends JApplet protected static Certificate loadCertificate (String path) { try { - URL keyUrl = GetdownApplet.class.getClassLoader().getResource(path); + ClassLoader classLoader = GetdownApplet.class.getClassLoader(); + if (classLoader == null) { + return null; + } + URL keyUrl = classLoader.getResource(path); if (keyUrl == null) { return null; } diff --git a/src/main/java/com/threerings/getdown/tools/JarDiff.java b/src/main/java/com/threerings/getdown/tools/JarDiff.java index 5b75b70..33a21c7 100644 --- a/src/main/java/com/threerings/getdown/tools/JarDiff.java +++ b/src/main/java/com/threerings/getdown/tools/JarDiff.java @@ -233,7 +233,7 @@ public class JarDiff implements JarDiffCodes jos.write(bytes, 0, bytes.length); } - private static void writeEscapedString (Writer writer, String string) + protected static Writer writeEscapedString (Writer writer, String string) throws IOException { int index = 0; @@ -251,13 +251,15 @@ public class JarDiff implements JarDiffCodes index++; writer.write('\\'); } - if (last != 0) { + if (last != 0 && chars != null) { writer.write(chars, last, chars.length - last); } else { // no spaces writer.write(string); } + + return writer; } private static void writeEntry (JarOutputStream jos, JarEntry entry, JarFile2 file) diff --git a/src/main/java/com/threerings/getdown/tools/JarDiffPatcher.java b/src/main/java/com/threerings/getdown/tools/JarDiffPatcher.java index e43b4fc..acb744c 100644 --- a/src/main/java/com/threerings/getdown/tools/JarDiffPatcher.java +++ b/src/main/java/com/threerings/getdown/tools/JarDiffPatcher.java @@ -152,6 +152,10 @@ public class JarDiffPatcher implements JarDiffCodes while (iEntries.hasNext()) { String name = iEntries.next(); JarEntry entry = oldJar.getJarEntry(name); + if (entry == null) { + // names originally retrieved from the JAR, so this should never happen + throw new AssertionError("JAR entry not found: " + name); + } updateObserver(observer, currentEntry, size); currentEntry++; writeEntry(jos, entry, oldJar); diff --git a/src/main/java/com/threerings/getdown/util/LaunchUtil.java b/src/main/java/com/threerings/getdown/util/LaunchUtil.java index c4b0252..8c6efc7 100644 --- a/src/main/java/com/threerings/getdown/util/LaunchUtil.java +++ b/src/main/java/com/threerings/getdown/util/LaunchUtil.java @@ -182,8 +182,13 @@ public class LaunchUtil */ public static boolean mustMonitorChildren () { - String osname = System.getProperty("os.name").toLowerCase(); - return (osname.indexOf("windows 98") != -1 || osname.indexOf("windows me") != -1); + String osname = System.getProperty("os.name"); + if (osname != null) { + osname = osname.toLowerCase(); + return (osname.indexOf("windows 98") != -1 || osname.indexOf("windows me") != -1); + } else { + return false; + } } /** diff --git a/src/test/java/com/threerings/getdown/tools/JarDiffTest.java b/src/test/java/com/threerings/getdown/tools/JarDiffTest.java new file mode 100644 index 0000000..ae15ff3 --- /dev/null +++ b/src/test/java/com/threerings/getdown/tools/JarDiffTest.java @@ -0,0 +1,32 @@ +// +// Getdown - application installer, patcher and launcher +// Copyright (C) 2004-2016 Getdown authors +// https://github.com/threerings/getdown/blob/master/LICENSE + +package com.threerings.getdown.tools; + +import java.io.IOException; +import java.io.StringWriter; + +import org.junit.Test; + +import static com.threerings.getdown.tools.JarDiff.writeEscapedString; +import static org.junit.Assert.assertEquals; + +/** + * Tests {@link JarDiff}. + */ +public class JarDiffTest { + + @Test + public void testWriteEscapedString () throws IOException + { + assertEquals("abc", writeEscapedString(new StringWriter(), "abc").toString()); + assertEquals("abc\\ xyz", writeEscapedString(new StringWriter(), "abc xyz").toString()); + assertEquals("\\ xyz", writeEscapedString(new StringWriter(), " xyz").toString()); + assertEquals("abc\\ ", writeEscapedString(new StringWriter(), "abc ").toString()); + assertEquals("\\ ", writeEscapedString(new StringWriter(), " ").toString()); + assertEquals("", writeEscapedString(new StringWriter(), "").toString()); + } + +}