Skip to content

Commit c3f503e

Browse files
authored
Make sure to close all Closeable resources (#3000)
* changed all stream operations to try-with-resources blocks
1 parent 93a76ca commit c3f503e

File tree

10 files changed

+56
-48
lines changed

10 files changed

+56
-48
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- Cap max number of stack frames to 100 to not exceed payload size limit ([#3009](https://github.com/getsentry/sentry-java/pull/3009))
1313
- This will ensure we report errors with a big number of frames such as `StackOverflowError`
1414
- Fix user interaction tracking not working for Jetpack Compose 1.5+ ([#3010](https://github.com/getsentry/sentry-java/pull/3010))
15+
- Make sure to close all Closeable resources ([#3000](https://github.com/getsentry/sentry-java/pull/3000)
1516

1617
## 6.32.0
1718

sentry-android-core/src/main/java/io/sentry/android/core/AnrV2Integration.java

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -292,26 +292,18 @@ private void reportAsSentryEvent(
292292

293293
private @NotNull ParseResult parseThreadDump(
294294
final @NotNull ApplicationExitInfo exitInfo, final boolean isBackground) {
295-
InputStream trace;
296-
try {
297-
trace = exitInfo.getTraceInputStream();
295+
final byte[] dump;
296+
297+
try (final InputStream trace = exitInfo.getTraceInputStream()) {
298298
if (trace == null) {
299299
return new ParseResult(ParseResult.Type.NO_DUMP);
300300
}
301+
dump = getDumpBytes(trace);
301302
} catch (Throwable e) {
302303
options.getLogger().log(SentryLevel.WARNING, "Failed to read ANR thread dump", e);
303304
return new ParseResult(ParseResult.Type.NO_DUMP);
304305
}
305306

306-
byte[] dump = null;
307-
try {
308-
dump = getDumpBytes(trace);
309-
} catch (Throwable e) {
310-
options
311-
.getLogger()
312-
.log(SentryLevel.WARNING, "Failed to convert ANR thread dump to byte array", e);
313-
}
314-
315307
try (final BufferedReader reader =
316308
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(dump)))) {
317309
final Lines lines = Lines.readLines(reader);
@@ -330,16 +322,17 @@ private void reportAsSentryEvent(
330322
}
331323

332324
private byte[] getDumpBytes(final @NotNull InputStream trace) throws IOException {
333-
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
325+
try (final ByteArrayOutputStream buffer = new ByteArrayOutputStream()) {
334326

335-
int nRead;
336-
final byte[] data = new byte[1024];
327+
int nRead;
328+
final byte[] data = new byte[1024];
337329

338-
while ((nRead = trace.read(data, 0, data.length)) != -1) {
339-
buffer.write(data, 0, nRead);
340-
}
330+
while ((nRead = trace.read(data, 0, data.length)) != -1) {
331+
buffer.write(data, 0, nRead);
332+
}
341333

342-
return buffer.toByteArray();
334+
return buffer.toByteArray();
335+
}
343336
}
344337
}
345338

sentry-android-core/src/main/java/io/sentry/android/core/InternalSentrySdk.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.sentry.protocol.User;
2323
import io.sentry.util.MapObjectWriter;
2424
import java.io.ByteArrayInputStream;
25+
import java.io.InputStream;
2526
import java.util.ArrayList;
2627
import java.util.HashMap;
2728
import java.util.List;
@@ -142,10 +143,10 @@ public static SentryId captureEnvelope(final @NotNull byte[] envelopeData) {
142143
final @NotNull IHub hub = HubAdapter.getInstance();
143144
final @NotNull SentryOptions options = hub.getOptions();
144145

145-
try {
146+
try (final InputStream envelopeInputStream = new ByteArrayInputStream(envelopeData)) {
146147
final @NotNull ISerializer serializer = options.getSerializer();
147148
final @Nullable SentryEnvelope envelope =
148-
options.getEnvelopeReader().read(new ByteArrayInputStream(envelopeData));
149+
options.getEnvelopeReader().read(envelopeInputStream);
149150
if (envelope == null) {
150151
return null;
151152
}

sentry-android-core/src/main/java/io/sentry/android/core/internal/modules/AssetsModulesLoader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ public AssetsModulesLoader(final @NotNull Context context, final @NotNull ILogge
2626
protected Map<String, String> loadModules() {
2727
final Map<String, String> modules = new TreeMap<>();
2828

29-
try {
30-
final InputStream stream = context.getAssets().open(EXTERNAL_MODULES_FILENAME);
29+
try (final InputStream stream = context.getAssets().open(EXTERNAL_MODULES_FILENAME)) {
3130
return parseStream(stream);
3231
} catch (FileNotFoundException e) {
3332
logger.log(SentryLevel.INFO, "%s file was not found.", EXTERNAL_MODULES_FILENAME);

sentry-apache-http-client-5/src/main/java/io/sentry/transport/apache/ApacheHttpClientTransport.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,11 @@ public void close() throws IOException {
194194
options.getLogger().log(DEBUG, "Shutting down");
195195
try {
196196
httpclient.awaitShutdown(TimeValue.ofSeconds(1));
197-
httpclient.close(CloseMode.GRACEFUL);
198197
} catch (InterruptedException e) {
199198
options.getLogger().log(DEBUG, "Thread interrupted while closing the connection.");
200199
Thread.currentThread().interrupt();
200+
} finally {
201+
httpclient.close(CloseMode.GRACEFUL);
201202
}
202203
}
203204

sentry/src/main/java/io/sentry/EnvelopeReader.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,16 @@ public EnvelopeReader(@NotNull ISerializer serializer) {
133133
private @Nullable SentryEnvelopeHeader deserializeEnvelopeHeader(
134134
final @NotNull byte[] buffer, int offset, int length) {
135135
String json = new String(buffer, offset, length, UTF_8);
136-
StringReader reader = new StringReader(json);
137-
return serializer.deserialize(reader, SentryEnvelopeHeader.class);
136+
try (StringReader reader = new StringReader(json)) {
137+
return serializer.deserialize(reader, SentryEnvelopeHeader.class);
138+
}
138139
}
139140

140141
private @Nullable SentryEnvelopeItemHeader deserializeEnvelopeItemHeader(
141142
final @NotNull byte[] buffer, int offset, int length) {
142143
String json = new String(buffer, offset, length, UTF_8);
143-
StringReader reader = new StringReader(json);
144-
return serializer.deserialize(reader, SentryEnvelopeItemHeader.class);
144+
try (StringReader reader = new StringReader(json)) {
145+
return serializer.deserialize(reader, SentryEnvelopeItemHeader.class);
146+
}
145147
}
146148
}

sentry/src/main/java/io/sentry/Hub.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.sentry.util.Pair;
1414
import io.sentry.util.TracingUtils;
1515
import java.io.Closeable;
16+
import java.io.IOException;
1617
import java.lang.ref.WeakReference;
1718
import java.util.Collections;
1819
import java.util.List;
@@ -337,7 +338,13 @@ public void close() {
337338
try {
338339
for (Integration integration : options.getIntegrations()) {
339340
if (integration instanceof Closeable) {
340-
((Closeable) integration).close();
341+
try {
342+
((Closeable) integration).close();
343+
} catch (IOException e) {
344+
options
345+
.getLogger()
346+
.log(SentryLevel.WARNING, "Failed to close the integration {}.", integration, e);
347+
}
341348
}
342349
}
343350

sentry/src/main/java/io/sentry/JsonSerializer.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,7 @@ public JsonSerializer(@NotNull SentryOptions options) {
126126
@NotNull Reader reader,
127127
@NotNull Class<T> clazz,
128128
@Nullable JsonDeserializer<R> elementDeserializer) {
129-
try {
130-
JsonObjectReader jsonObjectReader = new JsonObjectReader(reader);
129+
try (JsonObjectReader jsonObjectReader = new JsonObjectReader(reader)) {
131130
if (Collection.class.isAssignableFrom(clazz)) {
132131
if (elementDeserializer == null) {
133132
// if the object has no known deserializer we do best effort and deserialize it as map
@@ -147,8 +146,7 @@ public JsonSerializer(@NotNull SentryOptions options) {
147146
@SuppressWarnings("unchecked")
148147
@Override
149148
public <T> @Nullable T deserialize(@NotNull Reader reader, @NotNull Class<T> clazz) {
150-
try {
151-
JsonObjectReader jsonObjectReader = new JsonObjectReader(reader);
149+
try (JsonObjectReader jsonObjectReader = new JsonObjectReader(reader)) {
152150
JsonDeserializer<?> deserializer = deserializersByClass.get(clazz);
153151
if (deserializer != null) {
154152
Object object = deserializer.deserialize(jsonObjectReader, options.getLogger());

sentry/src/main/java/io/sentry/internal/debugmeta/ResourcesDebugMetaLoader.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,23 @@ public ResourcesDebugMetaLoader(final @NotNull ILogger logger) {
3030

3131
@Override
3232
public @Nullable Properties loadDebugMeta() {
33-
InputStream debugMetaStream = classLoader.getResourceAsStream(DEBUG_META_PROPERTIES_FILENAME);
34-
if (debugMetaStream == null) {
35-
logger.log(SentryLevel.INFO, "%s file was not found.", DEBUG_META_PROPERTIES_FILENAME);
36-
} else {
37-
try (final InputStream is = new BufferedInputStream(debugMetaStream)) {
38-
final Properties properties = new Properties();
39-
properties.load(is);
40-
return properties;
41-
} catch (IOException e) {
42-
logger.log(SentryLevel.ERROR, e, "Failed to load %s", DEBUG_META_PROPERTIES_FILENAME);
43-
} catch (RuntimeException e) {
44-
logger.log(SentryLevel.ERROR, e, "%s file is malformed.", DEBUG_META_PROPERTIES_FILENAME);
33+
try (final InputStream debugMetaStream =
34+
classLoader.getResourceAsStream(DEBUG_META_PROPERTIES_FILENAME)) {
35+
if (debugMetaStream == null) {
36+
logger.log(SentryLevel.INFO, "%s file was not found.", DEBUG_META_PROPERTIES_FILENAME);
37+
} else {
38+
try (final InputStream is = new BufferedInputStream(debugMetaStream)) {
39+
final Properties properties = new Properties();
40+
properties.load(is);
41+
return properties;
42+
} catch (IOException e) {
43+
logger.log(SentryLevel.ERROR, e, "Failed to load %s", DEBUG_META_PROPERTIES_FILENAME);
44+
} catch (RuntimeException e) {
45+
logger.log(SentryLevel.ERROR, e, "%s file is malformed.", DEBUG_META_PROPERTIES_FILENAME);
46+
}
4547
}
48+
} catch (IOException e) {
49+
logger.log(SentryLevel.ERROR, e, "Failed to load %s", DEBUG_META_PROPERTIES_FILENAME);
4650
}
4751

4852
return null;

sentry/src/main/java/io/sentry/internal/modules/ResourcesModulesLoader.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import io.sentry.ILogger;
66
import io.sentry.SentryLevel;
7+
import java.io.IOException;
78
import java.io.InputStream;
89
import java.util.Map;
910
import java.util.TreeMap;
@@ -28,9 +29,8 @@ public ResourcesModulesLoader(final @NotNull ILogger logger) {
2829
@Override
2930
protected Map<String, String> loadModules() {
3031
final Map<String, String> modules = new TreeMap<>();
31-
try {
32-
final InputStream resourcesStream =
33-
classLoader.getResourceAsStream(EXTERNAL_MODULES_FILENAME);
32+
try (final InputStream resourcesStream =
33+
classLoader.getResourceAsStream(EXTERNAL_MODULES_FILENAME)) {
3434

3535
if (resourcesStream == null) {
3636
logger.log(SentryLevel.INFO, "%s file was not found.", EXTERNAL_MODULES_FILENAME);
@@ -40,6 +40,8 @@ protected Map<String, String> loadModules() {
4040
return parseStream(resourcesStream);
4141
} catch (SecurityException e) {
4242
logger.log(SentryLevel.INFO, "Access to resources denied.", e);
43+
} catch (IOException e) {
44+
logger.log(SentryLevel.INFO, "Access to resources failed.", e);
4345
}
4446
return modules;
4547
}

0 commit comments

Comments
 (0)