This is the planned patch to bump the image version: F:\work\svn\oorexx\main\trunk\interpreter\classes\support>svn diff Index: ProgramMetaData.hpp =================================================================== --- ProgramMetaData.hpp (revision 12347) +++ ProgramMetaData.hpp (working copy) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2019 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -71,7 +71,7 @@ enum { MAGICNUMBER = 11111, // remains constant from release-to-release - METAVERSION = 42 // gets updated when internal form changes + METAVERSION = 43 // gets updated when internal form changes };
---rony On 20.01.2022 20:13, Rony G Flatscher wrote: > >> Am 20.01.2022 um 19:25 schrieb Rick McGuire <object.r...@gmail.com>: >> >> >> Yes they do. > Thank you! > > Shouldn‘t we bump the imageversion (?) field then such that running previous > image versions yield > a runtime error? > > —-rony > > Rony G. Flatscher (mobil/e) >> >> On Thu, Jan 20, 2022 at 12:52 PM Rony G. Flatscher <rony.flatsc...@wu.ac.at >> <mailto:rony.flatsc...@wu.ac.at>> wrote: >> >> 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