Browse Source

* XML writer: reject characters in range #0-#31 (excluding #9,#10,#13) in text node and attribute contents. Resolves #20780.

git-svn-id: trunk@19792 -
sergei 13 years ago
parent
commit
631528a08b
1 changed files with 9 additions and 8 deletions
  1. 9 8
      packages/fcl-xml/src/xmlwrite.pp

+ 9 - 8
packages/fcl-xml/src/xmlwrite.pp

@@ -130,9 +130,9 @@ end;
   ---------------------------------------------------------------------}
   ---------------------------------------------------------------------}
 
 
 const
 const
-  AttrSpecialChars = ['<', '>', '"', '&', #9, #10, #13];
-  TextSpecialChars = ['<', '>', '&', #10, #13];
-  CDSectSpecialChars = [']'];
+  AttrSpecialChars = ['<', '>', '"', '&', #0..#$1F];
+  TextSpecialChars = ['<', '>', '&', #0..#8, #10..#$1F];
+  CDSectSpecialChars = [#0..#8, #11, #12, #14..#$1F, ']'];
   LineEndingChars = [#13, #10];
   LineEndingChars = [#13, #10];
   QuotStr = '&quot;';
   QuotStr = '&quot;';
   AmpStr = '&amp;';
   AmpStr = '&amp;';
@@ -323,7 +323,7 @@ begin
     #10: Sender.wrtStr('&#xA;');
     #10: Sender.wrtStr('&#xA;');
     #13: Sender.wrtStr('&#xD;');
     #13: Sender.wrtStr('&#xD;');
   else
   else
-    Sender.wrtChr(s[idx]);
+    raise EConvertError.Create('Illegal character');
   end;
   end;
 end;
 end;
 
 
@@ -344,7 +344,7 @@ begin
       end;
       end;
     #10: Sender.wrtStr(Sender.FLineBreak);
     #10: Sender.wrtStr(Sender.FLineBreak);
   else
   else
-    Sender.wrtChr(s[idx]);
+    raise EConvertError.Create('Illegal character');
   end;
   end;
 end;
 end;
 
 
@@ -355,9 +355,10 @@ begin
     '<': Sender.wrtStr(ltStr);
     '<': Sender.wrtStr(ltStr);
     '>': Sender.wrtStr(gtStr);
     '>': Sender.wrtStr(gtStr);
     '&': Sender.wrtStr(AmpStr);
     '&': Sender.wrtStr(AmpStr);
-    #13: Sender.wrtStr('&#xD;')
+    #13: Sender.wrtStr('&#xD;');
+    #10: Sender.wrtChr(#10);
   else
   else
-    Sender.wrtChr(s[idx]);
+    raise EConvertError.Create('Illegal character');
   end;
   end;
 end;
 end;
 
 
@@ -371,7 +372,7 @@ begin
     // TODO: emit warning 'cdata-section-splitted'
     // TODO: emit warning 'cdata-section-splitted'
   end
   end
   else
   else
-    Sender.wrtChr(s[idx]);
+    raise EConvertError.Create('Illegal character');
 end;
 end;
 
 
 const
 const