@@ -34,6 +34,7 @@ import java.lang.reflect.Array
3434import java.lang.reflect.Field
3535import java.lang.reflect.Modifier
3636import java.lang.reflect.ParameterizedType
37+ import java.security.ProtectionDomain
3738
3839/**
3940 * A data binder that will bind nested Maps to an object.
@@ -221,7 +222,7 @@ class SimpleDataBinder implements DataBinder {
221222 def metaProperty = obj. metaClass. getMetaProperty propName
222223
223224 if (metaProperty) { // normal property
224- if (isOkToBind(metaProperty. name , whiteList, blackList)) {
225+ if (isOkToBind(metaProperty, whiteList, blackList)) {
225226 def val = source[key]
226227 try {
227228 def converter = getValueConverter(obj, metaProperty. name)
@@ -238,15 +239,15 @@ class SimpleDataBinder implements DataBinder {
238239 def descriptor = getIndexedPropertyReferenceDescriptor propName
239240 if (descriptor) { // indexed property
240241 metaProperty = obj. metaClass. getMetaProperty descriptor. propertyName
241- if (metaProperty && isOkToBind(metaProperty. name , whiteList, blackList)) {
242+ if (metaProperty && isOkToBind(metaProperty, whiteList, blackList)) {
242243 def val = source. getPropertyValue key
243244 processIndexedProperty obj, metaProperty, descriptor, val, source, listener, errors
244245 }
245246 } else if (propName. startsWith(' _' ) && propName. length() > 1 ) { // boolean special handling
246247 def restOfPropertyName = propName[1 .. -1 ]
247248 if (! source. containsProperty(restOfPropertyName)) {
248249 metaProperty = obj. metaClass. getMetaProperty restOfPropertyName
249- if (metaProperty && isOkToBind(restOfPropertyName , whiteList, blackList)) {
250+ if (metaProperty && isOkToBind(metaProperty , whiteList, blackList)) {
250251 if ((Boolean == metaProperty. type || Boolean . TYPE == metaProperty. type)) {
251252 bindProperty obj, source, metaProperty, false , listener, errors
252253 }
@@ -258,8 +259,12 @@ class SimpleDataBinder implements DataBinder {
258259 }
259260 }
260261
261- protected isOkToBind (String propName , List whiteList , List blackList ) {
262- ' metaClass' != propName && ! blackList?. contains(propName) && (! whiteList || whiteList. contains(propName) || whiteList. find { it -> it?. toString()?. startsWith(propName + ' .' )})
262+ protected boolean isOkToBind (String propName , List whiteList , List blackList ) {
263+ ' class' != propName && ' classLoader' != propName && ' protectionDomain' != propName && ' metaClass' != propName && ! blackList?. contains(propName) && (! whiteList || whiteList. contains(propName) || whiteList. find { it -> it?. toString()?. startsWith(propName + ' .' )})
264+ }
265+
266+ protected boolean isOkToBind (MetaProperty property , List whitelist , List blacklist ) {
267+ isOkToBind(property. name, whitelist, blacklist) && (property. type != null && ! (ClassLoader . class. isAssignableFrom(property. type) || ProtectionDomain . class. isAssignableFrom(property. type)))
263268 }
264269
265270 protected IndexedPropertyReferenceDescriptor getIndexedPropertyReferenceDescriptor (propName ) {
0 commit comments