From 07fa1c7530060a44d8b5cbe4bea39ba2b330a486 Mon Sep 17 00:00:00 2001 From: Vincent Welbourne Date: Tue, 6 Jan 2026 04:31:00 -0500 Subject: [PATCH] Fix stream leak (#8205) --- .../screen/about/DevelopersFragment.java | 19 ++++++---- .../screen/about/LicensesFragment.java | 37 ++++++++++--------- .../screen/about/SpecialThanksFragment.java | 17 +++++---- .../screen/about/TranslatorsFragment.java | 18 +++++---- 4 files changed, 50 insertions(+), 41 deletions(-) diff --git a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/DevelopersFragment.java b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/DevelopersFragment.java index 269981518..96fda46bb 100644 --- a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/DevelopersFragment.java +++ b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/DevelopersFragment.java @@ -30,15 +30,18 @@ public class DevelopersFragment extends ListFragment { developersLoader = Single.create((SingleOnSubscribe>) emitter -> { developers.clear(); - BufferedReader reader = new BufferedReader(new InputStreamReader( - getContext().getAssets().open("developers.csv"), "UTF-8")); - String line; - while ((line = reader.readLine()) != null) { - String[] info = line.split(";"); - developers.add(new SimpleIconListAdapter.ListItem(info[0], info[2], - "https://avatars2.githubusercontent.com/u/" + info[1] + "?s=60&v=4")); + try (BufferedReader reader = new BufferedReader(new InputStreamReader( + getContext().getAssets().open("developers.csv"), "UTF-8"))) { + String line; + while ((line = reader.readLine()) != null) { + String[] info = line.split(";"); + developers.add(new SimpleIconListAdapter.ListItem(info[0], info[2], + "https://avatars2.githubusercontent.com/u/" + info[1] + "?s=60&v=4")); + } + emitter.onSuccess(developers); + } catch (Exception e) { + emitter.onError(e); } - emitter.onSuccess(developers); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/LicensesFragment.java b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/LicensesFragment.java index 0a2c6d236..8de39069b 100644 --- a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/LicensesFragment.java +++ b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/LicensesFragment.java @@ -46,21 +46,24 @@ public class LicensesFragment extends ListFragment { licensesLoader = Single.create((SingleOnSubscribe>) emitter -> { licenses.clear(); - InputStream stream = getContext().getAssets().open("licenses.xml"); - DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - NodeList libraryList = docBuilder.parse(stream).getElementsByTagName("library"); - for (int i = 0; i < libraryList.getLength(); i++) { - NamedNodeMap lib = libraryList.item(i).getAttributes(); - licenses.add(new LicenseItem( - lib.getNamedItem("name").getTextContent(), - String.format("By %s, %s license", - lib.getNamedItem("author").getTextContent(), - lib.getNamedItem("license").getTextContent()), - null, - lib.getNamedItem("website").getTextContent(), - lib.getNamedItem("licenseText").getTextContent())); + try (InputStream stream = getContext().getAssets().open("licenses.xml")) { + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + NodeList libraryList = docBuilder.parse(stream).getElementsByTagName("library"); + for (int i = 0; i < libraryList.getLength(); i++) { + NamedNodeMap lib = libraryList.item(i).getAttributes(); + licenses.add(new LicenseItem( + lib.getNamedItem("name").getTextContent(), + String.format("By %s, %s license", + lib.getNamedItem("author").getTextContent(), + lib.getNamedItem("license").getTextContent()), + null, + lib.getNamedItem("website").getTextContent(), + lib.getNamedItem("licenseText").getTextContent())); + } + emitter.onSuccess(licenses); + } catch (Exception e) { + emitter.onError(e); } - emitter.onSuccess(licenses); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -68,7 +71,6 @@ public class LicensesFragment extends ListFragment { developers -> setListAdapter(new SimpleIconListAdapter(getContext(), developers)), error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show() ); - } private static class LicenseItem extends SimpleIconListAdapter.ListItem { @@ -100,9 +102,8 @@ public class LicensesFragment extends ListFragment { } private void showLicenseText(String licenseTextFile) { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader( - getContext().getAssets().open(licenseTextFile), "UTF-8")); + try (BufferedReader reader = new BufferedReader(new InputStreamReader( + getContext().getAssets().open(licenseTextFile), "UTF-8"))) { StringBuilder licenseText = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { diff --git a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/SpecialThanksFragment.java b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/SpecialThanksFragment.java index 07b524fe1..bced36b79 100644 --- a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/SpecialThanksFragment.java +++ b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/SpecialThanksFragment.java @@ -31,14 +31,17 @@ public class SpecialThanksFragment extends ListFragment { translatorsLoader = Single.create((SingleOnSubscribe>) emitter -> { specialMembers.clear(); - BufferedReader reader = new BufferedReader(new InputStreamReader( - getContext().getAssets().open("special_thanks.csv"), "UTF-8")); - String line; - while ((line = reader.readLine()) != null) { - String[] info = line.split(";"); - specialMembers.add(new SpecialMemberItem(info[0], info[1], info[2], info[3])); + try (BufferedReader reader = new BufferedReader(new InputStreamReader( + getContext().getAssets().open("special_thanks.csv"), "UTF-8"))) { + String line; + while ((line = reader.readLine()) != null) { + String[] info = line.split(";"); + specialMembers.add(new SpecialMemberItem(info[0], info[1], info[2], info[3])); + } + emitter.onSuccess(specialMembers); + } catch (Exception e) { + emitter.onError(e); } - emitter.onSuccess(specialMembers); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/TranslatorsFragment.java b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/TranslatorsFragment.java index 5528e0294..d906a8d54 100644 --- a/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/TranslatorsFragment.java +++ b/ui/preferences/src/main/java/de/danoeh/antennapod/ui/preferences/screen/about/TranslatorsFragment.java @@ -27,14 +27,17 @@ public class TranslatorsFragment extends ListFragment { translatorsLoader = Single.create((SingleOnSubscribe>) emitter -> { ArrayList translators = new ArrayList<>(); - BufferedReader reader = new BufferedReader(new InputStreamReader( - getContext().getAssets().open("translators.csv"), "UTF-8")); - String line; - while ((line = reader.readLine()) != null) { - String[] info = line.split(";"); - translators.add(new SimpleIconListAdapter.ListItem(info[0], info[1], null)); + try (BufferedReader reader = new BufferedReader(new InputStreamReader( + getContext().getAssets().open("translators.csv"), "UTF-8"))) { + String line; + while ((line = reader.readLine()) != null) { + String[] info = line.split(";"); + translators.add(new SimpleIconListAdapter.ListItem(info[0], info[1], null)); + } + emitter.onSuccess(translators); + } catch (Exception e) { + emitter.onError(e); } - emitter.onSuccess(translators); }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -42,7 +45,6 @@ public class TranslatorsFragment extends ListFragment { translators -> setListAdapter(new SimpleIconListAdapter<>(getContext(), translators)), error -> Toast.makeText(getContext(), error.getMessage(), Toast.LENGTH_LONG).show() ); - } @Override