Skip to content
Snippets Groups Projects
Unverified Commit 53d0b8b2 authored by akwizgran's avatar akwizgran
Browse files

Check whether File#listFiles() returns null.

The docs say this can happen for a directory if there's an I/O error.
parent eb618915
No related branches found
No related tags found
No related merge requests found
......@@ -42,14 +42,17 @@ public class AppModule {
this.application = application;
uiCallback = new UiCallback() {
@Override
public int showChoice(String[] options, String... message) {
throw new UnsupportedOperationException();
}
@Override
public boolean showConfirmationMessage(String... message) {
throw new UnsupportedOperationException();
}
@Override
public void showMessage(String... message) {
throw new UnsupportedOperationException();
}
......@@ -75,24 +78,29 @@ public class AppModule {
private volatile SecretKey key = null;
@Override
public boolean databaseExists() {
if (!dir.isDirectory()) return false;
File[] files = dir.listFiles();
return files != null && files.length > 0;
}
@Override
public File getDatabaseDirectory() {
return dir;
}
@Override
public void setEncryptionKey(SecretKey key) {
this.key = key;
}
@Override
public SecretKey getEncryptionKey() {
return key;
}
@Override
public long getMaxSize() {
return Long.MAX_VALUE;
}
......
......@@ -248,17 +248,17 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
// Unzip the Tor binary to the filesystem
in = getTorInputStream();
out = new FileOutputStream(torFile);
IoUtils.copy(in, out);
IoUtils.copyAndClose(in, out);
// Make the Tor binary executable
if (!torFile.setExecutable(true, true)) throw new IOException();
// Unzip the GeoIP database to the filesystem
in = getGeoIpInputStream();
out = new FileOutputStream(geoIpFile);
IoUtils.copy(in, out);
IoUtils.copyAndClose(in, out);
// Copy the config file to the filesystem
in = getConfigInputStream();
out = new FileOutputStream(configFile);
IoUtils.copy(in, out);
IoUtils.copyAndClose(in, out);
doneFile.createNewFile();
} catch (IOException e) {
tryToClose(in);
......@@ -306,8 +306,12 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
}
private void listFiles(File f) {
if (f.isDirectory()) for (File child : f.listFiles()) listFiles(child);
else LOG.info(f.getAbsolutePath());
if (f.isDirectory()) {
File[] children = f.listFiles();
if (children != null) for (File child : children) listFiles(child);
} else {
LOG.info(f.getAbsolutePath());
}
}
private byte[] read(File f) throws IOException {
......@@ -322,7 +326,7 @@ class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
}
return b;
} finally {
in.close();
tryToClose(in);
}
}
......
......@@ -35,6 +35,7 @@ class H2Database extends JdbcDatabase {
+ ";WRITE_DELAY=0;DB_CLOSE_ON_EXIT=false";
}
@Override
public boolean open() throws DbException {
boolean reopen = config.databaseExists();
if (!reopen) config.getDatabaseDirectory().mkdirs();
......@@ -42,6 +43,7 @@ class H2Database extends JdbcDatabase {
return reopen;
}
@Override
public void close() throws DbException {
// H2 will close the database when the last connection closes
try {
......@@ -51,6 +53,7 @@ class H2Database extends JdbcDatabase {
}
}
@Override
public long getFreeSpace() throws DbException {
File dir = config.getDatabaseDirectory();
long maxSize = config.getMaxSize();
......@@ -63,7 +66,9 @@ class H2Database extends JdbcDatabase {
private long getDiskSpace(File f) {
if (f.isDirectory()) {
long total = 0;
for (File child : f.listFiles()) total += getDiskSpace(child);
File[] children = f.listFiles();
if (children != null)
for (File child : children) total += getDiskSpace(child);
return total;
} else if (f.isFile()) {
return f.length();
......
......@@ -35,7 +35,7 @@ class DevReporterImpl implements DevReporter {
private final DevConfig devConfig;
private final SocketFactory torSocketFactory;
public DevReporterImpl(CryptoComponent crypto, DevConfig devConfig,
DevReporterImpl(CryptoComponent crypto, DevConfig devConfig,
SocketFactory torSocketFactory) {
this.crypto = crypto;
this.devConfig = devConfig;
......@@ -90,7 +90,7 @@ class DevReporterImpl implements DevReporter {
Socket s = connectToDevelopers();
out = s.getOutputStream();
in = new FileInputStream(f);
IoUtils.copy(in, out);
IoUtils.copyAndClose(in, out);
f.delete();
} catch (IOException e) {
LOG.log(WARNING, "Failed to send reports", e);
......
......@@ -20,7 +20,7 @@ public class IoUtils {
}
}
public static void copy(InputStream in, OutputStream out)
public static void copyAndClose(InputStream in, OutputStream out)
throws IOException {
byte[] buf = new byte[4096];
try {
......
......@@ -16,24 +16,29 @@ public class TestDatabaseConfig implements DatabaseConfig {
this.maxSize = maxSize;
}
@Override
public boolean databaseExists() {
if (!dir.isDirectory()) return false;
File[] files = dir.listFiles();
return files != null && files.length > 0;
}
@Override
public File getDatabaseDirectory() {
return dir;
}
@Override
public void setEncryptionKey(SecretKey key) {
this.key = key;
}
@Override
public SecretKey getEncryptionKey() {
return key;
}
@Override
public long getMaxSize() {
return maxSize;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment