From 73ec289e151de1698b6e46292ce423895771f988 Mon Sep 17 00:00:00 2001 From: Marek Habersack Date: Tue, 15 May 2007 08:07:45 +0000 Subject: [PATCH] 2007-05-15 Marek Habersack * ConfigurationElement.cs: added value validation on deserialization from the config file. svn path=/trunk/mcs/; revision=77394 --- .../System.Configuration/ChangeLog | 5 ++++ .../ConfigurationElement.cs | 30 ++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/mcs/class/System.Configuration/System.Configuration/ChangeLog b/mcs/class/System.Configuration/System.Configuration/ChangeLog index 2d59de6392a..deb4492a1b5 100644 --- a/mcs/class/System.Configuration/System.Configuration/ChangeLog +++ b/mcs/class/System.Configuration/System.Configuration/ChangeLog @@ -1,3 +1,8 @@ +2007-05-15 Marek Habersack + + * ConfigurationElement.cs: added value validation on + deserialization from the config file. + 2007-05-14 Igor Zelmanovich * ConfigurationElement.cs: when attribute value cannot be parsed, diff --git a/mcs/class/System.Configuration/System.Configuration/ConfigurationElement.cs b/mcs/class/System.Configuration/System.Configuration/ConfigurationElement.cs index 428d74d4211..6cfd5570f11 100644 --- a/mcs/class/System.Configuration/System.Configuration/ConfigurationElement.cs +++ b/mcs/class/System.Configuration/System.Configuration/ConfigurationElement.cs @@ -310,11 +310,17 @@ namespace System.Configuration if (readProps.ContainsKey (prop)) throw new ConfigurationException ("The attribute '" + prop.Name + "' may only appear once in this element."); - + + string value = null; try { - prop.SetStringValue (reader.Value); - } - catch (Exception ex) { + value = reader.Value; + ValidateValue (prop.Property, value); + prop.SetStringValue (value); + } catch (ConfigurationErrorsException) { + throw; + } catch (ConfigurationException) { + throw; + } catch (Exception ex) { string msg = String.Format ("The value of the property '{0}' cannot be parsed.", prop.Name); throw new ConfigurationErrorsException (msg, reader); } @@ -324,9 +330,7 @@ namespace System.Configuration reader.MoveToElement (); if (reader.IsEmptyElement) { reader.Skip (); - } - else { - + } else { int depth = reader.Depth; reader.ReadStartElement (); @@ -538,6 +542,18 @@ namespace System.Configuration PropertyInformation info = ElementInformation.Properties [propName]; return info != null && info.ValueOrigin == PropertyValueOrigin.SetHere; } + + void ValidateValue (ConfigurationProperty p, string value) + { + ConfigurationValidatorBase validator; + if (p == null || (validator = p.Validator) == null) + return; + + if (!validator.CanValidate (p.Type)) + throw new ConfigurationException ( + String.Format ("Validator does not support type {0}", p.Type)); + validator.Validate (p.ConvertFromString (value)); + } } internal class ElementMap -- 2.25.1