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

terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 0ea09c91754 Fix firebird accept data padding (#40188)
0ea09c91754 is described below

commit 0ea09c91754a7358eb8748dcdc69194e49083e74
Author: Maxim Igoshin <[email protected]>
AuthorDate: Sun Oct 18 07:04:15 2026 +0300

    Fix firebird accept data padding (#40188)
    
    * Pad the SRP data of Firebird op_accept_data to XDR alignment
    
    * Add FirebirdPacketPayload#writePadding and use it for op_accept_data
    
    * Use FirebirdPacketPayload#writePadding for the XDR padding of Firebird 
packets
    
    * Fix CODE_OF_CONDUCT violations in Firebird padding writes
    
    * Fix CODE_OF_CONDUCT violations in Firebird accept data packet tests
---
 .../packet/generic/FirebirdFetchResponsePacket.java       |  2 +-
 .../packet/generic/FirebirdGenericResponsePacket.java     |  2 +-
 .../packet/handshake/FirebirdAcceptDataPacket.java        |  4 +++-
 .../protocol/firebird/payload/FirebirdPacketPayload.java  | 15 +++++++++++++--
 .../packet/generic/FirebirdFetchResponsePacketTest.java   |  6 +++---
 .../packet/generic/FirebirdGenericResponsePacketTest.java |  1 +
 .../packet/generic/FirebirdSQLResponsePacketTest.java     |  4 ++--
 .../packet/handshake/FirebirdAcceptDataPacketTest.java    |  6 ++++--
 .../firebird/payload/FirebirdPacketPayloadTest.java       | 10 ++++++++--
 9 files changed, 36 insertions(+), 14 deletions(-)

diff --git 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacket.java
 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacket.java
index 7be84208e68..fd986f6868d 100644
--- 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacket.java
+++ 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacket.java
@@ -55,8 +55,8 @@ public final class FirebirdFetchResponsePacket extends 
FirebirdPacket {
         }
         int nullBitsStartIndex = payload.getByteBuf().writerIndex();
         int nullBits = (row.getCells().size() + 7) / 8;
-        nullBits += (4 - nullBits) & 3;
         payload.getByteBuf().writeZero(nullBits);
+        payload.writePadding(nullBits);
         int i = 0;
         for (BinaryCell cell : row.getCells()) {
             if (null != cell.getData()) {
diff --git 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacket.java
 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacket.java
index 612c5c0d4fc..f61c2f33629 100644
--- 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacket.java
+++ 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacket.java
@@ -147,7 +147,7 @@ public final class FirebirdGenericResponsePacket extends 
FirebirdPacket {
             data.write(payload);
             int length = payload.getByteBuf().readableBytes() - index;
             payload.getByteBuf().setInt(index - 4, length);
-            payload.getByteBuf().writeBytes(new byte[(4 - length) & 3]);
+            payload.writePadding(length);
         } else {
             payload.writeInt4(0);
         }
diff --git 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacket.java
 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacket.java
index cce3b04b569..d7f9c857e25 100644
--- 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacket.java
+++ 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacket.java
@@ -45,11 +45,13 @@ public final class FirebirdAcceptDataPacket extends 
FirebirdPacket {
     @Override
     protected void write(final FirebirdPacketPayload payload) {
         if (salt.length != 0 && !publicKey.isEmpty()) {
-            payload.writeInt4(salt.length + publicKey.length() + 4);
+            int length = salt.length + publicKey.length() + 4;
+            payload.writeInt4(length);
             payload.writeInt2LE(salt.length);
             payload.writeBytes(salt);
             payload.writeInt2LE(publicKey.length());
             payload.writeBytes(publicKey.getBytes(StandardCharsets.US_ASCII));
+            payload.writePadding(length);
         } else {
             payload.writeInt4(0);
         }
diff --git 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayload.java
 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayload.java
index 2cc913b3f9d..33ad1d2826e 100644
--- 
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayload.java
+++ 
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayload.java
@@ -22,6 +22,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.Setter;
 import org.apache.shardingsphere.database.protocol.payload.PacketPayload;
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 
 import java.nio.charset.Charset;
 
@@ -209,7 +210,7 @@ public final class FirebirdPacketPayload implements 
PacketPayload {
     public void writeBuffer(final byte[] value) {
         byteBuf.writeInt(value.length);
         byteBuf.writeBytes(value);
-        byteBuf.writeBytes(new byte[(4 - value.length) & 3]);
+        writePadding(value.length);
     }
     
     /**
@@ -220,7 +221,7 @@ public final class FirebirdPacketPayload implements 
PacketPayload {
     public void writeBuffer(final ByteBuf buffer) {
         byteBuf.writeInt(buffer.writerIndex());
         byteBuf.writeBytes(buffer);
-        byteBuf.writeBytes(new byte[(4 - buffer.writerIndex()) & 3]);
+        writePadding(buffer.writerIndex());
     }
     
     /**
@@ -259,6 +260,16 @@ public final class FirebirdPacketPayload implements 
PacketPayload {
         byteBuf.skipBytes(getPadding(length));
     }
     
+    /**
+     * Write padding to byte buffers.
+     *
+     * @param length length of byte array that needs padding
+     */
+    @HighFrequencyInvocation
+    public void writePadding(final int length) {
+        byteBuf.writeZero(getPadding(length));
+    }
+    
     /**
      * Get padding from byte buffers.
      *
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacketTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacketTest.java
index e8a372e68e5..cb159d404e3 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacketTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdFetchResponsePacketTest.java
@@ -85,7 +85,6 @@ class FirebirdFetchResponsePacketTest {
     void assertWriteWithNonNullCellData() {
         when(payload.getByteBuf()).thenReturn(byteBuf);
         when(byteBuf.writerIndex()).thenReturn(0);
-        when(byteBuf.writeZero(4)).thenReturn(byteBuf);
         BinaryRow row = new BinaryRow(Collections.singleton(new 
BinaryCell(FirebirdBinaryColumnType.LONG, 123)));
         try (MockedStatic<FirebirdBinaryProtocolValueFactory> mocked = 
mockStatic(FirebirdBinaryProtocolValueFactory.class)) {
             mocked.when(() -> 
FirebirdBinaryProtocolValueFactory.getBinaryProtocolValue(FirebirdBinaryColumnType.LONG)).thenReturn(protocolValue);
@@ -93,7 +92,8 @@ class FirebirdFetchResponsePacketTest {
             
verify(payload).writeInt4(FirebirdCommandPacketType.FETCH_RESPONSE.getValue());
             verify(payload).writeInt4(ISCConstants.FETCH_OK);
             verify(payload).writeInt4(1);
-            verify(byteBuf).writeZero(4);
+            verify(byteBuf).writeZero(1);
+            verify(payload).writePadding(1);
             verify(protocolValue).write(payload, 123);
         }
     }
@@ -114,11 +114,11 @@ class FirebirdFetchResponsePacketTest {
     void assertWriteWithNullCellData() {
         when(payload.getByteBuf()).thenReturn(byteBuf);
         when(byteBuf.writerIndex()).thenReturn(0);
-        when(byteBuf.writeZero(4)).thenReturn(byteBuf);
         when(byteBuf.getByte(0)).thenReturn((byte) 0);
         FirebirdFetchResponsePacket.getFetchRowPacket(new 
BinaryRow(Collections.singleton(new BinaryCell(FirebirdBinaryColumnType.LONG, 
null)))).write(payload);
         
verify(payload).writeInt4(FirebirdCommandPacketType.FETCH_RESPONSE.getValue());
         verify(payload).writeInt4(ISCConstants.FETCH_OK);
+        verify(payload).writePadding(1);
         verify(byteBuf).setByte(0, 1);
     }
     
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacketTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacketTest.java
index fd82b9aa490..30dbcd81ecc 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacketTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdGenericResponsePacketTest.java
@@ -133,6 +133,7 @@ class FirebirdGenericResponsePacketTest {
         FirebirdPacket data = mock(FirebirdPacket.class);
         new 
FirebirdGenericResponsePacket().setData(data).setHandle(1).setId(2L).setErrorStatusVector(ex).write(payload);
         verify(data).write(payload);
+        verify(payload).writePadding(4);
         verify(payload, atLeastOnce()).writeInt4(ISCConstants.isc_arg_gds);
         verify(payload, atLeastOnce()).writeInt4(ISCConstants.isc_arg_string);
         verify(payload).writeString("foo_error");
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdSQLResponsePacketTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdSQLResponsePacketTest.java
index 6ff0352b6b5..7c916f848db 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdSQLResponsePacketTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/generic/FirebirdSQLResponsePacketTest.java
@@ -54,7 +54,6 @@ class FirebirdSQLResponsePacketTest {
     void assertWriteWithRow() {
         when(payload.getByteBuf()).thenReturn(byteBuf);
         when(byteBuf.writerIndex()).thenReturn(0);
-        when(byteBuf.writeZero(4)).thenReturn(byteBuf);
         BinaryRow row = new BinaryRow(Collections.singleton(new 
BinaryCell(FirebirdBinaryColumnType.LONG, 5)));
         try (MockedStatic<FirebirdBinaryProtocolValueFactory> mocked = 
mockStatic(FirebirdBinaryProtocolValueFactory.class)) {
             mocked.when(() -> 
FirebirdBinaryProtocolValueFactory.getBinaryProtocolValue(FirebirdBinaryColumnType.LONG)).thenReturn(protocolValue);
@@ -62,7 +61,8 @@ class FirebirdSQLResponsePacketTest {
             packet.write(payload);
             
verify(payload).writeInt4(FirebirdCommandPacketType.SQL_RESPONSE.getValue());
             verify(payload).writeInt4(1);
-            verify(byteBuf).writeZero(4);
+            verify(byteBuf).writeZero(1);
+            verify(payload).writePadding(1);
             verify(protocolValue).write(payload, 5);
         }
     }
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacketTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacketTest.java
index c9357a317d9..1a09473eca9 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacketTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/handshake/FirebirdAcceptDataPacketTest.java
@@ -47,14 +47,15 @@ class FirebirdAcceptDataPacketTest {
         packet.write((PacketPayload) payload);
         InOrder order = inOrder(payload);
         order.verify(payload).writeInt4(expectedPayloadLength);
-        verifyPayloadData(order, payload, expectedPayloadData, salt, 
publicKey);
+        verifyPayloadData(order, payload, salt, publicKey, 
expectedPayloadLength, expectedPayloadData);
         order.verify(payload).writeString(plugin.getMethodName());
         order.verify(payload).writeInt4(authenticated);
         order.verify(payload).writeString(keys);
         order.verifyNoMoreInteractions();
     }
     
-    private void verifyPayloadData(final InOrder order, final 
FirebirdPacketPayload payload, final boolean expectedPayloadData, final byte[] 
salt, final String publicKey) {
+    private void verifyPayloadData(final InOrder order, final 
FirebirdPacketPayload payload, final byte[] salt, final String publicKey, final 
int expectedPayloadLength,
+                                   final boolean expectedPayloadData) {
         if (!expectedPayloadData) {
             return;
         }
@@ -62,6 +63,7 @@ class FirebirdAcceptDataPacketTest {
         order.verify(payload).writeBytes(salt);
         order.verify(payload).writeInt2LE(publicKey.length());
         
order.verify(payload).writeBytes(publicKey.getBytes(StandardCharsets.US_ASCII));
+        order.verify(payload).writePadding(expectedPayloadLength);
     }
     
     private static Stream<Arguments> writeArguments() {
diff --git 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayloadTest.java
 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayloadTest.java
index aab7b1c6977..b6047c69c49 100644
--- 
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayloadTest.java
+++ 
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/payload/FirebirdPacketPayloadTest.java
@@ -148,7 +148,7 @@ class FirebirdPacketPayloadTest {
         new FirebirdPacketPayload(byteBuf, 
StandardCharsets.UTF_8).writeBuffer(value);
         verify(byteBuf).writeInt(4);
         verify(byteBuf).writeBytes(value);
-        verify(byteBuf).writeBytes(new byte[0]);
+        verify(byteBuf).writeZero(0);
     }
     
     @Test
@@ -165,7 +165,7 @@ class FirebirdPacketPayloadTest {
         new FirebirdPacketPayload(byteBuf, 
StandardCharsets.UTF_8).writeString("value");
         verify(byteBuf).writeInt(5);
         verify(byteBuf).writeBytes("value".getBytes(StandardCharsets.UTF_8));
-        verify(byteBuf).writeBytes(new byte[3]);
+        verify(byteBuf).writeZero(3);
     }
     
     @Test
@@ -180,6 +180,12 @@ class FirebirdPacketPayloadTest {
         verify(byteBuf).skipBytes(3);
     }
     
+    @Test
+    void assertWritePadding() {
+        new FirebirdPacketPayload(byteBuf, 
StandardCharsets.UTF_8).writePadding(5);
+        verify(byteBuf).writeZero(3);
+    }
+    
     @Test
     void assertGetPadding() {
         assertThat(new FirebirdPacketPayload(byteBuf, 
StandardCharsets.UTF_8).getPadding(5), is(3));

Reply via email to