From 5648fd2e91e73e5097b87235b09eb883f38dba74 Mon Sep 17 00:00:00 2001 From: Clark Date: Tue, 25 Jul 2023 11:31:21 -0400 Subject: [PATCH] Fix avatar provider buffer underflow. --- .../securesms/providers/AvatarProvider.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt index 6f2771940e..b7e0e5ea7e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt @@ -195,8 +195,10 @@ class AvatarProvider : BaseContentProvider() { } val memoryFile = MemoryFile("${recipient.id}-imf", outputStream.size()) - StreamUtil.copy(ByteArrayInputStream(outputStream.toByteArray()), memoryFile.outputStream) - StreamUtil.close(memoryFile.outputStream) + + val memoryFileOutputStream = memoryFile.outputStream + StreamUtil.copy(ByteArrayInputStream(outputStream.toByteArray()), memoryFileOutputStream) + StreamUtil.close(memoryFileOutputStream) return MemoryFileUtil.getParcelFileDescriptor(memoryFile) } @@ -217,8 +219,8 @@ class AvatarProvider : BaseContentProvider() { override fun onRead(offset: Long, size: Int, data: ByteArray?): Int { ensureResourceLoaded() - - return memoryFile!!.readBytes(data, offset.toInt(), 0, size) + val memoryFileSnapshot = memoryFile + return memoryFileSnapshot!!.readBytes(data, offset.toInt(), 0, size.coerceAtMost((memoryFileSnapshot.length() - offset).toInt())) } override fun onRelease() { @@ -240,8 +242,10 @@ class AvatarProvider : BaseContentProvider() { Log.i(TAG, "Writing ${recipient.id} icon to MemoryFile") memoryFile = MemoryFile("${recipient.id}-imf", outputStream.size()) - StreamUtil.copy(ByteArrayInputStream(outputStream.toByteArray()), memoryFile!!.outputStream) - StreamUtil.close(memoryFile!!.outputStream) + + val memoryFileOutputStream = memoryFile!!.outputStream + StreamUtil.copy(ByteArrayInputStream(outputStream.toByteArray()), memoryFileOutputStream) + StreamUtil.close(memoryFileOutputStream) } } }