From: Luyao Huang <lhu...@redhat.com>

When pass None or a empty dictionary to time, it will report
error. This commit allows a one-element dictionary which contains
just 'seconds' field, which results in the same as passing 0 for
'nseconds' field. Moreover, dict is checked for unknown fields.

Signed-off-by: Luyao Huang <lhu...@redhat.com>
Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
---
 libvirt-override-virDomain.py |  4 ++--
 libvirt-override.c            | 39 +++++++++++++++++++++++----------------
 2 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/libvirt-override-virDomain.py b/libvirt-override-virDomain.py
index a50ec0d..fa5f75f 100644
--- a/libvirt-override-virDomain.py
+++ b/libvirt-override-virDomain.py
@@ -67,8 +67,8 @@
         return ret
 
     def setTime(self, time=None, flags=0):
-        """Set guest time to the given value. @time is a dict conatining
-        'seconds' field for seconds and 'nseconds' field for nanosecons """
+        """Set guest time to the given value. @time is a dict containing
+        'seconds' field for seconds and 'nseconds' field for nanoseconds """
         ret = libvirtmod.virDomainSetTime(self._o, time, flags)
         if ret == -1: raise libvirtError ('virDomainSetTime() failed', 
dom=self)
         return ret
diff --git a/libvirt-override.c b/libvirt-override.c
index c01e52f..57f0ccf 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -7785,12 +7785,14 @@ static PyObject *
 libvirt_virDomainSetTime(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
     PyObject *py_retval = NULL;
     PyObject *pyobj_domain;
+    PyObject *pyobj_seconds;
+    PyObject *pyobj_nseconds;
     PyObject *py_dict;
     virDomainPtr domain;
     long long seconds = 0;
     unsigned int nseconds = 0;
     unsigned int flags;
-    ssize_t py_dict_size;
+    ssize_t py_dict_size = 0;
     int c_retval;
 
     if (!PyArg_ParseTuple(args, (char*)"OOI:virDomainSetTime",
@@ -7798,26 +7800,31 @@ libvirt_virDomainSetTime(PyObject *self 
ATTRIBUTE_UNUSED, PyObject *args) {
         return NULL;
     domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
 
-    py_dict_size = PyDict_Size(py_dict);
-
-    if (py_dict_size == 2) {
-        PyObject *pyobj_seconds, *pyobj_nseconds;
-
-        if (!(pyobj_seconds = PyDict_GetItemString(py_dict, "seconds")) ||
-            (libvirt_longlongUnwrap(pyobj_seconds, &seconds) < 0)) {
-            PyErr_Format(PyExc_LookupError, "malformed or missing 'seconds'");
+    if (PyDict_Check(py_dict)) {
+        py_dict_size = PyDict_Size(py_dict);
+        if ((pyobj_seconds = PyDict_GetItemString(py_dict, "seconds"))) {
+            if (libvirt_longlongUnwrap(pyobj_seconds, &seconds) < 0) {
+                PyErr_Format(PyExc_LookupError, "malformed 'seconds'");
+                goto cleanup;
+            }
+        } else {
+            PyErr_Format(PyExc_LookupError, "Dictionary must contains 
'seconds'");
             goto cleanup;
         }
 
-        if (!(pyobj_nseconds = PyDict_GetItemString(py_dict, "nseconds")) ||
-            (libvirt_uintUnwrap(pyobj_nseconds, &nseconds) < 0)) {
-            PyErr_Format(PyExc_LookupError, "malformed or missing 'nseconds'");
+        if ((pyobj_nseconds = PyDict_GetItemString(py_dict, "nseconds"))) {
+            if (libvirt_uintUnwrap(pyobj_nseconds, &nseconds) < 0) {
+                PyErr_Format(PyExc_LookupError, "malformed 'nseconds'");
+                goto cleanup;
+            }
+        } else if (py_dict_size > 1) {
+            PyErr_Format(PyExc_LookupError, "Dictionary contains unknown key");
             goto cleanup;
         }
-    } else if (py_dict_size > 0) {
-        PyErr_Format(PyExc_LookupError, "Dictionary must contain "
-                     "'seconds' and 'nseconds'");
-        goto cleanup;
+    } else if (py_dict != Py_None || !flags) {
+        PyErr_Format(PyExc_TypeError, "time must be a dictionary "
+                     "or None with flags set");
+        return NULL;
     }
 
     LIBVIRT_BEGIN_ALLOW_THREADS;
-- 
2.0.4

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to