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
[email protected]
https://lists.sourceforge.net/lists/listinfo/oorexx-devel