At the end of November there were the following changes to interpreter/classes/support/ProgramMetaData.{c|h}pp (rev 12325 and rev 12327, "svn diff -r PREV ProgramMetaData.*") :
Index: ProgramMetaData.cpp =================================================================== --- ProgramMetaData.cpp (revision 12327) +++ ProgramMetaData.cpp (working copy) @@ -304,10 +304,6 @@ data++; } - // pass back the pointer to the metadata location, assuming for now that - // here is metadata. - metaData = (ProgramMetaData *)data; - // adjust the length for everything after the shebang length -= data - buffer->getData(); @@ -314,6 +310,21 @@ // Now check in binary form of the compiled version if (length > strlen(compiledHeader) && strcmp(data, compiledHeader) == 0) { + // the problem with having a shebang in front of the data is that it opens the + // possibility that the flattened program data is not aligned on an object grain + // boundary. This can either cause invalid objects to created on the heap or even + // result in data exceptions if the fields are not aligned on a proper word boundary. + // If this is anywhere other than the front of the buffer, we need to shift it to + // the front. + + // the returned metadata will be at the beginning + metaData = (ProgramMetaData *)buffer->getData(); + + // once we've shifted it + if (data != buffer->getData()) + { + memmove((void *)buffer->getData(), (void *)data, length); + } return true; } @@ -327,8 +338,13 @@ size_t decodedLength; + // Note that we are decoding to the beginning of the buffer, which overwrites any + // shebang and the binary header while also ensuring the data is aligned on a proper + // object grain boundary, + metaData = (ProgramMetaData *)buffer->getData(); + // we now have the encoded data, decode it in place, overwriting the compiled header - if (!StringUtil::decodeBase64(beginEncodedData, encodedLength, data, decodedLength)) + if (!StringUtil::decodeBase64(beginEncodedData, encodedLength, buffer->getData(), decodedLength)) { reportException(Error_Program_unreadable_invalid_encoding, fileName); } Index: ProgramMetaData.hpp =================================================================== --- ProgramMetaData.hpp (revision 12325) +++ ProgramMetaData.hpp (working copy) @@ -80,8 +80,16 @@ uint16_t imageVersion; // version identifier for validity uint16_t wordSize; // size of a word uint16_t bigEndian; // true if this is a big-endian platform - LanguageLevel requiredLevel; // required language level for execution + uint32_t requiredLevel; // required language level for execution (NB: this needs to be an explicitly sized item) uint32_t reserved; // padding to bring imageSize to a 64-bit boundary + + size_t pad; // We need to add an extra pad here to force imageData field to be on an object grain + // boundary so front of the buffer can be chopped off without creating an invalid object. + // The offset of imageData needs to be in integral number of grain increments from the beginning. + // so for 32 bits we are 16 + 4*2 + 2*4 + 4 + 4 = 40 bytes for the offset, and + // for 64-bit we are 16 + 4*2 + 2*4 + 8 + 8 bytes for the offset. This will allow things + // go aligned on a grain boundary on all architectures// + size_t imageSize; // size of the image char imageData[4]; // the copied image data }; Do these changes invalidate compiled ooRexx programs (with the "-e" switch) that got compiled before these two changes took effect by any chance? ---rony
_______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel