Jonathan Biggar
2007-12-11 07:52:48 UTC
GIOP 1.2 requires the REPLY body to be aligned on an 8 byte boundary.
omniORB has the code to do this alignment for normal replies and system
exceptions, but is missing the alignment call for user exceptions and
location forward replies.
This bug only manifests itself if service contexts are used to transmit
additional data from the CORBA server back to the client, and then only
if the service context length doesn't leave the alignment on an 8 byte
boundary already.
This bug appears in omniORB 4.0.X and 4.1.[01].
Here is a patch relative to omniORB 4.0.5 for the functions
giopImpl12::sendUserException and giopImpl12::sendLocationForwardReply:
+++ giopImpl12.cc 2007-12-10 16:36:37.000000000 -0800
@@ -1704,6 +1704,8 @@
// Service context
giop_s.service_contexts() >>= s;
+ s.alignOutput(omni::ALIGN_8);
+
// RepoId
CORBA::ULong(repoid_size) >>= s;
s.put_octet_array((const CORBA::Octet*) repoid, repoid_size);
@@ -1751,6 +1753,7 @@
// Service context
operator>>= ((CORBA::ULong)0,s);
+ s.alignOutput(omni::ALIGN_8);
// object reference
CORBA::Object::_marshalObjRef(obj,s);
omniORB has the code to do this alignment for normal replies and system
exceptions, but is missing the alignment call for user exceptions and
location forward replies.
This bug only manifests itself if service contexts are used to transmit
additional data from the CORBA server back to the client, and then only
if the service context length doesn't leave the alignment on an 8 byte
boundary already.
This bug appears in omniORB 4.0.X and 4.1.[01].
Here is a patch relative to omniORB 4.0.5 for the functions
giopImpl12::sendUserException and giopImpl12::sendLocationForwardReply:
+++ giopImpl12.cc 2007-12-10 16:36:37.000000000 -0800
@@ -1704,6 +1704,8 @@
// Service context
giop_s.service_contexts() >>= s;
+ s.alignOutput(omni::ALIGN_8);
+
// RepoId
CORBA::ULong(repoid_size) >>= s;
s.put_octet_array((const CORBA::Octet*) repoid, repoid_size);
@@ -1751,6 +1753,7 @@
// Service context
operator>>= ((CORBA::ULong)0,s);
+ s.alignOutput(omni::ALIGN_8);
// object reference
CORBA::Object::_marshalObjRef(obj,s);
--
Jon Biggar
Levanta Inc
***@levanta.com
Jon Biggar
Levanta Inc
***@levanta.com