You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2015/11/04 11:28:06 UTC

[03/16] ignite git commit: IGNITE-1282: Fixed JVM crash in portable builder caused by incorrect position calculation.

IGNITE-1282: Fixed JVM crash in portable builder caused by incorrect position calculation.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/178e9139
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/178e9139
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/178e9139

Branch: refs/heads/ignite-950-new
Commit: 178e91390e58786791bbd12c6a2f460ae240fa73
Parents: 7e399e8
Author: thatcoach <pp...@list.ru>
Authored: Wed Nov 4 10:03:27 2015 +0300
Committer: thatcoach <pp...@list.ru>
Committed: Wed Nov 4 10:03:27 2015 +0300

----------------------------------------------------------------------
 .../portable/builder/PortableBuilderImpl.java   | 32 +++++++++++---------
 .../IgnitePortableObjectsTestSuite.java         |  5 ++-
 2 files changed, 20 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/178e9139/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
index 608425d..a28a908 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/builder/PortableBuilderImpl.java
@@ -245,27 +245,28 @@ public class PortableBuilderImpl implements PortableBuilder {
                     int fieldId = reader.readIntPositioned(footerPos);
                     int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldOffsetSize).get2();
 
+                    int postLen = reader.position() + fieldLen; // Position where reader will be placed afterwards.
+
                     footerPos += 4 + fieldOffsetSize;
 
                     if (assignedFldsById.containsKey(fieldId)) {
                         Object assignedVal = assignedFldsById.remove(fieldId);
 
-                        reader.skip(fieldLen);
-
                         if (assignedVal != REMOVED_FIELD_MARKER) {
                             writer.writeFieldId(fieldId);
 
                             serializer.writeValue(writer, assignedVal);
                         }
-                    } else {
+                    }
+                    else {
                         int type = fieldLen != 0 ? reader.readByte(0) : 0;
 
                         if (fieldLen != 0 && !PortableUtils.isPlainArrayType(type) && PortableUtils.isPlainType(type)) {
                             writer.writeFieldId(fieldId);
-                            writer.write(reader.array(), reader.position(), fieldLen);
 
-                            reader.skip(fieldLen);
-                        } else {
+                            writer.write(reader.array(), reader.position(), fieldLen);
+                        }
+                        else {
                             writer.writeFieldId(fieldId);
 
                             Object val;
@@ -273,20 +274,18 @@ public class PortableBuilderImpl implements PortableBuilder {
                             if (fieldLen == 0)
                                 val = null;
                             else if (readCache == null) {
-                                int savedPos = reader.position();
-
                                 val = reader.parseValue();
 
-                                assert reader.position() == savedPos + fieldLen;
-                            } else {
-                                val = readCache.get(fieldId);
-
-                                reader.skip(fieldLen);
+                                assert reader.position() == postLen;
                             }
+                            else
+                                val = readCache.get(fieldId);
 
                             serializer.writeValue(writer, val);
                         }
                     }
+
+                    reader.position(postLen);
                 }
             }
 
@@ -411,15 +410,20 @@ public class PortableBuilderImpl implements PortableBuilder {
         // Get field length.
         int fieldLen;
 
-        if (footerPos + 4 + fieldOffsetSize == footerEnd)
+        if (footerPos + 4 + fieldOffsetSize == footerEnd) {
             // This is the last field, compare to raw offset.
             fieldLen = rawPos - fieldPos;
+
+            fieldLen = fieldLen * 1;
+        }
         else {
             // Field is somewhere in the middle, get difference with the next offset.
             int nextFieldOffset = PortableUtils.fieldOffsetRelative(reader, footerPos + 4 + fieldOffsetSize + 4,
                 fieldOffsetSize);
 
             fieldLen = nextFieldOffset - fieldOffset;
+
+            fieldLen = fieldLen * 1;
         }
 
         return F.t(fieldPos, fieldLen);

http://git-wip-us.apache.org/repos/asf/ignite/blob/178e9139/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePortableObjectsTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePortableObjectsTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePortableObjectsTestSuite.java
index 3cfd530..6d8e12d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePortableObjectsTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePortableObjectsTestSuite.java
@@ -28,7 +28,6 @@ import org.apache.ignite.internal.portable.GridPortableMarshallerSelfTest;
 import org.apache.ignite.internal.portable.GridPortableMetaDataDisabledSelfTest;
 import org.apache.ignite.internal.portable.GridPortableMetaDataSelfTest;
 import org.apache.ignite.internal.portable.GridPortableWildcardsSelfTest;
-import org.apache.ignite.internal.portable.PortableCompactOffsetsAbstractSelfTest;
 import org.apache.ignite.internal.portable.PortableCompactOffsetsHeapSelfTest;
 import org.apache.ignite.internal.portable.PortableCompactOffsetsOffheapSelfTest;
 import org.apache.ignite.internal.portable.PortableFieldsHeapSelfTest;
@@ -65,6 +64,8 @@ public class IgnitePortableObjectsTestSuite extends TestSuite {
         suite.addTestSuite(GridPortableMarshallerCtxDisabledSelfTest.class);
         suite.addTestSuite(GridPortableBuilderSelfTest.class);
         suite.addTestSuite(GridPortableBuilderStringAsCharsSelfTest.class);
+        suite.addTestSuite(GridPortableBuilderAdditionalSelfTest.class);
+        suite.addTestSuite(GridPortableBuilderStringAsCharsAdditionalSelfTest.class);
         suite.addTestSuite(PortableFieldsHeapSelfTest.class);
         suite.addTestSuite(PortableFieldsOffheapSelfTest.class);
         suite.addTestSuite(PortableCompactOffsetsHeapSelfTest.class);
@@ -73,8 +74,6 @@ public class IgnitePortableObjectsTestSuite extends TestSuite {
         suite.addTestSuite(GridPortableMetaDataDisabledSelfTest.class);
         suite.addTestSuite(GridPortableAffinityKeySelfTest.class);
         suite.addTestSuite(GridPortableWildcardsSelfTest.class);
-        suite.addTestSuite(GridPortableBuilderAdditionalSelfTest.class);
-        suite.addTestSuite(GridPortableBuilderStringAsCharsAdditionalSelfTest.class);
 
         suite.addTestSuite(GridCachePortableObjectsLocalSelfTest.class);
         suite.addTestSuite(GridCachePortableObjectsAtomicLocalSelfTest.class);