/patches/security/20130618/8008132-better_serialization.patch

https://bitbucket.org/Ringdingcoder/icedtea6 · Patch · 121 lines · 111 code · 10 blank · 0 comment · 0 complexity · 8260adb6d428ba7aa94cceeff72bd2db MD5 · raw file

  1. # HG changeset patch
  2. # User Severin Gehwolf <sgehwolf@redhat.com>
  3. # Date 1371476865 -7200
  4. # Node ID 5dd7618fd14c647d21d765fcc2431c9ee6289ae4
  5. # Parent 60c57caf0348c7eed93900e4395607af759e6ba9
  6. 8008132: Better serialization support
  7. Reviewed-by: alanb, hawtin
  8. diff --git a/src/share/classes/java/io/ObjectOutputStream.java b/src/share/classes/java/io/ObjectOutputStream.java
  9. --- openjdk/jdk/src/share/classes/java/io/ObjectOutputStream.java
  10. +++ openjdk/jdk/src/share/classes/java/io/ObjectOutputStream.java
  11. @@ -36,6 +36,7 @@
  12. import java.util.concurrent.ConcurrentMap;
  13. import static java.io.ObjectStreamClass.processQueue;
  14. import java.io.SerialCallbackContext;
  15. +import sun.reflect.misc.ReflectUtil;
  16. /**
  17. * An ObjectOutputStream writes primitive data types and graphs of Java objects
  18. @@ -1228,6 +1229,12 @@
  19. }
  20. }
  21. + private boolean isCustomSubclass() {
  22. + // Return true if this class is a custom subclass of ObjectOutputStream
  23. + return getClass().getClassLoader()
  24. + != ObjectOutputStream.class.getClassLoader();
  25. + }
  26. +
  27. /**
  28. * Writes class descriptor representing a dynamic proxy class to stream.
  29. */
  30. @@ -1245,6 +1252,9 @@
  31. }
  32. bout.setBlockDataMode(true);
  33. + if (isCustomSubclass()) {
  34. + ReflectUtil.checkPackageAccess(cl);
  35. + }
  36. annotateProxyClass(cl);
  37. bout.setBlockDataMode(false);
  38. bout.writeByte(TC_ENDBLOCKDATA);
  39. @@ -1271,6 +1281,9 @@
  40. Class cl = desc.forClass();
  41. bout.setBlockDataMode(true);
  42. + if (isCustomSubclass()) {
  43. + ReflectUtil.checkPackageAccess(cl);
  44. + }
  45. annotateClass(cl);
  46. bout.setBlockDataMode(false);
  47. bout.writeByte(TC_ENDBLOCKDATA);
  48. diff --git a/src/share/classes/java/io/ObjectStreamClass.java b/src/share/classes/java/io/ObjectStreamClass.java
  49. --- openjdk/jdk/src/share/classes/java/io/ObjectStreamClass.java
  50. +++ openjdk/jdk/src/share/classes/java/io/ObjectStreamClass.java
  51. @@ -50,6 +50,7 @@
  52. import java.util.concurrent.ConcurrentMap;
  53. import sun.misc.Unsafe;
  54. import sun.reflect.ReflectionFactory;
  55. +import sun.reflect.misc.ReflectUtil;
  56. /**
  57. * Serialization's descriptor for classes. It contains the name and
  58. @@ -234,6 +235,13 @@
  59. * @return the <code>Class</code> instance that this descriptor represents
  60. */
  61. public Class<?> forClass() {
  62. + if (cl == null) {
  63. + return null;
  64. + }
  65. + ClassLoader ccl = ObjectStreamField.getCallerClassLoader();
  66. + if (ReflectUtil.needsPackageAccessCheck(ccl, cl.getClassLoader())) {
  67. + ReflectUtil.checkPackageAccess(cl);
  68. + }
  69. return cl;
  70. }
  71. diff --git a/src/share/classes/java/io/ObjectStreamField.java b/src/share/classes/java/io/ObjectStreamField.java
  72. --- openjdk/jdk/src/share/classes/java/io/ObjectStreamField.java
  73. +++ openjdk/jdk/src/share/classes/java/io/ObjectStreamField.java
  74. @@ -26,6 +26,8 @@
  75. package java.io;
  76. import java.lang.reflect.Field;
  77. +import sun.reflect.Reflection;
  78. +import sun.reflect.misc.ReflectUtil;
  79. /**
  80. * A description of a Serializable field from a Serializable class. An array
  81. @@ -158,9 +160,31 @@
  82. * serializable field
  83. */
  84. public Class<?> getType() {
  85. + ClassLoader ccl = getCallerClassLoader();
  86. + if (ReflectUtil.needsPackageAccessCheck(ccl, type.getClassLoader())) {
  87. + ReflectUtil.checkPackageAccess(type);
  88. + }
  89. return type;
  90. }
  91. + // Returns the invoker's class loader.
  92. + // This is package private because it is accessed from ObjectStreamClass.
  93. + // NOTE: This must always be invoked when there is exactly one intervening
  94. + // frame from the core libraries on the stack between this method's
  95. + // invocation and the desired invoker. The frame count of 3 is determined
  96. + // as follows:
  97. + //
  98. + // 0: Reflection.getCallerClass
  99. + // 1: getCallerClassLoader()
  100. + // 2: ObjectStreamField.getType() or ObjectStreamClass.forClass()
  101. + // 3: the caller we want to check
  102. + //
  103. + // NOTE: copied from java.lang.ClassLoader and modified.
  104. + static ClassLoader getCallerClassLoader() {
  105. + Class caller = Reflection.getCallerClass(3);
  106. + return caller.getClassLoader();
  107. + }
  108. +
  109. /**
  110. * Returns character encoding of field type. The encoding is as follows:
  111. * <blockquote><pre>