[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen staging] libxl: gentypes: initialise array elements in json



commit 0273d8e24249d14f5964f6b2193a53a1fb99ce9e
Author:     Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx>
AuthorDate: Mon Oct 28 18:22:16 2019 +0000
Commit:     Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
CommitDate: Tue Nov 19 16:44:33 2019 +0000

    libxl: gentypes: initialise array elements in json
    
    Currently, array elements are initialized with calloc.  Which means
    initialize all element fields with zero values.  If an entry is not
    present in the json (which is entirely permitted), the element will be
    all-bits-zero instead of the default value (which is wrong).
    
    The fix is to initalise each array element before parsing it, using
    the new libxl_C_type_do_init function.
    
    With existing types this results in a lot of new calls like this:
    
          for (i=0; (t=libxl__json_array_get(x,i)); i++) {
     +            libxl_sched_params_init(&p->vcpus[i]);
                  rc = libxl__sched_params_parse_json(gc, t, &p->vcpus[i]);
    
    (indentation adjusted).  This looks right.  To check what happens with
    types which have nontrivial defaults but don't have init functions (of
    which we currently have none in arrays), I (Ian) experimentally added:
    
          ("pnode", uint32), # physical node of this node
          ("vcpus", libxl_bitmap), # vcpus in this node
     +    ("sporks", Array(MemKB, "num_sporks")),
          ])
    
    The result was this:
    
              for (i=0; (t=libxl__json_array_get(x,i)); i++) {
     +                p->sporks[i] = LIBXL_MEMKB_DEFAULT;
                      rc = libxl__uint64_parse_json(gc, t, &p->sporks[i]);
    
    where the context was added by adding "sporks" and "+" indicates a
    line added by this patch, "initialise array elements in json".
    
    Signed-off-by: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx>
    Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
    Release-acked-by: Juergen Gross <jgross@xxxxxxxx>
    ---
    v2 [iwj]: Use libxl_C_type_do_init.
              Reword commit message and discuss spork testing.
---
 tools/libxl/gentypes.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py
index 124285cd66..9a45e45acc 100644
--- a/tools/libxl/gentypes.py
+++ b/tools/libxl/gentypes.py
@@ -461,6 +461,10 @@ def libxl_C_type_parse_json(ty, w, v, indent = "    ", 
parent = None, discrimina
         s += "        goto out;\n"
         s += "    }\n"
         s += "    for (i=0; (t=libxl__json_array_get(x,i)); i++) {\n"
+        s += libxl_C_type_do_init(ty.elem_type,
+                    lambda by: ("&" if by == idl.PASS_BY_REFERENCE else "")+
+                               ("%s[i]" % v),
+                                  need_zero=False, indent=indent+"    ")
         s += libxl_C_type_parse_json(ty.elem_type, "t", v+"[i]",
                                      indent + "    ", parent)
         s += "    }\n"
--
generated by git-patchbot for /home/xen/git/xen.git#staging

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.