Made serialization getters verifiable, to allow OutputOutputStream to be used from partial trust.

This commit is contained in:
jfrijters 2009-05-29 08:57:33 +00:00
Родитель 7b120d5942
Коммит cd7ccd8417
1 изменённых файлов: 15 добавлений и 2 удалений

Просмотреть файл

@ -729,6 +729,18 @@ namespace IKVM.NativeCode.java
CodeEmitter ilgenPrimGetter = CodeEmitter.Create(dmPrimGetter); CodeEmitter ilgenPrimGetter = CodeEmitter.Create(dmPrimGetter);
CodeEmitter ilgenObjSetter = CodeEmitter.Create(dmObjSetter); CodeEmitter ilgenObjSetter = CodeEmitter.Create(dmObjSetter);
CodeEmitter ilgenPrimSetter = CodeEmitter.Create(dmPrimSetter); CodeEmitter ilgenPrimSetter = CodeEmitter.Create(dmPrimSetter);
// we want the getters to be verifiable (because writeObject can be used from partial trust),
// so we create a local to hold the properly typed object reference
LocalBuilder objGetterThis = ilgenObjGetter.DeclareLocal(tw.TypeAsBaseType);
LocalBuilder primGetterThis = ilgenPrimGetter.DeclareLocal(tw.TypeAsBaseType);
ilgenObjGetter.Emit(OpCodes.Ldarg_0);
ilgenObjGetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
ilgenObjGetter.Emit(OpCodes.Stloc, objGetterThis);
ilgenPrimGetter.Emit(OpCodes.Ldarg_0);
ilgenPrimGetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
ilgenPrimGetter.Emit(OpCodes.Stloc, primGetterThis);
foreach (jiObjectStreamField field in fields) foreach (jiObjectStreamField field in fields)
{ {
FieldWrapper fw = GetFieldWrapper(field); FieldWrapper fw = GetFieldWrapper(field);
@ -744,7 +756,7 @@ namespace IKVM.NativeCode.java
// Getter // Getter
ilgenPrimGetter.Emit(OpCodes.Ldarg_1); ilgenPrimGetter.Emit(OpCodes.Ldarg_1);
ilgenPrimGetter.Emit(OpCodes.Ldc_I4, field.getOffset()); ilgenPrimGetter.Emit(OpCodes.Ldc_I4, field.getOffset());
ilgenPrimGetter.Emit(OpCodes.Ldarg_0); ilgenPrimGetter.Emit(OpCodes.Ldloc, primGetterThis);
fw.EmitGet(ilgenPrimGetter); fw.EmitGet(ilgenPrimGetter);
if (fieldType == PrimitiveTypeWrapper.BYTE) if (fieldType == PrimitiveTypeWrapper.BYTE)
{ {
@ -785,6 +797,7 @@ namespace IKVM.NativeCode.java
// Setter // Setter
ilgenPrimSetter.Emit(OpCodes.Ldarg_0); ilgenPrimSetter.Emit(OpCodes.Ldarg_0);
ilgenPrimSetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
ilgenPrimSetter.Emit(OpCodes.Ldarg_1); ilgenPrimSetter.Emit(OpCodes.Ldarg_1);
ilgenPrimSetter.Emit(OpCodes.Ldc_I4, field.getOffset()); ilgenPrimSetter.Emit(OpCodes.Ldc_I4, field.getOffset());
if (fieldType == PrimitiveTypeWrapper.BYTE) if (fieldType == PrimitiveTypeWrapper.BYTE)
@ -830,7 +843,7 @@ namespace IKVM.NativeCode.java
// Getter // Getter
ilgenObjGetter.Emit(OpCodes.Ldarg_1); ilgenObjGetter.Emit(OpCodes.Ldarg_1);
ilgenObjGetter.Emit(OpCodes.Ldc_I4, field.getOffset()); ilgenObjGetter.Emit(OpCodes.Ldc_I4, field.getOffset());
ilgenObjGetter.Emit(OpCodes.Ldarg_0); ilgenObjGetter.Emit(OpCodes.Ldloc, objGetterThis);
fw.EmitGet(ilgenObjGetter); fw.EmitGet(ilgenObjGetter);
fw.FieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgenObjGetter); fw.FieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgenObjGetter);
ilgenObjGetter.Emit(OpCodes.Stelem_Ref); ilgenObjGetter.Emit(OpCodes.Stelem_Ref);