Richard W.M. Jones
2015-Oct-08 19:15 UTC
[Libguestfs] [PATCH] v2v: Add xpath_int64 functions, and use them to read memory values.
On 32 bit platforms, reading the memory values can cause some numbers
to be read as negative numbers. Fix this by treating memory values as
64 bit integers throughout the parsing and calculation.
---
v2v/input_libvirtxml.ml | 7 ++++---
v2v/input_ova.ml | 7 ++++---
v2v/utils.ml | 15 +++++++++++++++
3 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml
index 976848f..d8c6215 100644
--- a/v2v/input_libvirtxml.ml
+++ b/v2v/input_libvirtxml.ml
@@ -54,7 +54,8 @@ let parse_libvirt_xml ?conn xml let xpathctx =
Xml.xpath_new_context doc in
let xpath_string = xpath_string xpathctx
and xpath_int = xpath_int xpathctx
- and xpath_int_default = xpath_int_default xpathctx in
+ and xpath_int_default = xpath_int_default xpathctx
+ and xpath_int64_default = xpath_int64_default xpathctx in
let hypervisor match xpath_string "/domain/@type" with
@@ -66,8 +67,8 @@ let parse_libvirt_xml ?conn xml | None | Some
"" ->
error (f_"in the libvirt XML metadata, <name> is missing or
empty")
| Some s -> s in
- let memory = xpath_int_default "/domain/memory/text()" (1024 *
1024) in
- let memory = Int64.of_int memory *^ 1024L in
+ let memory = xpath_int64_default "/domain/memory/text()" (1024L *^
1024L) in
+ let memory = memory *^ 1024L in
let vcpu = xpath_int_default "/domain/vcpu/text()" 1 in
let features diff --git a/v2v/input_ova.ml b/v2v/input_ova.ml
index a758e94..cd26160 100644
--- a/v2v/input_ova.ml
+++ b/v2v/input_ova.ml
@@ -183,7 +183,8 @@ object
let xpath_string = xpath_string xpathctx
and xpath_int = xpath_int xpathctx
and xpath_string_default = xpath_string_default xpathctx
- and xpath_int_default = xpath_int_default xpathctx in
+ and xpath_int_default = xpath_int_default xpathctx
+ and xpath_int64_default = xpath_int64_default xpathctx in
(* Search for vm name. *)
let name @@ -193,8 +194,8 @@ object
| Some name -> name in
(* Search for memory. *)
- let memory = xpath_int_default
"/ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item[rasd:ResourceType/text()=4]/rasd:VirtualQuantity/text()"
(1024 * 1024) in
- let memory = Int64.of_int (memory * 1024 * 1024) in
+ let memory = xpath_int64_default
"/ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item[rasd:ResourceType/text()=4]/rasd:VirtualQuantity/text()"
(1024L *^ 1024L) in
+ let memory = memory *^ 1024L *^ 1024L in
(* Search for number of vCPUs. *)
let vcpu = xpath_int_default
"/ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/ovf:Item[rasd:ResourceType/text()=3]/rasd:VirtualQuantity/text()"
1 in
diff --git a/v2v/utils.ml b/v2v/utils.ml
index ee956be..2998d90 100644
--- a/v2v/utils.ml
+++ b/v2v/utils.ml
@@ -79,6 +79,17 @@ let xpath_int xpathctx expr error (f_"expecting
XML expression to return an integer (expression: %s, matching string: %s)")
expr str
)
+let xpath_int64 xpathctx expr + let obj = Xml.xpath_eval_expression xpathctx
expr in
+ if Xml.xpathobj_nr_nodes obj < 1 then None
+ else (
+ let node = Xml.xpathobj_node obj 0 in
+ let str = Xml.node_as_string node in
+ try Some (Int64.of_string str)
+ with Failure "int_of_string" ->
+ error (f_"expecting XML expression to return an integer (expression:
%s, matching string: %s)")
+ expr str
+ )
(* Parse an xpath expression and return a string/int; if the expression
* doesn't match, return the default.
@@ -91,6 +102,10 @@ let xpath_int_default xpathctx expr default match
xpath_int xpathctx expr with
| None -> default
| Some i -> i
+let xpath_int64_default xpathctx expr default + match xpath_int64 xpathctx
expr with
+ | None -> default
+ | Some i -> i
external drive_name : int -> string = "v2v_utils_drive_name"
external drive_index : string -> int = "v2v_utils_drive_index"
--
2.5.0
Seemingly Similar Threads
- [PATCH v2 4/4] common/mltools: xpath_helpers: Get rid of xpath_*_default functions.
- [PATCH 2/2] v2v: -i ova: Factor out the OVF parsing into a separate module.
- [PATCH v2] v2v: -i libvirt: If <vcpu> is missing, calculate it from CPU topology.
- Re: [PATCH v2] v2v: -i libvirt: If <vcpu> is missing, calculate it from CPU topology.
- [PATCH] v2v: -i libvirt: If <vcpu> is missing, calculate it from CPU topology.
