[Libguestfs] [PATCH 3/6] mllib: add duplicate fields check to Ini_reader.read_ini

Pino Toscano ptoscano at redhat.com
Wed Jul 8 14:42:15 UTC 2015


Move the existing check from Index_parser in virt-builder, so it can be
used also in other contexts (the Source reader, for example, which
currently does not do any duplicate check).
---
 builder/index_parser.ml | 22 ++--------------------
 builder/sources.ml      |  3 ++-
 mllib/ini_reader.ml     | 35 ++++++++++++++++++++++++++++++++---
 mllib/ini_reader.mli    |  2 +-
 4 files changed, 37 insertions(+), 25 deletions(-)

diff --git a/builder/index_parser.ml b/builder/index_parser.ml
index 219003a..fad0781 100644
--- a/builder/index_parser.ml
+++ b/builder/index_parser.ml
@@ -127,7 +127,8 @@ let get_index ~downloader ~sigchecker
     Sigchecker.verify sigchecker tmpfile;
 
     (* Try parsing the file. *)
-    let sections = Ini_reader.read_ini ~real_uri:uri tmpfile in
+    let sections = Ini_reader.read_ini ~check_duplicated_fields:true
+                     ~real_uri:uri tmpfile in
     if delete_tmpfile then
       (try Unix.unlink tmpfile with _ -> ());
 
@@ -152,25 +153,6 @@ let get_index ~downloader ~sigchecker
         Hashtbl.add nseen id true
     ) name_arch_map;
 
-    (* Check for repeated fields. *)
-    List.iter (
-      fun (n, fields) ->
-        let fseen = Hashtbl.create 13 in
-        List.iter (
-          fun (field, subkey, _) ->
-            let hashkey = (field, subkey) in
-            if Hashtbl.mem fseen hashkey then (
-              (match subkey with
-              | Some value ->
-                eprintf (f_"%s: index is corrupt: %s: field '%s[%s]' appears two or more times\n") prog n field value
-              | None ->
-                eprintf (f_"%s: index is corrupt: %s: field '%s' appears two or more times\n") prog n field);
-              corrupt_file ()
-            );
-            Hashtbl.add fseen hashkey true
-        ) fields
-    ) sections;
-
     (* Turn the sections into the final index. *)
     let entries =
       List.map (
diff --git a/builder/sources.ml b/builder/sources.ml
index b774762..7cd522c 100644
--- a/builder/sources.ml
+++ b/builder/sources.ml
@@ -35,7 +35,8 @@ let parse_conf file =
   if verbose () then (
     printf (f_"%s: trying to read %s\n") prog file;
   );
-  let sections = Ini_reader.read_ini ~error_suffix:"[ignored]" file in
+  let sections = Ini_reader.read_ini ~error_suffix:"[ignored]"
+                   ~check_duplicated_fields:true file in
 
   let sources = List.fold_right (
     fun (n, fields) acc ->
diff --git a/mllib/ini_reader.ml b/mllib/ini_reader.ml
index 6d1d347..ea3bbda 100644
--- a/mllib/ini_reader.ml
+++ b/mllib/ini_reader.ml
@@ -16,6 +16,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *)
 
+open Common_gettext.Gettext
 open Common_utils
 
 type sections = section list
@@ -31,10 +32,38 @@ and c_fields = field array
 (* Calls yyparse in the C code. *)
 external parse_index : prog:string -> error_suffix:string -> string -> c_sections = "virt_builder_parse_index"
 
-let read_ini ?(error_suffix = "") ?real_uri file =
+let read_ini ?(error_suffix = "") ?real_uri
+  ?(check_duplicated_fields = false) file =
   let sections = parse_index ~prog ~error_suffix file in
   let sections = Array.to_list sections in
-  List.map (
+  let sections = List.map (
     fun (n, fields) ->
       n, Array.to_list fields
-  ) sections
+  ) sections in
+
+  let uri =
+    match real_uri with
+    | None -> file
+    | Some uri -> uri in
+
+  (* Check for repeated fields. *)
+  if check_duplicated_fields then (
+    List.iter (
+      fun (n, fields) ->
+        let fseen = Hashtbl.create 13 in
+        List.iter (
+          fun (field, subkey, _) ->
+            let hashkey = (field, subkey) in
+            if Hashtbl.mem fseen hashkey then (
+              match subkey with
+              | Some value ->
+                error (f_"%s is corrupt: %s: field '%s[%s]' appears two or more times") uri n field value
+              | None ->
+                error (f_"%s is corrupt: %s: field '%s' appears two or more times") uri n field
+            );
+            Hashtbl.add fseen hashkey true
+        ) fields
+    ) sections
+  );
+
+  sections
diff --git a/mllib/ini_reader.mli b/mllib/ini_reader.mli
index 7005e62..ceda015 100644
--- a/mllib/ini_reader.mli
+++ b/mllib/ini_reader.mli
@@ -21,4 +21,4 @@ and section = string * fields                (* [name] + fields *)
 and fields = field list
 and field = string * string option * string  (* key + subkey + value *)
 
-val read_ini : ?error_suffix:string -> ?real_uri:string -> string -> sections
+val read_ini : ?error_suffix:string -> ?real_uri:string -> ?check_duplicated_fields:bool -> string -> sections
-- 
2.1.0




More information about the Libguestfs mailing list