From c25ed29baa321a72c5bdcb2054141d5d44f901ae Mon Sep 17 00:00:00 2001 From: John Estabrook Date: Fri, 18 Jul 2025 14:22:37 -0500 Subject: T7605: add string sanitization functions for direct load of config file It is necessary to escape single backslashes in config files before parsing. In order to restore single/multiple backslashes on render, the functions escape_backslash/unescape_backslash are used when parsing/rendering from the Python side; as we also want to load/save directly with vyconfd, add analogous functions to the library. --- src/config_file.ml | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/config_file.ml b/src/config_file.ml index d8dc8c9..abf08ef 100644 --- a/src/config_file.ml +++ b/src/config_file.ml @@ -1,3 +1,23 @@ + +let rx = + let p = + {|("[^"]*[\][^"]*"\n|'[^']*[\][^']*'\n)|} + in + Pcre2.regexp p + +let escape_backslash s = + let func s = + Pcre2.qreplace ~pat:{|\\|} ~templ:{|\\|} s + in + Pcre2.substitute ~rex:rx ~subst:func s + +let unescape_backslash s = + let defunc s = + Pcre2.qreplace ~pat:{|\\\\|} ~templ:{|\|} s + in + Pcre2.substitute ~rex:rx ~subst:defunc s + + (* strip commponent version string *) let strip_version s = let rex = Pcre2.regexp ~flags:[`MULTILINE;`DOTALL] "(^//.*)" in @@ -13,7 +33,7 @@ let load_config file = let () = close_in chan in let prep = strip_version s in let s = match prep with - | Ok s -> s + | Ok t -> escape_backslash t | Error msg -> raise (Sys_error msg) in let config = Parser.from_string s in @@ -33,7 +53,8 @@ let load_config file = let save_config ct file = try - let s = Config_tree.render_config ct in + let t = Config_tree.render_config ct in + let s = unescape_backslash t in let chan = open_out file in let () = output_string chan s in let () = close_out chan in -- cgit v1.2.3