Skip to content

Commit c8bb44e

Browse files
authored
Improvements in SimpleDataBinder (#12606) (#12621)
1 parent 6730aa8 commit c8bb44e

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

grails-databinding/src/main/groovy/grails/databinding/SimpleDataBinder.groovy

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import java.lang.annotation.Annotation
3333
import java.lang.reflect.Array
3434
import java.lang.reflect.Field
3535
import java.lang.reflect.ParameterizedType
36+
import java.security.ProtectionDomain
3637

3738
/**
3839
* A data binder that will bind nested Maps to an object.
@@ -220,7 +221,7 @@ class SimpleDataBinder implements DataBinder {
220221
def metaProperty = obj.metaClass.getMetaProperty propName
221222

222223
if (metaProperty) { // normal property
223-
if (isOkToBind(metaProperty.name, whiteList, blackList)) {
224+
if (isOkToBind(metaProperty, whiteList, blackList)) {
224225
def val = source[key]
225226
try {
226227
def converter = getValueConverter(obj, metaProperty.name)
@@ -237,15 +238,15 @@ class SimpleDataBinder implements DataBinder {
237238
def descriptor = getIndexedPropertyReferenceDescriptor propName
238239
if (descriptor) { // indexed property
239240
metaProperty = obj.metaClass.getMetaProperty descriptor.propertyName
240-
if (metaProperty && isOkToBind(metaProperty.name, whiteList, blackList)) {
241+
if (metaProperty && isOkToBind(metaProperty, whiteList, blackList)) {
241242
def val = source.getPropertyValue key
242243
processIndexedProperty obj, metaProperty, descriptor, val, source, listener, errors
243244
}
244245
} else if (propName.startsWith('_') && propName.length() > 1) { // boolean special handling
245246
def restOfPropertyName = propName[1..-1]
246247
if (!source.containsProperty(restOfPropertyName)) {
247248
metaProperty = obj.metaClass.getMetaProperty restOfPropertyName
248-
if (metaProperty && isOkToBind(restOfPropertyName, whiteList, blackList)) {
249+
if (metaProperty && isOkToBind(metaProperty, whiteList, blackList)) {
249250
if ((Boolean == metaProperty.type || Boolean.TYPE == metaProperty.type)) {
250251
bindProperty obj, source, metaProperty, false, listener, errors
251252
}
@@ -257,8 +258,12 @@ class SimpleDataBinder implements DataBinder {
257258
}
258259
}
259260

260-
protected isOkToBind(String propName, List whiteList, List blackList) {
261-
'metaClass' != propName && !blackList?.contains(propName) && (!whiteList || whiteList.contains(propName) || whiteList.find { it -> it?.toString()?.startsWith(propName + '.')})
261+
protected boolean isOkToBind(String propName, List whiteList, List blackList) {
262+
'class' != propName && 'classLoader' != propName && 'protectionDomain' != propName && 'metaClass' != propName && !blackList?.contains(propName) && (!whiteList || whiteList.contains(propName) || whiteList.find { it -> it?.toString()?.startsWith(propName + '.')})
263+
}
264+
265+
protected boolean isOkToBind(MetaProperty property, List whitelist, List blacklist) {
266+
isOkToBind(property.name, whitelist, blacklist) && (property.type != null && !(ClassLoader.class.isAssignableFrom(property.type) || ProtectionDomain.class.isAssignableFrom(property.type)))
262267
}
263268

264269
protected IndexedPropertyReferenceDescriptor getIndexedPropertyReferenceDescriptor(propName) {

0 commit comments

Comments
 (0)