[erlang-bugs] bug_xmerl_invalid_attribute
Constantin Malikov
kostiamalikov@REDACTED
Thu Oct 31 05:01:15 CET 2013
Hello , friends. I want to tell you about a bug in Erlang:
I have a trouble with validating xml document by xsd schema in case of
one of the attribute have incorrect record in the xml document. I attached
simple sample, where you can see this problem. To run it, compile
xml_attribute_test.erl and invoke “invalid_xml_test” method.
You can see the error message:
_________________________________________________________________
** exception error: no function clause matching
xmerl_scan:scan_att_value("a>\n <rule>\n <result>\n <continue
context=\"ctx_megaco_local_in\"/>\n <!-- continue
context=\"ctx_megaco_local_in\"/ -->\n </result>\n </rule>\n</context>\n",
{xmerl_scanner,undefined,no,prolog,[],undefined,internal,
true,false,false,49173,false,false,
"/home/konstantin/erlang/tasks/diffR15B02/xml_invalid_attribute_test",
undefined,[],file_name_unknown,off,[],preserve,
#Fun<xmerl_scan.0.5757651>,#Fun<xmerl_scan.1.5757651>,
#Fun<xmerl_scan.2.5757651>,#Fun<xmerl_scan.3.5757651>,
#Fun<xmerl_scan.4.5757651>,#Fun<xmerl_scan.5.5757651>,
#Fun<xmerl_scan.6.5757651>,...},
'CDATA') (xmerl_scan.erl, line 2343)
in function xmerl_scan:scan_element/12 (xmerl_scan.erl, line 2147)
in call from xmerl_scan:scan_document/2 (xmerl_scan.erl, line 571)
in call from xmerl_scan:string/2 (xmerl_scan.erl, line 287)
in call from xml_attribute_test:read_xml/1 (xml_attribute_test.erl, line
13)
in call from xml_attribute_test:invalid_xml_test/0 (xml_attribute_test.erl,
line 17)
________________________________________________________________
How can i see, in the xmerl_scan.erl module, scan_att_value metod. No
function for processing incorrect attribute record.
Tested by Erlang 16B02, xmerl 1.3.4 and R15B02, xmerl 1.3.2.
_______________________ctx_megaco.xml____________________________
<? xml version = "1.0"?>
<context digit=a>
<rule>
<result>
<continue context="ctx_megaco_local_in"/>
<! - Continue context = "ctx_megaco_local_in" / ->
</ result>
</ rule>
</ context>
________________________________________________________________
_________________________ecss_routing.xsd__________________________
<? xml version = "1.0" encoding = "UTF- 8" ? >
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="context">
<xs:complexType>
<xs:sequence>
<xs:element name="rule">
<xs:complexType>
<xs:sequence>
<xs:element name="result">
<xs:complexType>
<xs:choice>
<xs:element name="incomplete" type="xs:string"/>
<! - xs: element name = "no_route" type = "nullType" /
->
<xs:element name="continue" type="continueType"/>
</ xs: choice>
</ xs: complexType>
</ xs: element>
</ xs: sequence>
</ xs: complexType>
</ xs: element>
</ xs: sequence>
</ xs: complexType>
</ xs: element>
<xs:complexType name="continueType">
<xs:attribute name="context" type="xs:string"/>
</ xs: complexType>
</ xs: schema>
________________________________________________________________
_______________________xml_attribute_test.erl__________________________
-module (xml_attribute_test).
-export ([
invalid_xml_test / 0
]).
read_xml (FileName) ->
{ok, Schema} = xmerl_xsd: process_schema ("ecss_routing.xsd"),
{ok, BXml} = file: read_file (FileName),
Xml = erlang: binary_to_list (BXml),
{XmerXml, _} = xmerl_scan: string (Xml),
xmerl_xsd: validate (XmerXml, Schema).
invalid_xml_test () ->
Result = read_xml ("ctx_megaco.xml"),
io: format ("~ p ~ n", [Result]).
________________________________________________________________
I can offer the option of a patch that fixes this problem. The person who
is responsible for supporting ssh has the discretion to take it as it is,
or can make own fix.
________________________________________________________________
--- xmerl-1.3.2/src/xmerl_scan.erl 2013-10-26 14:25:25.000000000
+++ xmerl-1.3.2.1/src/xmerl_scan.erl 2013-10-26 13:03:42.000000000
@@ -2373,13 +2373,16 @@
scan_att_value([H|T], S0,'CDATA'=AT) when H == $"; H == $' ->
?bump_col(1),
scan_att_chars(T, S, H, [],[], AT,false);
scan_att_value([H|T], S0,AttType) when H == $"; H == $' ->
?bump_col(1),
{T1,S1,IsNorm} = normalize(T,S,false),
- scan_att_chars(T1, S1, H, [],[], AttType,IsNorm).
+ scan_att_chars(T1, S1, H, [],[], AttType,IsNorm);
+%% EltexPatch: prevent function_clause exception
+scan_att_value([H|_], S0, _AttType) ->
+ ?fatal({unexpected_char, H}, S0).
scan_att_chars([],S=#xmerl_scanner{continuation_fun=F},H,Acc,TmpAcc,AT,IsNorm)->
?dbg("cont()...~n", []),
F(fun(MoreBytes, S1) ->
scan_att_chars(MoreBytes, S1, H, Acc,TmpAcc,AT,IsNorm)
end,
________________________________________________________________
With best regards,
Malikov Constantin, software developer, Eltex.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20131031/910479fa/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: xml_invalid_attribute.tar.gz
Type: application/x-gzip
Size: 28347 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20131031/910479fa/attachment.bin>
More information about the erlang-bugs
mailing list