-
Bug
-
Resolution: Cannot Reproduce
-
P4
-
None
-
1.4.2
-
x86
-
windows_2000, windows_xp
Name: gm110360 Date: 08/25/2004
FULL PRODUCT VERSION :
java 1.4.1
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows 2000(Version 5.00.2195)
A DESCRIPTION OF THE PROBLEM :
ObjectInputStream.readObject() throws a StreamCorruptedException when using Java plugin 1.4.1 or later which was not the case with earlier versions(till Ver 1.3.1_11) of the plugin. One of our applets uses this method during the initial login for loading the previous persistence information but fails to get past this method with the new plugin.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Launching the applet from "http://dartool.ecs.nasa.gov"
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
A popup for login appears on the screen
userId testgng , password test12
JDT Applet launched.
ACTUAL -
Status bar for the applet shows progress to an extent (saying 30% on the screen) and hangs from
that point on, and the console shows the message thats put in the Error message(s) box below.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
INSIDE USER MODEL LOAD
java.io.StreamCorruptedException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1301)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1603)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1271)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1603)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1271)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at ClWbJt.mojo.Socket.readStreamedObject(Socket.java:132)
at ClWbJt.mojo.Socket.readPacket(Socket.java:346)
at ClWbJt.mojo.Socket.readPacket(Socket.java:147)
at ClWbJt.jess.client.Model$server_listener.run(Model.java:560)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
private BufferedInputStream in;
public Socket(java.net.Socket socket, String sessionId)
throws IOException
{
this.socket = socket;
listeners_ = new HashMap(Collections.synchronizedMap(new HashMap()));
unclaimed_ = new Vector ();
sessionId_ = sessionId;
in = new BufferedInputStream (socket.getInputStream());
out = socket.getOutputStream ();
}
public Packet readPacket(boolean readAsBytes) throws IOException
{
int sync_char;
byte[] packet_size_buf = new byte[PACKET_DIGIT_COUNT];
byte[] buf = new byte[4096];
int packet_size = -1;
int data_mark = -1;
Packet newp = null;
/*
** Reads are synchronized.
*/
synchronized (read_lock)
{
if (socket == null)
throw new IOException ("no open socket");
/*
** Do the messy work of parsing the transport:
**
** L // first byte is 'L'
** dddddddddd // 10 byte length
** '\n' // new line
** ... data // 'length' bytes
**
** See http://source_host/jest/jest/mojo_protocol.html
*/
/*
** Sync on 'L'
*/
sync_char = in.read();
if (sync_char == -1)
throw new IOException ("Stream closed");
if (sync_char == 0)
return null;
if (sync_char != 'L')
throw new IOException (
"Unexpected sync char: "
+ sync_char);
/*
** Read 10 digit packet_size
*/
int nread = 0;
while (nread < PACKET_DIGIT_COUNT)
{
packet_size = in.read(packet_size_buf,
nread, PACKET_DIGIT_COUNT - nread);
if (packet_size == -1)
throw new IOException (
"Failed to receive all of packet");
nread += packet_size;
}
if (nread != packet_size_buf.length)
throw new IOException (
"Failed to receive all of packet");
/*
** Convert read packet_size into 'int'.
*/
String size_s = new String(packet_size_buf);
try
{
packet_size = Integer.parseInt(size_s);
if (packet_size < 0)
throw new IOException (
"Packet data size is negative");
if (packet_size > MAX_PACKET_SIZE)
throw new IOException (
"Data in message exceeds limits");
}
catch (java.lang.NumberFormatException e)
{
throw new IOException (
"Length string is not a number");
}
/*
** Sync on terminating new-line.
*/
sync_char = in.read();
if (sync_char != '\n')
throw new IOException (
"Expected newline sync char");
/*
** Grow input buffer as need.
*/
if (buf.length < packet_size)
buf = new byte[packet_size];
/*
** Slurp up the packet.
*/
nread = 0;
while (nread < packet_size)
{
int c;
if ((c = in.read(buf, nread,
packet_size - nread))==-1)
break;
nread += c;
}
if (nread != packet_size)
throw new IOException (
"Failed to receive all of packet");
/*
** Parse out the COMMAND packet, syncing
** on the terminating new-line.
*/
for (data_mark = 0; data_mark < buf.length;
data_mark++)
if (buf[data_mark] == '\n')
break;
if (data_mark++ == buf.length)
throw new IOException (
"Expected newline sync char");
int session_id_mark = data_mark;
// ok lets check for session ids
if (sessionId_ != null)
{
String sid = null;
int i = 0;
for (i=data_mark; i<packet_size; i++)
{
if (buf[i] == '\n')
{
sid = new String (
buf, data_mark,
i-data_mark);
break;
}
}
if (sid == null)
throw new IOException (
"Session id not found");
if (!sid.equals (sessionId_))
{
// throw new IOException (
// "Wrong session id : " + sid);
}
data_mark = i+1;
} try
{
if (readAsBytes)
{
byte[] newData = new byte[
packet_size - data_mark];
System.arraycopy (buf,
data_mark, newData,
0,
packet_size - data_mark);
newp = new Packet(new String(buf, 0,
session_id_mark - 1),
newData);
}
else
{
newp = new Packet(new String(buf, 0,
session_id_mark - 1),
new String(buf, data_mark,
packet_size - data_mark));
}
}
catch (PacketTooBigException ptbe)
{
throw new IOException (
ptbe.getMessage ());
}
if (newp.getCommand ().equals ("JAVAOBJECT"))
{
handleIncomingObject (
newp.getData (),
readStreamedObject ());
return newp;
}
}
return newp;
}
private Object readStreamedObject () throws IOException
{
Object incoming = null;
ObjectInputStream ois = null;
synchronized (read_lock)
{
ois = new ObjectInputStream (in);
try
{
incoming = ois.readObject ();
}
catch (ClassNotFoundException cnfe)
{
throw new IOException (
this.getClass().getName() +
": Failed find class.");
}
}
return incoming;
}
---------- END SOURCE ----------
(Incident Review ID: 276071)
======================================================================
FULL PRODUCT VERSION :
java 1.4.1
ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows 2000(Version 5.00.2195)
A DESCRIPTION OF THE PROBLEM :
ObjectInputStream.readObject() throws a StreamCorruptedException when using Java plugin 1.4.1 or later which was not the case with earlier versions(till Ver 1.3.1_11) of the plugin. One of our applets uses this method during the initial login for loading the previous persistence information but fails to get past this method with the new plugin.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Launching the applet from "http://dartool.ecs.nasa.gov"
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
A popup for login appears on the screen
userId testgng , password test12
JDT Applet launched.
ACTUAL -
Status bar for the applet shows progress to an extent (saying 30% on the screen) and hangs from
that point on, and the console shows the message thats put in the Error message(s) box below.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
INSIDE USER MODEL LOAD
java.io.StreamCorruptedException
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1301)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1603)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1271)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1603)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1271)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
at ClWbJt.mojo.Socket.readStreamedObject(Socket.java:132)
at ClWbJt.mojo.Socket.readPacket(Socket.java:346)
at ClWbJt.mojo.Socket.readPacket(Socket.java:147)
at ClWbJt.jess.client.Model$server_listener.run(Model.java:560)
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
private BufferedInputStream in;
public Socket(java.net.Socket socket, String sessionId)
throws IOException
{
this.socket = socket;
listeners_ = new HashMap(Collections.synchronizedMap(new HashMap()));
unclaimed_ = new Vector ();
sessionId_ = sessionId;
in = new BufferedInputStream (socket.getInputStream());
out = socket.getOutputStream ();
}
public Packet readPacket(boolean readAsBytes) throws IOException
{
int sync_char;
byte[] packet_size_buf = new byte[PACKET_DIGIT_COUNT];
byte[] buf = new byte[4096];
int packet_size = -1;
int data_mark = -1;
Packet newp = null;
/*
** Reads are synchronized.
*/
synchronized (read_lock)
{
if (socket == null)
throw new IOException ("no open socket");
/*
** Do the messy work of parsing the transport:
**
** L // first byte is 'L'
** dddddddddd // 10 byte length
** '\n' // new line
** ... data // 'length' bytes
**
** See http://source_host/jest/jest/mojo_protocol.html
*/
/*
** Sync on 'L'
*/
sync_char = in.read();
if (sync_char == -1)
throw new IOException ("Stream closed");
if (sync_char == 0)
return null;
if (sync_char != 'L')
throw new IOException (
"Unexpected sync char: "
+ sync_char);
/*
** Read 10 digit packet_size
*/
int nread = 0;
while (nread < PACKET_DIGIT_COUNT)
{
packet_size = in.read(packet_size_buf,
nread, PACKET_DIGIT_COUNT - nread);
if (packet_size == -1)
throw new IOException (
"Failed to receive all of packet");
nread += packet_size;
}
if (nread != packet_size_buf.length)
throw new IOException (
"Failed to receive all of packet");
/*
** Convert read packet_size into 'int'.
*/
String size_s = new String(packet_size_buf);
try
{
packet_size = Integer.parseInt(size_s);
if (packet_size < 0)
throw new IOException (
"Packet data size is negative");
if (packet_size > MAX_PACKET_SIZE)
throw new IOException (
"Data in message exceeds limits");
}
catch (java.lang.NumberFormatException e)
{
throw new IOException (
"Length string is not a number");
}
/*
** Sync on terminating new-line.
*/
sync_char = in.read();
if (sync_char != '\n')
throw new IOException (
"Expected newline sync char");
/*
** Grow input buffer as need.
*/
if (buf.length < packet_size)
buf = new byte[packet_size];
/*
** Slurp up the packet.
*/
nread = 0;
while (nread < packet_size)
{
int c;
if ((c = in.read(buf, nread,
packet_size - nread))==-1)
break;
nread += c;
}
if (nread != packet_size)
throw new IOException (
"Failed to receive all of packet");
/*
** Parse out the COMMAND packet, syncing
** on the terminating new-line.
*/
for (data_mark = 0; data_mark < buf.length;
data_mark++)
if (buf[data_mark] == '\n')
break;
if (data_mark++ == buf.length)
throw new IOException (
"Expected newline sync char");
int session_id_mark = data_mark;
// ok lets check for session ids
if (sessionId_ != null)
{
String sid = null;
int i = 0;
for (i=data_mark; i<packet_size; i++)
{
if (buf[i] == '\n')
{
sid = new String (
buf, data_mark,
i-data_mark);
break;
}
}
if (sid == null)
throw new IOException (
"Session id not found");
if (!sid.equals (sessionId_))
{
// throw new IOException (
// "Wrong session id : " + sid);
}
data_mark = i+1;
} try
{
if (readAsBytes)
{
byte[] newData = new byte[
packet_size - data_mark];
System.arraycopy (buf,
data_mark, newData,
0,
packet_size - data_mark);
newp = new Packet(new String(buf, 0,
session_id_mark - 1),
newData);
}
else
{
newp = new Packet(new String(buf, 0,
session_id_mark - 1),
new String(buf, data_mark,
packet_size - data_mark));
}
}
catch (PacketTooBigException ptbe)
{
throw new IOException (
ptbe.getMessage ());
}
if (newp.getCommand ().equals ("JAVAOBJECT"))
{
handleIncomingObject (
newp.getData (),
readStreamedObject ());
return newp;
}
}
return newp;
}
private Object readStreamedObject () throws IOException
{
Object incoming = null;
ObjectInputStream ois = null;
synchronized (read_lock)
{
ois = new ObjectInputStream (in);
try
{
incoming = ois.readObject ();
}
catch (ClassNotFoundException cnfe)
{
throw new IOException (
this.getClass().getName() +
": Failed find class.");
}
}
return incoming;
}
---------- END SOURCE ----------
(Incident Review ID: 276071)
======================================================================