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