This discussion has to do with old bugs that were reported in previous versions of the JRE:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5036554

and

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4712731

Specifically, the TCUtility.unmarshalIn() call fails on aliased type codes.

We have been using a 1.4 JRE for several years now because of this issue. For some reason, this was fixed in the 1.4 code but lost in Java 5 and Java 6.

The fix for the bug seems to be suggested in bug 4712731 above. I have modified AnyImpl.java per the suggestion and patched my production Java 6 JRE, and the fix seems to work correctly with our code.

As background, we are using omniORB, currently version 4.1.3.

So my questions are:

1. Does this fix appear correct? Are there cases that would not work, or will this break something else?
2.  Is it possible to get this fix into a future release?

Thanks in advance
Mark


Below is the modified code:

public void read_value(org.omg.CORBA.portable.InputStream in, TypeCode tc)
   {
       //debug.log ("read_value");
       //
       // Assume that someone isn't going to think they can keep reading
       // from this stream after calling us. That would be likely for
       // an IIOPInputStream but if it is an AnyInputStream then they
// presumably obtained it via our create_output_stream() so they could
       // write the contents of an IDL data type to it and then call
// create_input_stream() for us to read it. This is how Helper classes
       // typically implement the insert() method.
       // We should probably document this behavior in the 1.1 revision
       // task force.
       //

       typeCode = TypeCodeImpl.convertToNative(orb, tc);
       int kind = realType().kind().value();
       if (kind >= isStreamed.length) {
throw wrapper.invalidIsstreamedTckind( CompletionStatus.COMPLETED_MAYBE,
               new Integer(kind)) ;
       }

       if (AnyImpl.isStreamed[kind]) {
           if ( in instanceof AnyInputStream ) {
               // could only have been created here
               stream = (CDRInputStream)in;
           } else {
               org.omg.CORBA_2_3.portable.OutputStream out =
(org.omg.CORBA_2_3.portable.OutputStream)orb.create_output_stream(); typeCode.copy((org.omg.CORBA_2_3.portable.InputStream)in, out);
               stream = (CDRInputStream)out.create_input_stream();
           }
       } else {
           java.lang.Object[] objholder = new java.lang.Object[1];
           objholder[0] = object;
           long[] longholder = new long[1];
           //TCUtility.unmarshalIn(in, typeCode, longholder, objholder);
TCUtility.unmarshalIn(in, realType(), longholder, objholder); <----------------------------------------- change
           value = longholder[0];
           object = objholder[0];
           stream = null;
       }
       isInitialized = true;
   }


Reply via email to