From b0faec4de83ad315861ca322ede6d58fcd13bcc5 Mon Sep 17 00:00:00 2001 From: spiralvoice Date: Thu, 8 Apr 2010 19:01:34 +0000 Subject: [PATCH] patch #6959 - dcXmpEscape2.patch --- distrib/ChangeLog | 4 +++ src/networks/direct_connect/dcShared.ml | 14 +++------- src/utils/xml-light/xml.ml | 45 ++++++++++++++++----------------- src/utils/xml-light/xml.mli | 5 +++- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/distrib/ChangeLog b/distrib/ChangeLog index 3ddc838d..21d4e4df 100644 --- a/distrib/ChangeLog +++ b/distrib/ChangeLog @@ -14,6 +14,10 @@ http://mldonkey.sourceforge.net/Windows#MinGW_Installation ChangeLog ========= +2010/04/08 +6959: DC: Fix invalid XML (ygrek) +- enhanced patch (use Xml.escape and properly escape attributes in Xml.to_string) + 2010/04/04 7153: BT: correctly handle failed tracker requests (ygrek) 7155: DC: understand hublist.xml (ygrek) diff --git a/src/networks/direct_connect/dcShared.ml b/src/networks/direct_connect/dcShared.ml index eb4ebafc..fa37b140 100644 --- a/src/networks/direct_connect/dcShared.ml +++ b/src/networks/direct_connect/dcShared.ml @@ -79,28 +79,22 @@ let make_mylist () = let make_xml_mylist () = let buf = Buffer.create 1000 in Printf.bprintf buf "\r\n"; - Printf.bprintf buf "\r\n" Autoconf.current_version; + Printf.bprintf buf "\r\n" (Xml.escape Autoconf.current_version); let rec iter ntabs node = let dirname = node.shared_dirname in let ntabs = if dirname = "" then ntabs else begin buf_tabs buf ntabs; let dir = dirname in - (* Escape some special XML characters that may appear in the dirname *) - let dir = Str.global_replace (Str.regexp "'") "'" dir in - let dir = Str.global_replace (Str.regexp "&") "&" dir in - Printf.bprintf buf "\r\n" dir; + Printf.bprintf buf "\r\n" (Xml.escape dir); ntabs+1 end in List.iter (fun dcsh -> buf_tabs buf ntabs; let fname = Filename2.basename dcsh.dc_shared_codedname in - (* Escape some special XML characters that may appear in the filename *) - let fname = Str.global_replace (Str.regexp "'") "'" fname in - let fname = Str.global_replace (Str.regexp "&") "&" fname in - Printf.bprintf buf "\r\n" fname - dcsh.dc_shared_size dcsh.dc_shared_tiger_root + Printf.bprintf buf "\r\n" (Xml.escape fname) + dcsh.dc_shared_size (Xml.escape dcsh.dc_shared_tiger_root) ) node.shared_files; List.iter (fun (_, node) -> iter ntabs node; diff --git a/src/utils/xml-light/xml.ml b/src/utils/xml-light/xml.ml index f17acc76..92e1be83 100644 --- a/src/utils/xml-light/xml.ml +++ b/src/utils/xml-light/xml.ml @@ -125,35 +125,34 @@ let fold f v = function | Element (_,_,clist) -> List.fold_left f v clist | x -> raise (Not_element x) -let tmp = Buffer.create 200 - -let buffer_pcdata text = +let buffer_escape b text = let l = String.length text in for p = 0 to l-1 do match text.[p] with - | '>' -> Buffer.add_string tmp ">" - | '<' -> Buffer.add_string tmp "<" - | '&' -> - if p < l-1 && text.[p+1] = '#' then - Buffer.add_char tmp '&' - else - Buffer.add_string tmp "&" - | '\'' -> Buffer.add_string tmp "'" - | '"' -> Buffer.add_string tmp """ - | c -> Buffer.add_char tmp c + | '>' -> Buffer.add_string b ">" + | '<' -> Buffer.add_string b "<" + | '&' -> Buffer.add_string b "&" + | '\'' -> Buffer.add_string b "'" + | '"' -> Buffer.add_string b """ + | '\x0A' -> Buffer.add_string b " " + | '\x0D' -> Buffer.add_string b " " + | c -> Buffer.add_char b c done - + +let escape s = + let b = Buffer.create (String.length s) in + buffer_escape b s; + Buffer.contents b + +let tmp = Buffer.create 200 + +let buffer_pcdata = buffer_escape tmp + let buffer_attr (n,v) = Buffer.add_char tmp ' '; Buffer.add_string tmp n; Buffer.add_string tmp "=\""; - let l = String.length v in - for p = 0 to l-1 do - match v.[p] with - | '\\' -> Buffer.add_string tmp "\\\\" - | '"' -> Buffer.add_string tmp "\\\"" - | c -> Buffer.add_char tmp c - done; + buffer_pcdata v; Buffer.add_char tmp '"' let to_string x = @@ -238,8 +237,8 @@ let _ = (* local cast : Xml.error_pos -> error_pos *) (Obj.magic (pos p)))); Xml_dtd._raises (fun f -> File_not_found f) - + let xml_of xml = match xml with Element (a,b,c) -> a,b,c | _ -> failwith "Xml.xml_of: bad XML type" - \ No newline at end of file + diff --git a/src/utils/xml-light/xml.mli b/src/utils/xml-light/xml.mli index b2453292..de807f26 100644 --- a/src/utils/xml-light/xml.mli +++ b/src/utils/xml-light/xml.mli @@ -144,9 +144,12 @@ val fold : ('a -> xml -> 'a) -> 'a -> xml -> 'a any user-readable formating ). *) val to_string : xml -> string +(** Escape string as xml pcdata *) +val escape : string -> string + (** Print the xml data structure into an user-readable string with tabs and lines break between different nodes. *) val to_string_fmt : xml -> string val xml_of : xml -> string * (string * string) list * xml list - \ No newline at end of file + -- 2.11.4.GIT