Add invalid argument checks for params and nparams to the public API
and remove the from the drivers (e.g. xend).

Add subset handling to libxl and test drivers.
---
 src/libvirt.c            |   24 ++++++++++++++++++------
 src/libxl/libxl_driver.c |    6 ++++--
 src/test/test_driver.c   |   27 +++++++++++++--------------
 src/xen/xen_hypervisor.c |    7 +++----
 src/xen/xend_internal.c  |    3 +--
 5 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/src/libvirt.c b/src/libvirt.c
index e8b5b80..2c2866e 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -5069,11 +5069,11 @@ error:
  * virDomainSetSchedulerParameters:
  * @domain: pointer to domain object
  * @params: pointer to scheduler parameter objects
- * @nparams: number of scheduler parameter
- *          (this value should be same or less than the returned value
+ * @nparams: number of scheduler parameter objects
+ *          (this value can be the same or less than the returned value
  *           nparams of virDomainGetSchedulerType)
  *
- * Change the scheduler parameters
+ * Change all or a subset or the scheduler parameters.
  *
  * Returns -1 in case of error, 0 in case of success.
  */
@@ -5092,6 +5092,12 @@ virDomainSetSchedulerParameters(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
+
+    if (params == NULL || nparams < 0) {
+        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        goto error;
+    }
+
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
@@ -5118,12 +5124,12 @@ error:
  * virDomainSetSchedulerParametersFlags:
  * @domain: pointer to domain object
  * @params: pointer to scheduler parameter objects
- * @nparams: number of scheduler parameter
- *          (this value should be same or less than the returned value
+ * @nparams: number of scheduler parameter objects
+ *          (this value can be the same or less than the returned value
  *           nparams of virDomainGetSchedulerType)
  * @flags: virDomainSchedParameterFlags
  *
- * Change the scheduler parameters
+ * Change a subset or all scheduler parameters.
  *
  * Returns -1 in case of error, 0 in case of success.
  */
@@ -5153,6 +5159,12 @@ virDomainSetSchedulerParametersFlags(virDomainPtr domain,
         virDispatchError(NULL);
         return -1;
     }
+
+    if (params == NULL || nparams < 0) {
+        virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__);
+        goto error;
+    }
+
     if (domain->conn->flags & VIR_CONNECT_RO) {
         virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
         goto error;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index b85c743..1d41e2d 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -2544,8 +2544,10 @@ libxlDomainSetSchedulerParameters(virDomainPtr dom, 
virSchedParameterPtr params,
         goto cleanup;
     }
 
-    if (nparams != XEN_SCHED_CREDIT_NPARAM) {
-        libxlError(VIR_ERR_INVALID_ARG, "%s", _("Invalid parameter count"));
+    if (libxl_sched_credit_domain_get(&priv->ctx, dom->id, &sc_info) != 0) {
+        libxlError(VIR_ERR_INTERNAL_ERROR,
+                   _("Failed to get scheduler parameters for domain '%d'"
+                     " with libxenlight"), dom->id);
         goto cleanup;
     }
 
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 4897081..69aeb29 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -2671,7 +2671,7 @@ static int testDomainSetSchedulerParams(virDomainPtr 
domain,
 {
     testConnPtr privconn = domain->conn->privateData;
     virDomainObjPtr privdom;
-    int ret = -1;
+    int ret = -1, i;
 
     testDriverLock(privconn);
     privdom = virDomainFindByName(&privconn->domains,
@@ -2683,20 +2683,19 @@ static int testDomainSetSchedulerParams(virDomainPtr 
domain,
         goto cleanup;
     }
 
-    if (nparams != 1) {
-        testError(VIR_ERR_INVALID_ARG, "nparams");
-        goto cleanup;
-    }
-    if (STRNEQ(params[0].field, "weight")) {
-        testError(VIR_ERR_INVALID_ARG, "field");
-        goto cleanup;
-    }
-    if (params[0].type != VIR_DOMAIN_SCHED_FIELD_UINT) {
-        testError(VIR_ERR_INVALID_ARG, "type");
-        goto cleanup;
+    for (i = 0; i < nparams; i++) {
+        if (STRNEQ(params[i].field, "weight")) {
+            testError(VIR_ERR_INVALID_ARG, "field");
+            goto cleanup;
+        }
+        if (params[i].type != VIR_DOMAIN_SCHED_FIELD_UINT) {
+            testError(VIR_ERR_INVALID_ARG, "type");
+            goto cleanup;
+        }
+        /* XXX */
+        /*privdom->weight = params[i].value.ui;*/
     }
-    /* XXX */
-    /*privdom->weight = params[0].value.ui;*/
+
     ret = 0;
 
 cleanup:
diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
index 8d579bc..253164e 100644
--- a/src/xen/xen_hypervisor.c
+++ b/src/xen/xen_hypervisor.c
@@ -1364,10 +1364,9 @@ xenHypervisorSetSchedulerParameters(virDomainPtr domain,
         return -1;
     }
 
-    if ((nparams == 0) || (params == NULL)) {
-        virXenErrorFunc(VIR_ERR_INVALID_ARG, __FUNCTION__,
-                        "Noparameters given", 0);
-        return(-1);
+    if (nparams == 0) {
+        /* nothing to do, exit early */
+        return 0;
     }
 
     priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index 0fa8042..1a3c3b4 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -3712,8 +3712,7 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain,
     int sched_nparam = 0;
     int ret = -1;
 
-    if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
-        || (params == NULL)) {
+    if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
         virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
         return (-1);
     }
-- 
1.7.0.4

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

Reply via email to