From 701c5988c37deadc1b47368b90ef64d449c17e78 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 30 Sep 2026 13:21:17 +0200 Subject: [PATCH] guard against misconfigured servers (e.g. max_size = 10 bytes) producing endless tiny chunks Signed-off-by: alperozturk96 --- .../files/ChunkedFileUploadRemoteOperation.kt | 2 +- .../ChunkedFileUploadRemoteOperationTest.kt | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperation.kt index 3c3eb382d..65ac767a4 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperation.kt @@ -324,7 +324,7 @@ class ChunkedFileUploadRemoteOperation return if (onWifiConnection) DEFAULT_CHUNK_SIZE else MIN_CHUNK_SIZE } - return serverMaxChunkSize + return serverMaxChunkSize.coerceAtLeast(MIN_CHUNK_SIZE) } private const val ASSEMBLED_FILE_SUFFIX = "/.file" diff --git a/library/src/test/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperationTest.kt b/library/src/test/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperationTest.kt index e650f101b..0604799bf 100644 --- a/library/src/test/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperationTest.kt +++ b/library/src/test/java/com/owncloud/android/lib/resources/files/ChunkedFileUploadRemoteOperationTest.kt @@ -115,6 +115,26 @@ class ChunkedFileUploadRemoteOperationTest { assertEquals(chunk1.hashCode(), chunk2.hashCode()) } + @Test + fun testChunkSize() { + val min = ChunkedFileUploadRemoteOperation.MIN_CHUNK_SIZE + val default = ChunkedFileUploadRemoteOperation.DEFAULT_CHUNK_SIZE + val unknown = ChunkedFileUploadRemoteOperation.SERVER_MAX_CHUNK_SIZE_UNKNOWN + + // unknown server value falls back to defaults + assertEquals(default, ChunkedFileUploadRemoteOperation.chunkSize(true, unknown)) + assertEquals(min, ChunkedFileUploadRemoteOperation.chunkSize(false, unknown)) + assertEquals(default, ChunkedFileUploadRemoteOperation.chunkSize(true, 0)) + + // misconfigured tiny server value is clamped to the minimum + assertEquals(min, ChunkedFileUploadRemoteOperation.chunkSize(true, 10)) + assertEquals(min, ChunkedFileUploadRemoteOperation.chunkSize(false, min - 1)) + + // sane server values are used as-is + assertEquals(min, ChunkedFileUploadRemoteOperation.chunkSize(true, min)) + assertEquals(100 * MB, ChunkedFileUploadRemoteOperation.chunkSize(false, 100 * MB)) + } + @Test fun testChunking() { listOf(1 * MB, 10 * MB, 100 * MB, 1 * GB).forEach { length ->