This is an automated email from the ASF dual-hosted git repository.

Gargi-jais11 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new b8bc13d9a7e HDDS-16336. S3 GET inverted Range with start inside object 
yields negative Content-Length (#11160).
b8bc13d9a7e is described below

commit b8bc13d9a7e63f4cb3e8d9bb631b372eefcbb64a
Author: Mark Tsai <[email protected]>
AuthorDate: Tue Sep 8 16:53:26 2026 +0800

    HDDS-16336. S3 GET inverted Range with start inside object yields negative 
Content-Length (#11160).
---
 .../ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java      | 19 +++++++++++++++++++
 .../hadoop/ozone/s3/util/RangeHeaderParserUtil.java   |  6 +++++-
 .../ozone/s3/util/TestRangeHeaderParserUtil.java      |  7 +++++++
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git 
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
 
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
index f56676d37f6..c9f7276da51 100644
--- 
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
+++ 
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
@@ -22,6 +22,7 @@
 import static org.apache.hadoop.ozone.s3.awssdk.S3SDKTestUtils.createFile;
 import static org.apache.hadoop.ozone.s3.util.S3Utils.stripQuotes;
 import static org.apache.http.HttpStatus.SC_BAD_REQUEST;
+import static org.apache.http.HttpStatus.SC_OK;
 import static org.apache.http.HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -1629,6 +1630,24 @@ public void testUploadPartCopyInvalidRange() {
     }
   }
 
+  @Test
+  public void testGetObjectInvertedRange() {
+    final String bucketName = getBucketName();
+    final String keyName = getKeyName();
+    final String content = "0123456789";
+    s3Client.createBucket(b -> b.bucket(bucketName));
+    s3Client.putObject(b -> b.bucket(bucketName).key(keyName), 
RequestBody.fromString(content));
+
+    // An inverted range is ignored and the whole object is returned, matching 
AWS GetObject.
+    ResponseBytes<GetObjectResponse> response = s3Client.getObjectAsBytes(
+        b -> b.bucket(bucketName).key(keyName).range("bytes=8-3"));
+
+    assertEquals(SC_OK, response.response().sdkHttpResponse().statusCode());
+    assertEquals(content, response.asUtf8String());
+    assertEquals(Long.valueOf(content.length()), 
response.response().contentLength());
+    assertNull(response.response().contentRange());
+  }
+
   @Test
   public void testLowLevelMultipartUpload(@TempDir Path tempDir) throws 
Exception {
     final String bucketName = getBucketName();
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
index 92a0d71983b..ae3c5360ba5 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/RangeHeaderParserUtil.java
@@ -75,7 +75,11 @@ public static RangeHeader parseRangeHeader(String 
rangeHeaderVal, long
             end = length - 1;
           }
         } else {
-          if (end >= length) {
+          if (start > end) {
+            readFull = true;
+            start = 0;
+            end = length - 1;
+          } else if (end >= length) {
             end = length - 1;
           }
         }
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
index 82fee27d3e1..c9085119fb9 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestRangeHeaderParserUtil.java
@@ -61,6 +61,13 @@ public void testRangeHeaderParser() {
     assertTrue(rangeHeader.isReadFull());
     assertFalse(rangeHeader.isInValidRange());
 
+    // inverted range, start is still inside the object
+    rangeHeader = RangeHeaderParserUtil.parseRangeHeader("bytes=8-3", 10);
+    assertEquals(0, rangeHeader.getStartOffset());
+    assertEquals(9, rangeHeader.getEndOffset());
+    assertTrue(rangeHeader.isReadFull());
+    assertFalse(rangeHeader.isInValidRange());
+
     // bytes spec is wrong
     rangeHeader = RangeHeaderParserUtil.parseRangeHeader("mb=11-8", 10);
     assertEquals(0, rangeHeader.getStartOffset());


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to