Author: rfm
Date: Thu Nov 10 11:23:14 2016
New Revision: 40208

URL: http://svn.gna.org/viewcvs/gnustep?rev=40208&view=rev
Log:
Fix for error decoding archives made on machine with different word size

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/NSPortCoder.m
    libs/base/trunk/Source/NSUnarchiver.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=40208&r1=40207&r2=40208&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Thu Nov 10 11:23:14 2016
@@ -1,3 +1,11 @@
+2016-11-10  Richard Frith-Macdonald <r...@gnu.org>
+
+       * Source/NSPortCoder.m:
+       * Source/NSUnarchiver.m:
+       Fix for logic error decoding archives created by a machine with a
+       different word size.  Was checking the size of the encoded scalar
+       item, but not against the *local* size of the same type.
+
 2016-11-08  Richard Frith-Macdonald <r...@gnu.org>
 
        * Source/NSObject.m: Fix error in last mod ... was calculating opbject

Modified: libs/base/trunk/Source/NSPortCoder.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSPortCoder.m?rev=40208&r1=40207&r2=40208&view=diff
==============================================================================
--- libs/base/trunk/Source/NSPortCoder.m        (original)
+++ libs/base/trunk/Source/NSPortCoder.m        Thu Nov 10 11:23:14 2016
@@ -578,6 +578,26 @@
   return [_comp objectAtIndex: pos];
 }
 
+static inline int
+scalarSize(char type)
+{
+  switch (type)
+    {
+      case _C_SHT:
+      case _C_USHT:     return _GSC_S_SHT;
+      case _C_INT:
+      case _C_UINT:    return _GSC_S_INT;
+      case _C_LNG:
+      case _C_ULNG:    return _GSC_S_LNG;
+      case _C_LNG_LNG:
+      case _C_ULNG_LNG:        return _GSC_S_LNG_LNG;
+      default:
+        [NSException raise: NSInvalidArgumentException
+                    format: @"scalarSize() called with non-scalar type"];
+    }
+  return -1;
+}
+
 - (void) decodeValueOfObjCType: (const char*)type
                            at: (void*)address
 {
@@ -951,7 +971,7 @@
       case _GSC_SHT:
       case _GSC_USHT:
        typeCheck(*type, info & _GSC_MASK);
-       if ((info & _GSC_SIZE) == _GSC_S_SHT)
+       if ((info & _GSC_SIZE) == scalarSize(*type))
          {
            (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil);
            return;
@@ -961,7 +981,7 @@
       case _GSC_INT:
       case _GSC_UINT:
        typeCheck(*type, info & _GSC_MASK);
-       if ((info & _GSC_SIZE) == _GSC_S_INT)
+       if ((info & _GSC_SIZE) == scalarSize(*type))
          {
            (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil);
            return;
@@ -971,7 +991,7 @@
       case _GSC_LNG:
       case _GSC_ULNG:
        typeCheck(*type, info & _GSC_MASK);
-       if ((info & _GSC_SIZE) == _GSC_S_LNG)
+       if ((info & _GSC_SIZE) == scalarSize(*type))
          {
            (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil);
            return;
@@ -982,7 +1002,7 @@
       case _GSC_LNG_LNG:
       case _GSC_ULNG_LNG:
        typeCheck(*type, info & _GSC_MASK);
-       if ((info & _GSC_SIZE) == _GSC_S_LNG_LNG)
+       if ((info & _GSC_SIZE) == scalarSize(*type))
          {
            (*_dDesImp)(_src, dDesSel, address, type, &_cursor, nil);
            return;

Modified: libs/base/trunk/Source/NSUnarchiver.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSUnarchiver.m?rev=40208&r1=40207&r2=40208&view=diff
==============================================================================
--- libs/base/trunk/Source/NSUnarchiver.m       (original)
+++ libs/base/trunk/Source/NSUnarchiver.m       Thu Nov 10 11:23:14 2016
@@ -837,6 +837,26 @@
     }
 }
 
+static inline int
+scalarSize(char type)
+{
+  switch (type)
+    {
+      case _C_SHT:
+      case _C_USHT:     return _GSC_S_SHT;
+      case _C_INT:
+      case _C_UINT:    return _GSC_S_INT;
+      case _C_LNG:
+      case _C_ULNG:    return _GSC_S_LNG;
+      case _C_LNG_LNG:
+      case _C_ULNG_LNG:        return _GSC_S_LNG_LNG;
+      default:
+        [NSException raise: NSInvalidArgumentException
+                    format: @"scalarSize() called with non-scalar type"];
+    }
+  return -1;
+}
+
 - (void) decodeValueOfObjCType: (const char*)type
                            at: (void*)address
 {
@@ -1197,7 +1217,7 @@
       case _GSC_SHT:
       case _GSC_USHT:
        if (YES == typeCheck(*type, info & _GSC_MASK)
-         && (info & _GSC_SIZE) == _GSC_S_SHT)
+         && (info & _GSC_SIZE) == scalarSize(*type))
          {
            (*desImp)(src, desSel, address, type, &cursor, nil);
            return;
@@ -1207,7 +1227,7 @@
       case _GSC_INT:
       case _GSC_UINT:
        if (YES == typeCheck(*type, info & _GSC_MASK)
-         &&  (info & _GSC_SIZE) == _GSC_S_INT)
+         &&  (info & _GSC_SIZE) == scalarSize(*type))
          {
            (*desImp)(src, desSel, address, type, &cursor, nil);
            return;
@@ -1217,7 +1237,7 @@
       case _GSC_LNG:
       case _GSC_ULNG:
        if (YES == typeCheck(*type, info & _GSC_MASK)
-         && (info & _GSC_SIZE) == _GSC_S_LNG)
+         && (info & _GSC_SIZE) == scalarSize(*type))
          {
            (*desImp)(src, desSel, address, type, &cursor, nil);
            return;
@@ -1227,7 +1247,7 @@
       case _GSC_LNG_LNG:
       case _GSC_ULNG_LNG:
        if (YES == typeCheck(*type, info & _GSC_MASK)
-         && (info & _GSC_SIZE) == _GSC_S_LNG_LNG)
+         && (info & _GSC_SIZE) == scalarSize(*type))
          {
            (*desImp)(src, desSel, address, type, &cursor, nil);
            return;


_______________________________________________
Gnustep-cvs mailing list
Gnustep-cvs@gna.org
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to