diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index d44231436..52a8b5441 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -417,13 +417,29 @@ public final class Utils { byte[] mdbytes = md.digest(); return toHexString(mdbytes).toLowerCase(Locale.ENGLISH); - } catch (IOException | NoSuchAlgorithmException e) { + } catch (IOException e) { + // The annoyance (potentially) caused by miscellaneous filesystem corruption results in + // F-Droid constantly popping up crash reports when F-Droid isn't even open. As such this + // exception-message-parsing-and-throwing-a-new-ignorable-exception-hackery is probably + // warranted. See https://www.gitlab.com/fdroid/fdroidclient/issues/855 for more detail. + if (e.getMessage().contains("read failed: EIO (I/O error)")) { + throw new PotentialFilesystemCorruptionException(e); + } + + throw new IllegalArgumentException(e); + } catch (NoSuchAlgorithmException e) { throw new IllegalArgumentException(e); } finally { closeQuietly(fis); } } + public static class PotentialFilesystemCorruptionException extends IllegalArgumentException { + public PotentialFilesystemCorruptionException(IOException e) { + super(e); + } + } + /** * Computes the base 16 representation of the byte array argument. * diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java index 6dcc83e33..54bf64d6f 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -249,6 +249,13 @@ public class InstalledAppProviderService extends IntentService { } insertAppIntoDb(this, packageInfo, hashType, hash); + } catch (Utils.PotentialFilesystemCorruptionException e) { + Log.e(TAG, "Encountered potential filesystem corruption, or other unknown " + + "problem when calculating hash of " + apk.getAbsolutePath() + ". " + + "It is unlikely F-Droid can do anything about this, and this " + + "likely happened in the background. As such, we will continue without " + + "interrupting the user by asking them to send a crash report."); + return; } catch (IllegalArgumentException e) { Utils.debugLog(TAG, e.getMessage()); ACRA.getErrorReporter().handleException(e, false);