603         // check that the Class of the Permission key and value are the 
same
 604         for (Map.Entry<Permission, Permission> e : perms.entrySet()) {
 605             Permission k = e.getKey();
 606             Permission v = e.getValue();
 607             if (!(k.getClass().equals(v.getClass()))) {
 608                 throw new InvalidObjectException("Permission with " +
 609                     k.getClass() + " incorrectly mapped to Permission with 
" +
 610                     v.getClass());
 611             }
 612         }

Why not check k == v? If they were the same object at serialization, then the 
deserialization process should be able to assign the same object to them.

--Max



> On Apr 6, 2019, at 1:30 AM, Sean Mullan <sean.mul...@oracle.com> wrote:
> 
> Updated webrev: http://cr.openjdk.java.net/~mullan/webrevs/8020637/webrev.01/
> 
> The serialized streams are now encoded within the test code itself. I also 
> added a test case for an PermissionsHash object with invalid mappings.
> 
> I also modified the fix. Instead of trying to fix the mappings in the encoded 
> serialized form, readObject simply throws an InvalidObjectException. I 
> believe that is the more correct behavior, as the deserialized form no longer 
> adheres to the invariants of the serialized structures of the corresponding 
> classes.
> 
> Thanks,
> Sean
> 
> On 4/2/19 10:03 AM, Weijun Wang wrote:
>> +1.
>> --Max
>>> On Apr 2, 2019, at 9:55 PM, Roger Riggs <roger.ri...@oracle.com> wrote:
>>> 
>>> Hi Sean,
>>> 
>>> Typically, fixed serialization streams are encoded in the source
>>> as byte arrays. That keeps binary content out of the repo
>>> and provides a place for the comments.
>>> 
>>> Roger
>>> 
>>> 
>>> On 04/02/2019 09:50 AM, Sean Mullan wrote:
>>>> On 4/2/19 9:44 AM, Weijun Wang wrote:
>>>>> 
>>>>> 
>>>>>> On Apr 2, 2019, at 9:33 PM, Sean Mullan <sean.mul...@oracle.com> wrote:
>>>>>> 
>>>>>> On 4/1/19 11:12 PM, Weijun Wang wrote:
>>>>>>> I can understand the change in Permissions, but is there any difference 
>>>>>>> in PermissionsHash?
>>>>>> 
>>>>>> The key and value in the PermissionsHash map is always the same object. 
>>>>>> This fix ensures that is respected, otherwise after deserialization you 
>>>>>> could have a SocketPermission mapped to a FilePermission, for example. 
>>>>>> Would it be better if I added a test for that?
>>>>> 
>>>>> Yes, you are right. I thought the old code can also enforce this relation.
>>>>> 
>>>>> Now for the test, perms.ser is binary and you haven't described how it is 
>>>>> generated.
>>>> 
>>>> I just hacked Permissions.writeObject to switch the mappings. That was a 
>>>> lot easier than trying to write my own serialization code. I will add some 
>>>> comments in the test explaining how I did that and what is in perms.ser.
>>>> 
>>>> --Sean
>>>> 
>>>> 
>>>>> 
>>>>> Thanks,
>>>>> Max
>>>>> 
>>>>>> 
>>>>>> --Sean
>>>>>> 
>>>>>>> --Max
>>>>>>>> On Apr 2, 2019, at 1:10 AM, Sean Mullan <sean.mul...@oracle.com> wrote:
>>>>>>>> 
>>>>>>>> It is currently possible to change the mappings in a serialized 
>>>>>>>> java.security.Permissions object such that they no longer map 
>>>>>>>> correctly, and Permissions.readObject won't detect this.
>>>>>>>> 
>>>>>>>> This change makes sure that for a deserialized Permissions object, the 
>>>>>>>> permissions are mapped correctly to the class that they belong to. It 
>>>>>>>> does this by calling add() again for each permission in the 
>>>>>>>> deserialized Permissions object. The same technique was applied to a 
>>>>>>>> serialized PermissionsHash object which is used to store Permissions 
>>>>>>>> that don't implement their own PermissionCollection.
>>>>>>>> 
>>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8020637
>>>>>>>> webrev: http://cr.openjdk.java.net/~mullan/webrevs/8020637/webrev.00/
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> Sean
>>>>>>>> 
>>>>> 
>>> 

Reply via email to