Skip to content

Commit d3edcf2

Browse files
authored
Improvements in SimpleDataBinder (#12606)
1 parent 032dcad commit d3edcf2

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
@@ -34,6 +34,7 @@ import java.lang.reflect.Array
3434
import java.lang.reflect.Field
3535
import java.lang.reflect.Modifier
3636
import 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

Comments
 (0)