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 <[email protected]>
+
+ * 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 <[email protected]>
* 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
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs