Program: 43008
Project: 43008
Buggy source:
ClassDescriptor doReadClassDescriptor(final int classType) throws IOException, ClassNotFoundException {
  final ArrayList<ClassDescriptor> classCache=this.classCache;
switch (classType) {
case ID_REPEAT_CLASS_FAR:
{
      return classCache.get(readInt());
    }
case ID_REPEAT_CLASS_NEAR:
{
    return classCache.get((readByte() | 0xffffff00) + classCache.size());
  }
case ID_REPEAT_CLASS_NEARISH:
{
  return classCache.get((readShort() | 0xffff0000) + classCache.size());
}
case ID_PREDEFINED_ENUM_TYPE_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_ENUM_TYPE_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_EXTERNALIZABLE_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_EXTERNALIZABLE_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_EXTERNALIZER_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final Externalizer externalizer=(Externalizer)readObject();
final ClassDescriptor descriptor=new ExternalizerClassDescriptor(type,externalizer);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_PLAIN_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_PLAIN_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_PROXY_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_PROXY_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_SERIALIZABLE_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final SerializableClass serializableClass=registry.lookup(type);
int descType=version > 0 && serializableClass.hasWriteObject() ? ID_WRITE_OBJECT_CLASS : ID_SERIALIZABLE_CLASS;
final ClassDescriptor descriptor=new SerializableClassDescriptor(serializableClass,doReadClassDescriptor(readUnsignedByte()),serializableClass.getFields(),descType);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PLAIN_CLASS:
{
final String className=readString();
final Class<?> clazz=doResolveClass(className,0L);
final ClassDescriptor descriptor=new ClassDescriptor(clazz,ID_PLAIN_CLASS);
classCache.add(descriptor);
return descriptor;
}
case ID_PROXY_CLASS:
{
String[] interfaces=new String[readInt()];
for (int i=0; i < interfaces.length; i++) {
interfaces[i]=readString();
}
final ClassDescriptor descriptor;
if (version == 1) {
final BlockUnmarshaller blockUnmarshaller=getBlockUnmarshaller();
descriptor=new ClassDescriptor(classResolver.resolveProxyClass(blockUnmarshaller,interfaces),ID_PROXY_CLASS);
blockUnmarshaller.readToEndBlockData();
blockUnmarshaller.unblock();
}
 else {
descriptor=new ClassDescriptor(classResolver.resolveProxyClass(this,interfaces),ID_PROXY_CLASS);
}
classCache.add(descriptor);
return descriptor;
}
case ID_WRITE_OBJECT_CLASS:
case ID_SERIALIZABLE_CLASS:
{
int idx=classCache.size();
classCache.add(null);
final String className=readString();
final long uid=readLong();
final Class<?> clazz=doResolveClass(className,uid);
final Class<?> superClazz=clazz.getSuperclass();
classCache.set(idx,new IncompleteClassDescriptor(clazz,classType));
final int cnt=readInt();
final String[] names=new String[cnt];
final ClassDescriptor[] descriptors=new ClassDescriptor[cnt];
final boolean[] unshareds=new boolean[cnt];
for (int i=0; i < cnt; i++) {
names[i]=readUTF();
descriptors[i]=doReadClassDescriptor(readUnsignedByte());
unshareds[i]=readBoolean();
}
ClassDescriptor superDescriptor=doReadClassDescriptor(readUnsignedByte());
if (superDescriptor != null) {
final Class<?> superType=superDescriptor.getType();
if (!superType.isAssignableFrom(clazz)) {
throw new InvalidClassException(clazz.getName(),"String_Node_Str");
}
Class<?> cl=superClazz;
while (cl != superType) {
superDescriptor=new SerializableClassDescriptor(registry.lookup(cl),superDescriptor);
cl=cl.getSuperclass();
}
}
 else if (superClazz != null) {
Class<?> cl=superClazz;
while (Serializable.class.isAssignableFrom(cl)) {
superDescriptor=new SerializableClassDescriptor(registry.lookup(cl),superDescriptor);
cl=cl.getSuperclass();
}
}
final SerializableClass serializableClass=registry.lookup(clazz);
final SerializableField[] fields=new SerializableField[cnt];
for (int i=0; i < cnt; i++) {
fields[i]=serializableClass.getSerializableField(names[i],descriptors[i].getType(),unshareds[i]);
}
final ClassDescriptor descriptor=new SerializableClassDescriptor(serializableClass,superDescriptor,fields,classType);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_EXTERNALIZABLE_CLASS:
{
final String className=readString();
final long uid=readLong();
final Class<?> clazz=doResolveClass(className,uid);
final ClassDescriptor descriptor=new ClassDescriptor(clazz,ID_EXTERNALIZABLE_CLASS);
classCache.add(descriptor);
return descriptor;
}
case ID_EXTERNALIZER_CLASS:
{
final String className=readString();
int idx=classCache.size();
classCache.add(null);
final Class<?> clazz=doResolveClass(className,0L);
final Externalizer externalizer=(Externalizer)readObject();
final ClassDescriptor descriptor=new ExternalizerClassDescriptor(clazz,externalizer);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_ENUM_TYPE_CLASS:
{
final ClassDescriptor descriptor=new ClassDescriptor(doResolveClass(readString(),0L),ID_ENUM_TYPE_CLASS);
classCache.add(descriptor);
return descriptor;
}
case ID_OBJECT_ARRAY_TYPE_CLASS:
{
final ClassDescriptor elementType=doReadClassDescriptor(readUnsignedByte());
final ClassDescriptor arrayDescriptor=new ClassDescriptor(Array.newInstance(elementType.getType(),0).getClass(),ID_OBJECT_ARRAY_TYPE_CLASS);
classCache.add(arrayDescriptor);
return arrayDescriptor;
}
case ID_STRING_CLASS:
{
return ClassDescriptor.STRING_DESCRIPTOR;
}
case ID_OBJECT_CLASS:
{
return ClassDescriptor.OBJECT_DESCRIPTOR;
}
case ID_CLASS_CLASS:
{
return ClassDescriptor.CLASS_DESCRIPTOR;
}
case ID_ENUM_CLASS:
{
return ClassDescriptor.ENUM_DESCRIPTOR;
}
case ID_BOOLEAN_ARRAY_CLASS:
{
return ClassDescriptor.BOOLEAN_ARRAY;
}
case ID_BYTE_ARRAY_CLASS:
{
return ClassDescriptor.BYTE_ARRAY;
}
case ID_SHORT_ARRAY_CLASS:
{
return ClassDescriptor.SHORT_ARRAY;
}
case ID_INT_ARRAY_CLASS:
{
return ClassDescriptor.INT_ARRAY;
}
case ID_LONG_ARRAY_CLASS:
{
return ClassDescriptor.LONG_ARRAY;
}
case ID_CHAR_ARRAY_CLASS:
{
return ClassDescriptor.CHAR_ARRAY;
}
case ID_FLOAT_ARRAY_CLASS:
{
return ClassDescriptor.FLOAT_ARRAY;
}
case ID_DOUBLE_ARRAY_CLASS:
{
return ClassDescriptor.DOUBLE_ARRAY;
}
case ID_PRIM_BOOLEAN:
{
return ClassDescriptor.BOOLEAN;
}
case ID_PRIM_BYTE:
{
return ClassDescriptor.BYTE;
}
case ID_PRIM_CHAR:
{
return ClassDescriptor.CHAR;
}
case ID_PRIM_DOUBLE:
{
return ClassDescriptor.DOUBLE;
}
case ID_PRIM_FLOAT:
{
return ClassDescriptor.FLOAT;
}
case ID_PRIM_INT:
{
return ClassDescriptor.INT;
}
case ID_PRIM_LONG:
{
return ClassDescriptor.LONG;
}
case ID_PRIM_SHORT:
{
return ClassDescriptor.SHORT;
}
case ID_VOID:
{
return ClassDescriptor.VOID;
}
case ID_BOOLEAN_CLASS:
{
return ClassDescriptor.BOOLEAN_OBJ;
}
case ID_BYTE_CLASS:
{
return ClassDescriptor.BYTE_OBJ;
}
case ID_SHORT_CLASS:
{
return ClassDescriptor.SHORT_OBJ;
}
case ID_INTEGER_CLASS:
{
return ClassDescriptor.INTEGER_OBJ;
}
case ID_LONG_CLASS:
{
return ClassDescriptor.LONG_OBJ;
}
case ID_CHARACTER_CLASS:
{
return ClassDescriptor.CHARACTER_OBJ;
}
case ID_FLOAT_CLASS:
{
return ClassDescriptor.FLOAT_OBJ;
}
case ID_DOUBLE_CLASS:
{
return ClassDescriptor.DOUBLE_OBJ;
}
case ID_VOID_CLASS:
{
return ClassDescriptor.VOID_OBJ;
}
default :
{
throw new InvalidClassException("String_Node_Str" + classType);
}
}
}

Fixed version (ground truth):
ClassDescriptor doReadClassDescriptor(final int classType) throws IOException, ClassNotFoundException {
  final ArrayList<ClassDescriptor> classCache=this.classCache;
switch (classType) {
case ID_REPEAT_CLASS_FAR:
{
      return classCache.get(readInt());
    }
case ID_REPEAT_CLASS_NEAR:
{
    return classCache.get((readByte() | 0xffffff00) + classCache.size());
  }
case ID_REPEAT_CLASS_NEARISH:
{
  return classCache.get((readShort() | 0xffff0000) + classCache.size());
}
case ID_PREDEFINED_ENUM_TYPE_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_ENUM_TYPE_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_EXTERNALIZABLE_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_EXTERNALIZABLE_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_EXTERNALIZER_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final Externalizer externalizer=(Externalizer)readObject();
final ClassDescriptor descriptor=new ExternalizerClassDescriptor(type,externalizer);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_PLAIN_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_PLAIN_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_PROXY_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final ClassDescriptor descriptor=new ClassDescriptor(type,ID_PROXY_CLASS);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PREDEFINED_SERIALIZABLE_CLASS:
{
final int idx=classCache.size();
classCache.add(null);
final Class<?> type=readClassTableClass();
final SerializableClass serializableClass=registry.lookup(type);
int descType=version > 0 && serializableClass.hasWriteObject() ? ID_WRITE_OBJECT_CLASS : ID_SERIALIZABLE_CLASS;
final ClassDescriptor descriptor=new SerializableClassDescriptor(serializableClass,doReadClassDescriptor(readUnsignedByte()),serializableClass.getFields(),descType);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_PLAIN_CLASS:
{
final String className=readString();
final Class<?> clazz=doResolveClass(className,0L);
final ClassDescriptor descriptor=new ClassDescriptor(clazz,ID_PLAIN_CLASS);
classCache.add(descriptor);
return descriptor;
}
case ID_PROXY_CLASS:
{
String[] interfaces=new String[readInt()];
for (int i=0; i < interfaces.length; i++) {
interfaces[i]=readString();
}
final ClassDescriptor descriptor;
if (version == 1) {
final BlockUnmarshaller blockUnmarshaller=getBlockUnmarshaller();
descriptor=new ClassDescriptor(classResolver.resolveProxyClass(blockUnmarshaller,interfaces),ID_PROXY_CLASS);
blockUnmarshaller.readToEndBlockData();
blockUnmarshaller.unblock();
}
 else {
descriptor=new ClassDescriptor(classResolver.resolveProxyClass(this,interfaces),ID_PROXY_CLASS);
}
classCache.add(descriptor);
return descriptor;
}
case ID_WRITE_OBJECT_CLASS:
case ID_SERIALIZABLE_CLASS:
{
int idx=classCache.size();
classCache.add(null);
final String className=readString();
final long uid=readLong();
final Class<?> clazz=doResolveClass(className,uid);
final Class<?> superClazz=clazz.getSuperclass();
classCache.set(idx,new IncompleteClassDescriptor(clazz,classType));
final int cnt=readInt();
final String[] names=new String[cnt];
final ClassDescriptor[] descriptors=new ClassDescriptor[cnt];
final boolean[] unshareds=new boolean[cnt];
for (int i=0; i < cnt; i++) {
names[i]=readUTF();
descriptors[i]=doReadClassDescriptor(readUnsignedByte());
unshareds[i]=readBoolean();
}
ClassDescriptor superDescriptor=doReadClassDescriptor(readUnsignedByte());
if (superDescriptor != null) {
final Class<?> superType=superDescriptor.getType();
if (!superType.isAssignableFrom(clazz)) {
throw new InvalidClassException(clazz.getName(),"String_Node_Str");
}
Class<?> cl=superClazz;
while (cl != superType) {
superDescriptor=new SerializableClassDescriptor(registry.lookup(cl),superDescriptor);
cl=cl.getSuperclass();
}
}
 else if (superClazz != null) {
Class<?> cl=superClazz;
while (Serializable.class.isAssignableFrom(cl)) {
superDescriptor=new SerializableClassDescriptor(registry.lookup(cl),superDescriptor);
cl=cl.getSuperclass();
}
}
final SerializableClass serializableClass=registry.lookup(clazz);
final SerializableField[] fields=new SerializableField[cnt];
for (int i=0; i < cnt; i++) {
fields[i]=serializableClass.getSerializableField(names[i],descriptors[i].getType(),unshareds[i]);
}
final ClassDescriptor descriptor=new SerializableClassDescriptor(serializableClass,superDescriptor,fields,classType);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_EXTERNALIZABLE_CLASS:
{
final String className=readString();
final long uid=readLong();
final Class<?> clazz=doResolveClass(className,uid);
final ClassDescriptor descriptor=new ClassDescriptor(clazz,ID_EXTERNALIZABLE_CLASS);
classCache.add(descriptor);
return descriptor;
}
case ID_EXTERNALIZER_CLASS:
{
final String className=readString();
int idx=classCache.size();
classCache.add(null);
final Class<?> clazz=doResolveClass(className,0L);
final Externalizer externalizer=(Externalizer)readObject();
final ClassDescriptor descriptor=new ExternalizerClassDescriptor(clazz,externalizer);
classCache.set(idx,descriptor);
return descriptor;
}
case ID_ENUM_TYPE_CLASS:
{
final ClassDescriptor descriptor=new ClassDescriptor(doResolveClass(readString(),0L),ID_ENUM_TYPE_CLASS);
classCache.add(descriptor);
return descriptor;
}
case ID_OBJECT_ARRAY_TYPE_CLASS:
{
final ClassDescriptor elementType=doReadClassDescriptor(readUnsignedByte());
final ClassDescriptor arrayDescriptor=new ClassDescriptor(Array.newInstance(elementType.getType(),0).getClass(),ID_OBJECT_ARRAY_TYPE_CLASS);
classCache.add(arrayDescriptor);
return arrayDescriptor;
}
case ID_CC_ARRAY_LIST:
{
return ClassDescriptor.CC_ARRAY_LIST;
}
case ID_CC_LINKED_LIST:
{
return ClassDescriptor.CC_LINKED_LIST;
}
case ID_CC_HASH_SET:
{
return ClassDescriptor.CC_HASH_SET;
}
case ID_CC_LINKED_HASH_SET:
{
return ClassDescriptor.CC_LINKED_HASH_SET;
}
case ID_CC_TREE_SET:
{
return ClassDescriptor.CC_TREE_SET;
}
case ID_CC_IDENTITY_HASH_MAP:
{
return ClassDescriptor.CC_IDENTITY_HASH_MAP;
}
case ID_CC_HASH_MAP:
{
return ClassDescriptor.CC_HASH_MAP;
}
case ID_CC_HASHTABLE:
{
return ClassDescriptor.CC_HASHTABLE;
}
case ID_CC_LINKED_HASH_MAP:
{
return ClassDescriptor.CC_LINKED_HASH_MAP;
}
case ID_CC_TREE_MAP:
{
return ClassDescriptor.CC_TREE_MAP;
}
case ID_STRING_CLASS:
{
return ClassDescriptor.STRING_DESCRIPTOR;
}
case ID_OBJECT_CLASS:
{
return ClassDescriptor.OBJECT_DESCRIPTOR;
}
case ID_CLASS_CLASS:
{
return ClassDescriptor.CLASS_DESCRIPTOR;
}
case ID_ENUM_CLASS:
{
return ClassDescriptor.ENUM_DESCRIPTOR;
}
case ID_BOOLEAN_ARRAY_CLASS:
{
return ClassDescriptor.BOOLEAN_ARRAY;
}
case ID_BYTE_ARRAY_CLASS:
{
return ClassDescriptor.BYTE_ARRAY;
}
case ID_SHORT_ARRAY_CLASS:
{
return ClassDescriptor.SHORT_ARRAY;
}
case ID_INT_ARRAY_CLASS:
{
return ClassDescriptor.INT_ARRAY;
}
case ID_LONG_ARRAY_CLASS:
{
return ClassDescriptor.LONG_ARRAY;
}
case ID_CHAR_ARRAY_CLASS:
{
return ClassDescriptor.CHAR_ARRAY;
}
case ID_FLOAT_ARRAY_CLASS:
{
return ClassDescriptor.FLOAT_ARRAY;
}
case ID_DOUBLE_ARRAY_CLASS:
{
return ClassDescriptor.DOUBLE_ARRAY;
}
case ID_PRIM_BOOLEAN:
{
return ClassDescriptor.BOOLEAN;
}
case ID_PRIM_BYTE:
{
return ClassDescriptor.BYTE;
}
case ID_PRIM_CHAR:
{
return ClassDescriptor.CHAR;
}
case ID_PRIM_DOUBLE:
{
return ClassDescriptor.DOUBLE;
}
case ID_PRIM_FLOAT:
{
return ClassDescriptor.FLOAT;
}
case ID_PRIM_INT:
{
return ClassDescriptor.INT;
}
case ID_PRIM_LONG:
{
return ClassDescriptor.LONG;
}
case ID_PRIM_SHORT:
{
return ClassDescriptor.SHORT;
}
case ID_VOID:
{
return ClassDescriptor.VOID;
}
case ID_BOOLEAN_CLASS:
{
return ClassDescriptor.BOOLEAN_OBJ;
}
case ID_BYTE_CLASS:
{
return ClassDescriptor.BYTE_OBJ;
}
case ID_SHORT_CLASS:
{
return ClassDescriptor.SHORT_OBJ;
}
case ID_INTEGER_CLASS:
{
return ClassDescriptor.INTEGER_OBJ;
}
case ID_LONG_CLASS:
{
return ClassDescriptor.LONG_OBJ;
}
case ID_CHARACTER_CLASS:
{
return ClassDescriptor.CHARACTER_OBJ;
}
case ID_FLOAT_CLASS:
{
return ClassDescriptor.FLOAT_OBJ;
}
case ID_DOUBLE_CLASS:
{
return ClassDescriptor.DOUBLE_OBJ;
}
case ID_VOID_CLASS:
{
return ClassDescriptor.VOID_OBJ;
}
default :
{
throw new InvalidClassException("String_Node_Str" + classType);
}
}
}