CDROutputStream.create_input_stream is wrong when there are deferred writes
---------------------------------------------------------------------------

         Key: JBAS-1506
         URL: http://jira.jboss.com/jira/browse/JBAS-1506
     Project: JBoss Application Server
        Type: Patch
  Components: IIOP service  
    Versions: JBossAS-4.0.1 Final,  JBossAS-3.2.7 Final    
 Environment: This related to a jacorb bug, see: 
http://www.jacorb.org/cgi-bin/bugzilla/show_bug.cgi?id=532
    Reporter: Dimitris Andreadis
 Assigned to: Dimitris Andreadis 
     Fix For: JBossAS-5.0 Alpha, JBossAS-4.0.2 Final


An exception is thrown when trying to insert a byte[] larger than 4000 bytes 
into any any:

package test;

import java.util.Properties;
import org.omg.CORBA.ORB;
import org.omg.CORBA.Any;
import org.omg.CORBA.OctetSeqHelper;

public class Test
{
   public static final void main(String[] args)
   {
      System.out.println("*** Starting test ***");
      
      try
      {
         Properties props = new Properties();
         props.put("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
         props.put("org.omg.CORBA.ORBSingletonClass", 
"org.jacorb.orb.ORBSingleton");
         
         ORB orb = ORB.init(args, props);
      
         byte[] bytes = new byte[4001];
         Any any = orb.create_any();
         OctetSeqHelper.insert(any, bytes);         
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }
}
===================================================
     [java] *** Starting test ***
     [java] [ jacorb.home unset! Will use '.' ]
     [java] [ File .\jacorb.properties for configuration jacorb not found ]
     [java] java.lang.ArrayIndexOutOfBoundsException
     [java]     at java.lang.System.arraycopy(Native Method)
     [java]     at org.jacorb.orb.CDROutputStream.create_input_stream(Unknown So
urce)
     [java]     at org.omg.CORBA.OctetSeqHelper.insert(OctetSeqHelper.java:41)
     [java]     at test.Test.main(Test.java:24)
=======================================================

With a byte[] of size 4000 or less, it works!

I've noticed that the exception actually originates from the Helper class that 
comes from Sun's JDK:

...
public abstract class OctetSeqHelper
{
    private static String  _id = "IDL:omg.org/CORBA/OctetSeq:1.0";

    public static void insert (org.omg.CORBA.Any a, byte[] that)
    {
        org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
        a.type (type ());
        write (out, that);
        a.read_value (out.create_input_stream (), type ());
    }

The same class from the jacorb distribution does not perform that final 
"a.read_value(...)" line that causes the exception:

        public static void insert (org.omg.CORBA.Any any, byte[] s)
        {
                any.type (type ());
                write (any.create_output_stream (), s);
        }
        public static void write (final org.omg.CORBA.portable.OutputStream 
_out, byte[] _s)
        {
                
                _out.write_long(_s.length);
                _out.write_octet_array(_s,0,_s.length);
        }

Also, if you look into jacorb's CDROutputStream, there is somewhere a hardcoded 
4000 limit:

    public final void write_octet_array( final byte[] value,
                                         final int offset,
                                         final int length)
    {
        if( value != null )
        {
            if( length > 4000 )
            {
                deferredArrayQueue.add( new DeferredWriteFrame( index, offset, 
length, value ));
                index += length;
                deferred_writes += length;
            }
            else
            {
                check(length);
                System.arraycopy(value,offset,buffer,pos,length);
                index += length;
                pos += length;
            }
        }
    }


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://jira.jboss.com/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
JBoss-Development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to