diff options
| author | John Estabrook <jestabro@vyos.io> | 2025-07-18 14:22:37 -0500 |
|---|---|---|
| committer | John Estabrook <jestabro@vyos.io> | 2025-07-18 18:31:31 -0500 |
| commit | c25ed29baa321a72c5bdcb2054141d5d44f901ae (patch) | |
| tree | f919ff4488a6b4a4ea6e67c5f3e1d82798599efd /src | |
| parent | 3ab1a758eb5a84e8997eecf074d584a44d1f945d (diff) | |
| download | vyos1x-config-c25ed29baa321a72c5bdcb2054141d5d44f901ae.tar.gz vyos1x-config-c25ed29baa321a72c5bdcb2054141d5d44f901ae.zip | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/config_file.ml | 25 |
1 files changed, 23 insertions, 2 deletions
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 |
